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.
- checksums.yaml +4 -4
- data/.github/workflows/release-gem.yml +10 -1
- data/.github/workflows/test.yml +9 -0
- data/ChangeLog.md +18 -0
- data/RubySketch.podspec +1 -1
- data/VERSION +1 -1
- data/bin/rubysketch +33 -0
- data/examples/constraint.rb +89 -0
- data/lib/rubysketch/all.rb +2 -0
- data/lib/rubysketch/constraint.rb +422 -0
- data/lib/rubysketch/context.rb +17 -9
- data/lib/rubysketch/extension.rb +1 -1
- data/lib/rubysketch/helper.rb +10 -0
- data/lib/rubysketch/pin.rb +108 -0
- data/lib/rubysketch/shape.rb +1 -1
- data/lib/rubysketch/sprite.rb +442 -48
- data/pod.rake +1 -1
- data/rubysketch.gemspec +8 -6
- data/test/helper.rb +23 -0
- data/test/test_constraint.rb +230 -0
- data/test/test_context.rb +55 -18
- data/test/test_sprite.rb +2 -8
- data/test/test_sprite_world.rb +66 -0
- metadata +38 -15
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',
|
|
29
|
-
s.add_dependency 'rucy',
|
|
30
|
-
s.add_dependency 'beeps',
|
|
31
|
-
s.add_dependency 'rays',
|
|
32
|
-
s.add_dependency 'reflexion',
|
|
33
|
-
s.add_dependency '
|
|
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
|
|
9
|
-
RS::
|
|
10
|
+
def world(*args, **kwargs)
|
|
11
|
+
RS::SpriteWorld.new(*args, **kwargs)
|
|
10
12
|
end
|
|
11
13
|
|
|
12
|
-
def
|
|
13
|
-
RS::
|
|
14
|
+
def sprite(*args, **kwargs)
|
|
15
|
+
RS::Sprite.new(*args, **kwargs)
|
|
14
16
|
end
|
|
15
17
|
|
|
16
|
-
def
|
|
17
|
-
|
|
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
|
|
21
|
-
|
|
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
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
35
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|