smalruby 0.0.18 → 0.0.19

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of smalruby might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45bc7ad1f92a68a0bc1eaee2aa49f19c4bf8ec61
4
- data.tar.gz: c88545a47e726b4c1cffbeaed9776bf538697103
3
+ metadata.gz: cba3ddc24f7ab06b5ea74040e8953236bbdcf20a
4
+ data.tar.gz: f6547d37b48a49e46e63cd7b39fd255a0676bdff
5
5
  SHA512:
6
- metadata.gz: 4f39b3118b85b581f98fa180efb497d1325bfdb70c0a5d960acada2047e6f53dd7ff6383cd61a4265c8ee9da4ef825dcef0e8657a1abb534c7ec32f632e7937e
7
- data.tar.gz: b364b8027a045d8fefd34074547cc10712c10efaa64eb16d7fab3e139469b28015673d383afa06bdadf20d23a5cae1f6620662ba675d89daea70a713f00993e5
6
+ metadata.gz: d7a6adc8c509559769f7bba5a5e1bdc2603b30cce107d0b371204fed69e3c2a89f6af8d0efbbf06b4311dc622031ccb8156db725f2e6f268f88c45226c4c06c8
7
+ data.tar.gz: 814c60608e78bffbe272cdd0b4b19fbd9eda5f997914191e1f68011cc0acb1f93603c0ab14f9649439f6407922637ee1f170125ae29400d8d420ebac336a8377
@@ -11,6 +11,10 @@ module Smalruby
11
11
  self.font_cache = {}
12
12
  font_cache.extend(Mutex_m)
13
13
 
14
+ cattr_accessor :sound_cache
15
+ self.sound_cache = {}
16
+ sound_cache.extend(Mutex_m)
17
+
14
18
  cattr_accessor :hardware_cache
15
19
  self.hardware_cache = {}
16
20
  hardware_cache.extend(Mutex_m)
@@ -19,6 +23,7 @@ module Smalruby
19
23
  attr_accessor :threads
20
24
  attr_accessor :checking_hit_targets
21
25
  attr_accessor :angle unless Util.windows?
26
+ attr_reader :rotation_style
22
27
 
23
28
  def initialize(option = {})
24
29
  defaults = {
@@ -40,6 +45,7 @@ module Smalruby
40
45
  @threads = []
41
46
  @checking_hit_targets = []
42
47
  @angle = 0 unless Util.windows?
48
+ @rotation_style = :free
43
49
 
44
50
  self.scale_x = 1.0
45
51
  self.scale_y = 1.0
@@ -55,6 +61,12 @@ module Smalruby
55
61
  rotate(opt[:angle])
56
62
  end
57
63
 
64
+ # HACK: Windows XP SP3の環境でワーカースレッドで音声を読み込めな
65
+ # い不具合が発生した。このためメインスレッドでプリロードしておく。
66
+ %w(do re mi fa so ra si do_2).each do |n|
67
+ new_sound("piano_#{n}.wav")
68
+ end
69
+
58
70
  World.instance.objects << self
59
71
  end
60
72
 
@@ -71,16 +83,32 @@ module Smalruby
71
83
  move(-val)
72
84
  end
73
85
 
74
- # 振り返る
86
+ # くるっと振り返る
75
87
  def turn
76
- @vector[:x] *= -1
77
- @vector[:y] *= -1
78
- self.scale_x *= -1
88
+ sync_angle(@vector[:x] * -1, @vector[:y] * -1)
89
+ end
90
+
91
+ # 横に振り返る
92
+ def turn_x
93
+ sync_angle(@vector[:x] * -1, @vector[:y])
94
+ end
95
+
96
+ # 縦に振り返る
97
+ def turn_y
98
+ sync_angle(@vector[:x], @vector[:y] * -1)
79
99
  end
80
100
 
81
101
  # もし端に着いたら、跳ね返る
82
102
  def turn_if_reach_wall
83
- turn if reach_wall?
103
+ lr = reach_left_or_right_wall?
104
+ tb = reach_top_or_bottom_wall?
105
+ if lr && tb
106
+ turn
107
+ elsif lr
108
+ turn_x
109
+ elsif tb
110
+ turn_y
111
+ end
84
112
  end
85
113
 
86
114
  # ( )度回転する
@@ -88,13 +116,38 @@ module Smalruby
88
116
  self.angle += angle
89
117
  end
90
118
 
119
+ def rotation_style=(val)
120
+ @rotation_style = val
121
+ sync_angle(@vector[:x], @vector[:y])
122
+ end
123
+
124
+ # 角度
125
+ def angle
126
+ return super if @rotation_style == :free
127
+
128
+ x, y = @vector[:x], @vector[:y]
129
+ a = Math.acos(x / Math.sqrt(x**2 + y**2)) * 180 / Math::PI
130
+ a = 360 - a if y < 0
131
+ a
132
+ end
133
+
91
134
  # ( )度に向ける
92
135
  def angle=(val)
93
136
  val %= 360
94
137
  radian = val * Math::PI / 180
95
- @vector[:x] = self.scale_x * Math.cos(radian)
96
- @vector[:y] = self.scale_x * Math.sin(radian)
97
- super(val)
138
+ @vector[:x] = Math.cos(radian)
139
+ @vector[:y] = Math.sin(radian)
140
+
141
+ if @rotation_style == :free
142
+ self.scale_x = 1
143
+ super(val)
144
+ elsif @rotation_style == :left_right
145
+ if @vector[:x] >= 0
146
+ self.scale_x = 1
147
+ else
148
+ self.scale_x = -1
149
+ end
150
+ end
98
151
  end
99
152
 
100
153
  # ( )に向ける
@@ -166,10 +219,19 @@ module Smalruby
166
219
  (self.y + center_y - y).abs**2).to_i
167
220
  end
168
221
 
169
- # 端に着いた
222
+ # 端に着いた?
170
223
  def reach_wall?
171
- self.x < 0 || self.x >= (Window.width - image.width) ||
172
- self.y < 0 || self.y >= (Window.height - image.height)
224
+ reach_left_or_right_wall? || reach_top_or_bottom_wall?
225
+ end
226
+
227
+ # 左右の端に着いた?
228
+ def reach_left_or_right_wall?
229
+ self.x < 0 || self.x >= (Window.width - image.width)
230
+ end
231
+
232
+ # 上下の端に着いた?
233
+ def reach_top_or_bottom_wall?
234
+ self.y < 0 || self.y >= (Window.height - image.height)
173
235
  end
174
236
 
175
237
  def hit?(other)
@@ -186,9 +248,7 @@ module Smalruby
186
248
  }
187
249
  opt = process_optional_arguments(option, defaults)
188
250
 
189
- @sound_cache ||= {}
190
- (@sound_cache[opt[:name]] ||= Sound.new(asset_path(opt[:name])))
191
- .play
251
+ new_sound(opt[:name]).play
192
252
  end
193
253
 
194
254
  # @!endgroup
@@ -365,6 +425,12 @@ module Smalruby
365
425
 
366
426
  private
367
427
 
428
+ def sync_angle(x, y)
429
+ a = Math.acos(x / Math.sqrt(x**2 + y**2)) * 180 / Math::PI
430
+ a = 360 - a if y < 0
431
+ self.angle = a
432
+ end
433
+
368
434
  def asset_path(name)
369
435
  program_path = Pathname($PROGRAM_NAME).expand_path(Dir.pwd)
370
436
  paths = [Pathname("../#{name}").expand_path(program_path),
@@ -376,7 +442,14 @@ module Smalruby
376
442
  self.class.font_cache.synchronize do
377
443
  self.class.font_cache[size] ||= Font.new(size)
378
444
  end
379
- return self.class.font_cache[size]
445
+ self.class.font_cache[size]
446
+ end
447
+
448
+ def new_sound(name)
449
+ self.class.sound_cache.synchronize do
450
+ self.class.sound_cache[name] ||= Sound.new(asset_path(name))
451
+ end
452
+ self.class.sound_cache[name]
380
453
  end
381
454
 
382
455
  def draw_balloon
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module Smalruby
4
- VERSION = '0.0.18'
4
+ VERSION = '0.0.19'
5
5
  end
data/samples/car.rb CHANGED
@@ -2,14 +2,27 @@
2
2
  require 'smalruby'
3
3
 
4
4
  car1 = Character.new(x: 0, y: 0, costume: 'car1.png')
5
+ car1.rotation_style = :free
5
6
 
6
7
  car1.on(:start) do
7
8
  loop do
8
- move(5)
9
+ move(15)
9
10
  turn_if_reach_wall
10
11
  end
11
12
  end
12
13
 
13
14
  car1.on(:click) do
14
- rotate(45)
15
+ rotate(15)
16
+ end
17
+
18
+ car1.on(:key_push, K_1) do
19
+ self.rotation_style = :free
20
+ end
21
+
22
+ car1.on(:key_push, K_2) do
23
+ self.rotation_style = :left_right
24
+ end
25
+
26
+ car1.on(:key_push, K_3) do
27
+ self.rotation_style = :none
15
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smalruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.18
4
+ version: 0.0.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouji Takao