rubysketch 0.9.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/pod.rake CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  github = 'https://github.com/xord'
5
5
  renames = {reflexion: 'reflex'}
6
- regexp = /add\w+dependency.*['"](\w+)['"].*['"]\s*~>\s*([\d\.]+)\s*['"]/
6
+ regexp = /add\w+dependency.*['"]([\w\-]+)['"].*['"]\s*~>\s*([\d\.]+)\s*['"]/
7
7
  repos = File.readlines('rubysketch.gemspec', chomp: true)
8
8
  .map {|s| regexp.match(s)&.values_at 1, 2}
9
9
  .compact
data/rubysketch.gemspec CHANGED
@@ -25,14 +25,16 @@ Gem::Specification.new do |s|
25
25
  s.platform = Gem::Platform::RUBY
26
26
  s.required_ruby_version = '>= 3.0.0'
27
27
 
28
- s.add_dependency 'xot', '~> 0.3.15'
29
- s.add_dependency 'rucy', '~> 0.3.15'
30
- s.add_dependency 'beeps', '~> 0.3.16'
31
- s.add_dependency 'rays', '~> 0.3.16'
32
- s.add_dependency 'reflexion', '~> 0.5.3'
33
- s.add_dependency 'processing', '~> 1.3.4'
28
+ s.add_dependency 'xot', '~> 0.4.0'
29
+ s.add_dependency 'rucy', '~> 0.4.0'
30
+ s.add_dependency 'beeps', '~> 0.4.0'
31
+ s.add_dependency 'rays', '~> 0.4.0'
32
+ s.add_dependency 'reflexion', '~> 0.6.0'
33
+ s.add_dependency 'reflex-packager', '~> 0.2.0'
34
+ s.add_dependency 'processing', '~> 1.4.0'
34
35
 
35
36
  s.files = `git ls-files`.split $/
37
+ s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
36
38
  s.test_files = s.files.grep %r{^(test|spec|features)/}
37
39
  s.extra_rdoc_files = rdocs.to_a
38
40
  end
data/test/helper.rb CHANGED
@@ -8,3 +8,26 @@ require 'rubysketch/all'
8
8
  require 'test/unit'
9
9
 
10
10
  include Xot::Test
11
+
12
+
13
+ module HasContext
14
+
15
+ def new_context()
16
+ RubySketch::Window.new.context
17
+ end
18
+
19
+ def setup()
20
+ $processing_context__ = new_context
21
+ super
22
+ end
23
+
24
+ def teardown()
25
+ super
26
+ $processing_context__ = nil
27
+ end
28
+
29
+ def context()
30
+ $processing_context__
31
+ end
32
+
33
+ end# HasContext
@@ -0,0 +1,230 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestConstraint < Test::Unit::TestCase
5
+
6
+ include HasContext
7
+
8
+ RS = RubySketch
9
+ PI = Math::PI
10
+
11
+ def sprite(*args, **kwargs)
12
+ RS::Sprite.new(*args, **kwargs)
13
+ end
14
+
15
+ def vec(*args, **kwargs)
16
+ RS::Vector.new(*args, **kwargs)
17
+ end
18
+
19
+ def sprites()
20
+ [sprite(100, 100, 50, 50), sprite(200, 100, 50, 50)]
21
+ end
22
+
23
+ def test_create()
24
+ s1, s2 = sprites
25
+
26
+ assert_instance_of RS::SnapConstraint, s1.snap( s2)
27
+ assert_instance_of RS::LinkConstraint, s1.link( s2)
28
+ assert_instance_of RS::WheelConstraint, s1.wheel(s2)
29
+ assert_instance_of RS::ChaseConstraint, s1.chase(s2)
30
+ end
31
+
32
+ def test_create_by_pin()
33
+ s1, s2 = sprites
34
+
35
+ assert_instance_of RS::Pin, s1.pin(10, 20)
36
+ assert_equal s1, s1.pin(10, 20).sprite
37
+ assert_equal vec(10, 20), s1.pin(10, 20).pos
38
+ assert_nil s1.pin .pos
39
+
40
+ assert_instance_of RS::SnapConstraint, s1.pin(10, 20).snap(s2.pin(30, 40))
41
+ assert_equal [s1, s2], s1.pin(10, 20).snap(s2.pin(30, 40)).sprites
42
+ end
43
+
44
+ def test_sprites()
45
+ s1, s2 = sprites
46
+
47
+ assert_equal [s1, s2], s1.snap(s2) .sprites
48
+ assert_equal [s1, nil], s1.link([100, 200]).sprites
49
+ end
50
+
51
+ def test_spring_damping_collide()
52
+ s1, s2 = sprites
53
+
54
+ assert_in_delta 0, s1.link(s2, damping: 0.5, collide: true).spring
55
+ assert_in_delta 4, s1.link(s2, spring: 4, damping: 0.5, collide: true).spring
56
+ assert_in_delta 0.5, s1.link(s2, spring: 4, damping: 0.5, collide: true).damping
57
+ assert_in_delta 0.5, s1.link(s2, spring: 4, damping: 0.5, collide: true).damping
58
+ assert_false s1.link(s2, spring: 4, damping: 0.5) .collide?
59
+ assert_true s1.link(s2, spring: 4, damping: 0.5, collide: true).collide?
60
+
61
+ c = s1.link s2, spring: 4
62
+ c.spring = nil; assert_nil c.spring
63
+ c.spring = 8; assert_in_delta 8, c.spring
64
+ end
65
+
66
+ def test_force()
67
+ s1, s2 = sprites
68
+
69
+ assert_nil s1.snap(s2) .force
70
+ assert_in_delta 500, s1.snap(s2, force: 500).force
71
+
72
+ c = s1.chase s2, force: 500
73
+ assert_in_delta 500, c.force
74
+
75
+ c.force = nil
76
+ assert_nil c.force
77
+ end
78
+
79
+ def test_snap_angle_follows_angle_mode()
80
+ s1, s2 = sprites
81
+
82
+ c = s1.snap s2, angle: -PI / 3..PI / 3, motor: PI # RADIANS by default
83
+ internal = c.getInternal__
84
+ assert_in_delta(-60, internal.angle.begin)
85
+ assert_in_delta( 60, internal.angle.end)
86
+ assert_in_delta( 180, internal.motor)
87
+ assert_in_delta(-PI / 3, c.angle.begin)
88
+ assert_in_delta( PI / 3, c.angle.end)
89
+ assert_in_delta( PI, c.motor)
90
+
91
+ c.motor = PI / 2
92
+ assert_in_delta 90, internal.motor
93
+
94
+ context.angleMode Processing::GraphicsContext::DEGREES
95
+ c = s1.snap s2, angle: -60..60, motor: 90
96
+ internal = c.getInternal__
97
+ assert_in_delta(-60, internal.angle.begin)
98
+ assert_in_delta( 60, internal.angle.end)
99
+ assert_in_delta( 90, internal.motor)
100
+ assert_in_delta( 90, c.motor)
101
+ end
102
+
103
+ def test_snap_angle_none_or_fixed()
104
+ s1, s2 = sprites
105
+
106
+ assert_nil s1.snap(s2).angle
107
+
108
+ c = s1.snap s2, angle: 0
109
+ assert_in_delta 0, c.angle.begin
110
+ assert_in_delta 0, c.angle.end
111
+ end
112
+
113
+ def test_link_distance_range()
114
+ s1, s2 = sprites
115
+
116
+ c = s1.link s2, distance: 80, range: 60..100
117
+ assert_in_delta 80, c.distance
118
+ assert_in_delta 80, c.dist
119
+ assert_in_delta 60, c.range.begin
120
+ assert_in_delta 100, c.range.end
121
+ end
122
+
123
+ def test_link_axis()
124
+ s1, s2 = sprites
125
+
126
+ assert_nil s1.link(s2).axis # a radial link has no axis
127
+
128
+ c = s1.link s2, axis: [0, 1], range: -50..50, motor: 100
129
+ assert_equal vec(0, 1), c.axis
130
+ assert_in_delta(-50, c.range.begin)
131
+ assert_in_delta( 50, c.range.end)
132
+ assert_in_delta 100, c.getInternal__.motor # linear: not affected by angleMode
133
+ assert_in_delta 100, c.motor
134
+
135
+ assert_equal vec(1, 0), s1.link(s2, axis: vec(1, 0)).axis
136
+ end
137
+
138
+ def test_wheel()
139
+ s1, s2 = sprites
140
+
141
+ c = s1.wheel s2, axis: [0, 1], spring: 6, motor: PI
142
+ assert_equal vec(0, 1), c.axis
143
+ assert_in_delta 6, c.spring
144
+ assert_in_delta 180, c.getInternal__.motor # spin motor follows angleMode
145
+ assert_in_delta PI, c.motor
146
+
147
+ assert_equal vec(0, 1), s1.wheel(s2).axis # vertical suspension by default
148
+ end
149
+
150
+ def test_chase_target()
151
+ s1, s2 = sprites
152
+
153
+ c = s1.chase s2
154
+ assert_equal s2, c.target.sprite
155
+
156
+ c.target = [10, 20]
157
+ assert_nil c.target.sprite
158
+ assert_equal vec(10, 20), c.target.pos
159
+
160
+ c.target = vec(30, 40)
161
+ assert_equal vec(30, 40), c.target.pos
162
+
163
+ s3 = sprite 300, 100, 50, 50
164
+ c.target = s3
165
+ assert_equal s3, c.target.sprite
166
+
167
+ c.target = nil # nil chases nothing: an empty pin with no sprite and no point
168
+ assert_nil c.target.sprite
169
+ assert_nil c.target.pos
170
+ end
171
+
172
+ def test_link_current_distance()
173
+ s1, s2 = sprites
174
+
175
+ c = s1.link s2
176
+ assert_equal 0, c.currentDistance # 0 while not active in a world
177
+
178
+ context.addSprite s1
179
+ context.addSprite s2
180
+ s1.dynamic = true
181
+ assert_in_delta 100, c.currentDistance # sprite centers are 100 px apart
182
+ end
183
+
184
+ def test_block()
185
+ s1, s2 = sprites
186
+
187
+ c = s1.link s2 do
188
+ distance 80
189
+ spring 4
190
+ end
191
+ assert_in_delta 80, c.distance
192
+ assert_in_delta 4, c.spring
193
+
194
+ c = s1.snap s2 do
195
+ motor PI # block form goes through the angleMode conversion too
196
+ end
197
+ assert_in_delta 180, c.getInternal__.motor
198
+ end
199
+
200
+ def test_constraints()
201
+ s1, s2 = sprites
202
+
203
+ c1 = s1.link s2
204
+ c2 = s1.snap s2
205
+ assert_equal [c1, c2], s1.constraints
206
+ assert_equal [c1, c2], s2.constraints
207
+ end
208
+
209
+ def test_remove()
210
+ s1, s2 = sprites
211
+
212
+ c = s1.snap s2
213
+ assert_false c.active? # sprites are not in a world yet
214
+ assert_false c.removed?
215
+
216
+ c.remove
217
+ assert_true c.removed?
218
+ assert_equal [], s1.constraints
219
+ assert_equal [], s2.constraints
220
+ end
221
+
222
+ def test_constrain_to_itself_error()
223
+ s, = sprites
224
+
225
+ assert_raise(ArgumentError) {s.snap s}
226
+ assert_raise(ArgumentError) {s.chase s}
227
+ assert_equal [], s.constraints
228
+ end
229
+
230
+ end# TestConstraint
data/test/test_context.rb CHANGED
@@ -3,40 +3,77 @@ require_relative 'helper'
3
3
 
4
4
  class TestContext < Test::Unit::TestCase
5
5
 
6
+ include HasContext
7
+
6
8
  RS = RubySketch
7
9
 
8
- def sprite(*args, **kwargs)
9
- RS::Sprite.new(*args, **kwargs)
10
+ def world(*args, **kwargs)
11
+ RS::SpriteWorld.new(*args, **kwargs)
10
12
  end
11
13
 
12
- def context()
13
- RS::Context.current__
14
+ def sprite(*args, **kwargs)
15
+ RS::Sprite.new(*args, **kwargs)
14
16
  end
15
17
 
16
- def setup()
17
- RS::Context.setCurrent__ RS::Window.new.context
18
+ def test_addWorld()
19
+ world.tap do |w|
20
+ assert_equal w, context.addWorld(w)
21
+ assert_equal context, w.getContext__
22
+ assert_raise(ArgumentError) {context.addWorld w}
23
+ assert_raise(ArgumentError) {new_context.addWorld w}
24
+ end
18
25
  end
19
26
 
20
- def teardown()
21
- RS::Context.setCurrent__ nil
27
+ def test_removeWorld()
28
+ world.tap do |w|
29
+ assert_raise(ArgumentError) {context.removeWorld w}
30
+ context.addWorld w
31
+ assert_equal w, context.removeWorld(w)
32
+ assert_nil w.getContext__
33
+ end
22
34
  end
23
35
 
24
36
  def test_addSprite()
25
- sp = sprite
26
- assert_equal sp, context.addSprite(sp)
37
+ sprite.tap do |sp|
38
+ assert_equal sp, context.addSprite(sp)
39
+ assert_not_nil sp.getWorld__
40
+ assert_raise(ArgumentError) {context.addSprite sp}
41
+ end
42
+
43
+ sprite.tap do |sp|
44
+ ary = []
45
+ assert_equal sp, context.addSprite(sp, to: ary)
46
+ assert_equal [sp], ary
47
+ end
27
48
 
28
- ary = []
29
- assert_equal sp, context.addSprite(ary, sp)
30
- assert_equal [sp], ary
49
+ sprite.tap do |sp| # deprecated form
50
+ ary = []
51
+ assert_equal sp, context.addSprite(ary, sp)
52
+ assert_equal [sp], ary
53
+ end
31
54
  end
32
55
 
33
56
  def test_removeSprite()
34
- sp = sprite
35
- assert_equal sp, context.removeSprite(sp)
57
+ sprite.tap do |sp|
58
+ assert_raise(ArgumentError) {context.removeSprite sp}
59
+ context.addSprite sp
60
+ assert_equal sp, context.removeSprite(sp)
61
+ assert_nil sp.getWorld__
62
+ end
63
+
64
+ sprite.tap do |sp|
65
+ ary = []
66
+ context.addSprite sp, to: ary
67
+ assert_equal sp, context.removeSprite(sp, from: ary)
68
+ assert_equal [], ary
69
+ end
36
70
 
37
- ary = [sp]
38
- assert_equal sp, context.removeSprite(ary, sp)
39
- assert_equal [], ary
71
+ sprite.tap do |sp| # deprecated form
72
+ ary = []
73
+ context.addSprite ary, sp
74
+ assert_equal sp, context.removeSprite(ary, sp)
75
+ assert_equal [], ary
76
+ end
40
77
  end
41
78
 
42
79
  end# TestContext
data/test/test_sprite.rb CHANGED
@@ -3,6 +3,8 @@ require_relative 'helper'
3
3
 
4
4
  class TestSprite < Test::Unit::TestCase
5
5
 
6
+ include HasContext
7
+
6
8
  RS = RubySketch
7
9
 
8
10
  def sprite(*args, **kwargs)
@@ -17,14 +19,6 @@ class TestSprite < Test::Unit::TestCase
17
19
  RS::Image.new Rays::Image.new(w, h)
18
20
  end
19
21
 
20
- def setup()
21
- RS::Context.setCurrent__ RS::Window.new.context
22
- end
23
-
24
- def teardown()
25
- RS::Context.setCurrent__ nil
26
- end
27
-
28
22
  def test_initialize()
29
23
  assert_equal vec(0, 0), sprite .pos
30
24
  assert_equal vec(1, 2), sprite(1, 2) .pos
@@ -0,0 +1,66 @@
1
+ require_relative 'helper'
2
+
3
+
4
+ class TestSpriteWorld < Test::Unit::TestCase
5
+
6
+ include HasContext
7
+
8
+ RS = RubySketch
9
+
10
+ def world(*args, **kwargs)
11
+ RS::SpriteWorld.new(*args, **kwargs)
12
+ end
13
+
14
+ def sprite(*args, **kwargs)
15
+ RS::Sprite.new(*args, **kwargs)
16
+ end
17
+
18
+ def test_addSprite()
19
+ sprite.tap do |sp|
20
+ w = world
21
+ assert_equal sp, w .addSprite(sp)
22
+ assert_not_nil sp.getWorld__
23
+ assert_raise(ArgumentError) {w .addSprite sp}
24
+ assert_raise(ArgumentError) {world.addSprite sp}
25
+ end
26
+
27
+ sprite.tap do |sp|
28
+ w, ary = world, []
29
+ assert_equal sp, w.addSprite(sp, to: ary)
30
+ assert_equal [sp], ary
31
+ end
32
+
33
+ sprite.tap do |sp| # deprecated form
34
+ w, ary = world, []
35
+ assert_equal sp, w.addSprite(ary, sp)
36
+ assert_equal [sp], ary
37
+ end
38
+ end
39
+
40
+ def test_removeSprite()
41
+ sprite.tap do |sp|
42
+ w = world
43
+ assert_raise(ArgumentError) {w.removeSprite sp}
44
+ w.addSprite sp
45
+ assert_equal sp, w.removeSprite(sp)
46
+ assert_nil sp.getWorld__
47
+ end
48
+
49
+ sprite.tap do |sp|
50
+ w, ary = world, []
51
+ w.addSprite sp, to: ary
52
+ assert_equal [sp], ary
53
+ assert_equal sp, w.removeSprite(sp, from: ary)
54
+ assert_equal [], ary
55
+ end
56
+
57
+ sprite.tap do |sp| # deprecated form
58
+ w, ary = world, []
59
+ w.addSprite ary, sp
60
+ assert_equal [sp], ary
61
+ assert_equal sp, w.removeSprite(ary, sp)
62
+ assert_equal [], ary
63
+ end
64
+ end
65
+
66
+ end# TestSpriteWorld
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysketch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-23 00:00:00.000000000 Z
11
+ date: 2026-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xot
@@ -16,87 +16,102 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.15
19
+ version: 0.4.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.3.15
26
+ version: 0.4.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rucy
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.3.15
33
+ version: 0.4.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.3.15
40
+ version: 0.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: beeps
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.3.16
47
+ version: 0.4.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.3.16
54
+ version: 0.4.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rays
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.3.16
61
+ version: 0.4.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.3.16
68
+ version: 0.4.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: reflexion
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.5.3
75
+ version: 0.6.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.5.3
82
+ version: 0.6.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: reflex-packager
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.2.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.2.0
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: processing
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 1.3.4
103
+ version: 1.4.0
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 1.3.4
110
+ version: 1.4.0
97
111
  description: A game engine based on the Processing API.
98
112
  email: xordog@gmail.com
99
- executables: []
113
+ executables:
114
+ - rubysketch
100
115
  extensions: []
101
116
  extra_rdoc_files: []
102
117
  files:
@@ -116,6 +131,8 @@ files:
116
131
  - Rakefile
117
132
  - RubySketch.podspec
118
133
  - VERSION
134
+ - bin/rubysketch
135
+ - examples/constraint.rb
119
136
  - examples/hello.rb
120
137
  - examples/mml.rb
121
138
  - examples/physics.rb
@@ -123,12 +140,14 @@ files:
123
140
  - examples/toon.rb
124
141
  - lib/rubysketch.rb
125
142
  - lib/rubysketch/all.rb
143
+ - lib/rubysketch/constraint.rb
126
144
  - lib/rubysketch/context.rb
127
145
  - lib/rubysketch/easings.rb
128
146
  - lib/rubysketch/extension.rb
129
147
  - lib/rubysketch/graphics_context.rb
130
148
  - lib/rubysketch/helper.rb
131
149
  - lib/rubysketch/mml.rb
150
+ - lib/rubysketch/pin.rb
132
151
  - lib/rubysketch/shape.rb
133
152
  - lib/rubysketch/sound.rb
134
153
  - lib/rubysketch/sprite.rb
@@ -138,10 +157,12 @@ files:
138
157
  - src/RubySketch.h
139
158
  - src/RubySketch.mm
140
159
  - test/helper.rb
160
+ - test/test_constraint.rb
141
161
  - test/test_context.rb
142
162
  - test/test_mml.rb
143
163
  - test/test_sound.rb
144
164
  - test/test_sprite.rb
165
+ - test/test_sprite_world.rb
145
166
  homepage: https://github.com/xord/rubysketch
146
167
  licenses:
147
168
  - MIT
@@ -167,7 +188,9 @@ specification_version: 4
167
188
  summary: A game engine based on the Processing API.
168
189
  test_files:
169
190
  - test/helper.rb
191
+ - test/test_constraint.rb
170
192
  - test/test_context.rb
171
193
  - test/test_mml.rb
172
194
  - test/test_sound.rb
173
195
  - test/test_sprite.rb
196
+ - test/test_sprite_world.rb