rubysketch 0.9.5 → 0.11.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 +2 -40
- data/.github/workflows/tag.yml +5 -28
- data/.github/workflows/test.yml +1 -28
- data/ChangeLog.md +25 -0
- data/Gemfile.lock +14 -8
- data/RubySketch.podspec +2 -2
- data/VERSION +1 -1
- data/bin/rubysketch +9 -9
- 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 +33 -25
- 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 +449 -51
- data/lib/rubysketch.rb +1 -2
- data/pod.rake +1 -1
- data/rubysketch.gemspec +8 -8
- data/test/helper.rb +27 -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 +24 -18
- data/.github/workflows/utils.rb +0 -127
data/lib/rubysketch.rb
CHANGED
|
@@ -19,8 +19,7 @@ def RubySketch(snake_case: false)
|
|
|
19
19
|
return RubySketch unless snake_case
|
|
20
20
|
|
|
21
21
|
$rubysketch_refinements_with_snake_case ||= Module.new do
|
|
22
|
-
Processing.alias_snake_case_methods__ Processing
|
|
23
|
-
Processing.alias_snake_case_methods__ RubySketch
|
|
22
|
+
Processing.alias_snake_case_methods__ Processing, RubySketch
|
|
24
23
|
|
|
25
24
|
refine Object do
|
|
26
25
|
Processing.funcs__(RubySketch::Context).each do |func|
|
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
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
|
11
11
|
|
|
12
12
|
ext = RubySketch::Extension
|
|
13
13
|
name = ext.name true
|
|
14
|
-
rdocs = glob.call
|
|
14
|
+
rdocs = glob.call(*%w[README])
|
|
15
15
|
|
|
16
16
|
s.name = name
|
|
17
17
|
s.version = ext.version
|
|
@@ -25,13 +25,13 @@ 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.
|
|
29
|
-
s.add_dependency 'rucy', '~> 0.
|
|
30
|
-
s.add_dependency 'beeps', '~> 0.
|
|
31
|
-
s.add_dependency 'rays', '~> 0.
|
|
32
|
-
s.add_dependency 'reflexion', '~> 0.
|
|
33
|
-
s.add_dependency 'reflex-packager', '~> 0.
|
|
34
|
-
s.add_dependency 'processing', '~> 1.
|
|
28
|
+
s.add_dependency 'xot', '~> 0.5.0'
|
|
29
|
+
s.add_dependency 'rucy', '~> 0.5.0'
|
|
30
|
+
s.add_dependency 'beeps', '~> 0.5.0'
|
|
31
|
+
s.add_dependency 'rays', '~> 0.5.0'
|
|
32
|
+
s.add_dependency 'reflexion', '~> 0.7.0'
|
|
33
|
+
s.add_dependency 'reflex-packager', '~> 0.3.0'
|
|
34
|
+
s.add_dependency 'processing', '~> 1.5.0'
|
|
35
35
|
|
|
36
36
|
s.files = `git ls-files`.split $/
|
|
37
37
|
s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
|
data/test/helper.rb
CHANGED
|
@@ -8,3 +8,30 @@ 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
|
+
window = RubySketch::Window.new
|
|
17
|
+
(@windows_for_context__ ||= []).push window
|
|
18
|
+
window.context
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def setup()
|
|
22
|
+
$processing_context__ = new_context
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def teardown()
|
|
27
|
+
super
|
|
28
|
+
$processing_context__ = nil
|
|
29
|
+
@windows_for_context__&.each(&:close)
|
|
30
|
+
@windows_for_context__ = nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def context()
|
|
34
|
+
$processing_context__
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
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.11.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-11-04 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: xot
|
|
@@ -16,98 +16,98 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.
|
|
19
|
+
version: 0.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.7.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.7.0
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: reflex-packager
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
87
|
- - "~>"
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: 0.
|
|
89
|
+
version: 0.3.0
|
|
90
90
|
type: :runtime
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
94
|
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: 0.
|
|
96
|
+
version: 0.3.0
|
|
97
97
|
- !ruby/object:Gem::Dependency
|
|
98
98
|
name: processing
|
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
|
100
100
|
requirements:
|
|
101
101
|
- - "~>"
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: 1.
|
|
103
|
+
version: 1.5.0
|
|
104
104
|
type: :runtime
|
|
105
105
|
prerelease: false
|
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements:
|
|
108
108
|
- - "~>"
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: 1.
|
|
110
|
+
version: 1.5.0
|
|
111
111
|
description: A game engine based on the Processing API.
|
|
112
112
|
email: xordog@gmail.com
|
|
113
113
|
executables:
|
|
@@ -119,7 +119,6 @@ files:
|
|
|
119
119
|
- ".github/workflows/release-gem.yml"
|
|
120
120
|
- ".github/workflows/tag.yml"
|
|
121
121
|
- ".github/workflows/test.yml"
|
|
122
|
-
- ".github/workflows/utils.rb"
|
|
123
122
|
- ".gitignore"
|
|
124
123
|
- ".yardopts"
|
|
125
124
|
- CONTRIBUTING.md
|
|
@@ -132,6 +131,7 @@ files:
|
|
|
132
131
|
- RubySketch.podspec
|
|
133
132
|
- VERSION
|
|
134
133
|
- bin/rubysketch
|
|
134
|
+
- examples/constraint.rb
|
|
135
135
|
- examples/hello.rb
|
|
136
136
|
- examples/mml.rb
|
|
137
137
|
- examples/physics.rb
|
|
@@ -139,12 +139,14 @@ files:
|
|
|
139
139
|
- examples/toon.rb
|
|
140
140
|
- lib/rubysketch.rb
|
|
141
141
|
- lib/rubysketch/all.rb
|
|
142
|
+
- lib/rubysketch/constraint.rb
|
|
142
143
|
- lib/rubysketch/context.rb
|
|
143
144
|
- lib/rubysketch/easings.rb
|
|
144
145
|
- lib/rubysketch/extension.rb
|
|
145
146
|
- lib/rubysketch/graphics_context.rb
|
|
146
147
|
- lib/rubysketch/helper.rb
|
|
147
148
|
- lib/rubysketch/mml.rb
|
|
149
|
+
- lib/rubysketch/pin.rb
|
|
148
150
|
- lib/rubysketch/shape.rb
|
|
149
151
|
- lib/rubysketch/sound.rb
|
|
150
152
|
- lib/rubysketch/sprite.rb
|
|
@@ -154,10 +156,12 @@ files:
|
|
|
154
156
|
- src/RubySketch.h
|
|
155
157
|
- src/RubySketch.mm
|
|
156
158
|
- test/helper.rb
|
|
159
|
+
- test/test_constraint.rb
|
|
157
160
|
- test/test_context.rb
|
|
158
161
|
- test/test_mml.rb
|
|
159
162
|
- test/test_sound.rb
|
|
160
163
|
- test/test_sprite.rb
|
|
164
|
+
- test/test_sprite_world.rb
|
|
161
165
|
homepage: https://github.com/xord/rubysketch
|
|
162
166
|
licenses:
|
|
163
167
|
- MIT
|
|
@@ -177,13 +181,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
177
181
|
- !ruby/object:Gem::Version
|
|
178
182
|
version: '0'
|
|
179
183
|
requirements: []
|
|
180
|
-
rubygems_version: 3.
|
|
184
|
+
rubygems_version: 3.5.22
|
|
181
185
|
signing_key:
|
|
182
186
|
specification_version: 4
|
|
183
187
|
summary: A game engine based on the Processing API.
|
|
184
188
|
test_files:
|
|
185
189
|
- test/helper.rb
|
|
190
|
+
- test/test_constraint.rb
|
|
186
191
|
- test/test_context.rb
|
|
187
192
|
- test/test_mml.rb
|
|
188
193
|
- test/test_sound.rb
|
|
189
194
|
- test/test_sprite.rb
|
|
195
|
+
- test/test_sprite_world.rb
|