gamebox 0.1.1 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +9 -0
- data/History.txt +5 -0
- data/README.txt +4 -3
- data/Rakefile +12 -4
- data/TODO.txt +1 -5
- data/VERSION +1 -1
- data/docs/getting_started.rdoc +2 -2
- data/gamebox.gemspec +26 -10
- data/lib/gamebox/actor.rb +10 -3
- data/lib/gamebox/actor_factory.rb +2 -2
- data/lib/gamebox/actor_view.rb +14 -11
- data/lib/gamebox/actors/collidable_debugger.rb +35 -0
- data/lib/gamebox/actors/curtain.rb +2 -2
- data/lib/gamebox/actors/logo.rb +0 -6
- data/lib/gamebox/actors/score.rb +2 -5
- data/lib/gamebox/actors/spatial_debugger.rb +47 -0
- data/lib/gamebox/actors/svg_actor.rb +4 -6
- data/lib/gamebox/arbiter.rb +108 -15
- data/lib/gamebox/behavior.rb +29 -1
- data/lib/gamebox/behaviors/animated.rb +14 -23
- data/lib/gamebox/behaviors/audible.rb +1 -12
- data/lib/gamebox/behaviors/collidable.rb +29 -22
- data/lib/gamebox/behaviors/collidable/aabb_collidable.rb +61 -0
- data/lib/gamebox/behaviors/collidable/circle_collidable.rb +17 -0
- data/lib/gamebox/behaviors/collidable/collidable_shape.rb +35 -0
- data/lib/gamebox/behaviors/collidable/polygon_collidable.rb +85 -0
- data/lib/gamebox/behaviors/graphical.rb +13 -10
- data/lib/gamebox/behaviors/layered.rb +6 -20
- data/lib/gamebox/behaviors/physical.rb +116 -93
- data/lib/gamebox/class_finder.rb +6 -2
- data/lib/gamebox/config_manager.rb +24 -4
- data/lib/gamebox/data/config/objects.yml +5 -3
- data/lib/gamebox/ftor.rb +372 -0
- data/lib/gamebox/gamebox_application.rb +2 -8
- data/lib/gamebox/hooked_gosu_window.rb +30 -0
- data/lib/gamebox/input_manager.rb +78 -79
- data/lib/gamebox/lib/code_statistics.rb +1 -1
- data/lib/gamebox/lib/numbers_ext.rb +1 -1
- data/lib/gamebox/lib/rect.rb +612 -0
- data/lib/gamebox/physical_stage.rb +12 -2
- data/lib/gamebox/physics.rb +14 -3
- data/lib/gamebox/resource_manager.rb +28 -65
- data/lib/gamebox/sound_manager.rb +7 -13
- data/lib/gamebox/spatial_hash.rb +60 -14
- data/lib/gamebox/spatial_stagehand.rb +19 -0
- data/lib/gamebox/stage.rb +16 -1
- data/lib/gamebox/stage_manager.rb +1 -1
- data/lib/gamebox/svg_document.rb +1 -0
- data/lib/gamebox/tasks/gamebox_tasks.rb +23 -11
- data/lib/gamebox/templates/template_app/.gitignore +1 -0
- data/lib/gamebox/templates/template_app/Gemfile +1 -1
- data/lib/gamebox/templates/template_app/Rakefile +6 -21
- data/lib/gamebox/templates/template_app/config/environment.rb +14 -0
- data/lib/gamebox/templates/template_app/config/game.yml +2 -1
- data/lib/gamebox/templates/template_app/script/generate +0 -3
- data/lib/gamebox/templates/template_app/src/demo_stage.rb +1 -11
- data/lib/gamebox/templates/template_app/src/game.rb +0 -1
- data/lib/gamebox/templates/template_app/src/my_actor.rb +2 -2
- data/lib/gamebox/version.rb +1 -1
- data/lib/gamebox/views/graphical_actor_view.rb +15 -9
- data/lib/gamebox/wrapped_screen.rb +114 -7
- data/load_paths.rb +20 -0
- data/script/perf_spatial_hash.rb +73 -0
- data/spec/actor_view_spec.rb +1 -1
- data/spec/arbiter_spec.rb +264 -0
- data/spec/behavior_spec.rb +19 -2
- data/spec/collidable_spec.rb +105 -5
- data/spec/helper.rb +1 -1
- data/spec/label_spec.rb +1 -1
- data/spec/resource_manager_spec.rb +1 -1
- data/spec/spatial_hash_spec.rb +1 -1
- metadata +52 -10
- data/lib/gamebox/lib/surface_ext.rb +0 -76
data/spec/actor_view_spec.rb
CHANGED
@@ -4,7 +4,7 @@ require 'actor_view'
|
|
4
4
|
describe 'A new actor view' do
|
5
5
|
|
6
6
|
it 'should be layered 0/1 by default' do
|
7
|
-
@test_me = ActorView.new :stage, Actor.new({})
|
7
|
+
@test_me = ActorView.new :stage, Actor.new({}), :wrapped_screen
|
8
8
|
@test_me.layer.should == 0
|
9
9
|
@test_me.parallax.should == 1
|
10
10
|
end
|
@@ -0,0 +1,264 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),'helper')
|
2
|
+
require 'arbiter'
|
3
|
+
|
4
|
+
class Arb
|
5
|
+
include Arbiter
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'Arbiter' do
|
9
|
+
|
10
|
+
before do
|
11
|
+
@arbiter = Arb.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should construct' do
|
15
|
+
@arbiter.should_not be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#center_x' do
|
19
|
+
it 'should return the center x for circle'
|
20
|
+
it 'should return the center x for aabb'
|
21
|
+
it 'should return the center x for polygon'
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#center_y' do
|
25
|
+
it 'should return the center y for circle'
|
26
|
+
it 'should return the center y for aabb'
|
27
|
+
it 'should return the center y for polygon'
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#collide?' do
|
31
|
+
it 'should call the correct circle circle collision method' do
|
32
|
+
a = stub(:collidable_shape => :circle)
|
33
|
+
b = stub(:collidable_shape => :circle)
|
34
|
+
@arbiter.should_receive(:collide_circle_circle?).with(a,b).and_return(true)
|
35
|
+
|
36
|
+
@arbiter.collide?(a,b).should be_true
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should call the correct circle polygon collision method' do
|
40
|
+
a = stub(:collidable_shape => :circle)
|
41
|
+
b = stub(:collidable_shape => :polygon)
|
42
|
+
@arbiter.should_receive(:collide_circle_polygon?).with(a,b).and_return(true)
|
43
|
+
|
44
|
+
@arbiter.collide?(a,b).should be_true
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should call the correct polygon circle collision method' do
|
48
|
+
a = stub(:collidable_shape => :polygon)
|
49
|
+
b = stub(:collidable_shape => :circle)
|
50
|
+
@arbiter.should_receive(:collide_circle_polygon?).with(b,a).and_return(true)
|
51
|
+
|
52
|
+
@arbiter.collide?(a,b).should be_true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#collide_circle_circle?' do
|
57
|
+
it 'should collide overlapping circles' do
|
58
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :circle)
|
59
|
+
b = stub(:center_x => 0, :center_y => 10, :radius => 3, :collidable_shape => :circle)
|
60
|
+
@arbiter.collide_circle_circle?(a, b).should be_true
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should collide a circle in a circle' do
|
64
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :circle)
|
65
|
+
b = stub(:center_x => 10, :center_y => 10, :radius => 30, :collidable_shape => :circle)
|
66
|
+
@arbiter.collide_circle_circle?(a, b).should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should not collide non-overlapping circles' do
|
70
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :circle)
|
71
|
+
b = stub(:center_x => 100, :center_y => 100, :radius => 30, :collidable_shape => :circle)
|
72
|
+
@arbiter.collide_circle_circle?(a, b).should be_false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#collide_polygon_polygon?' do
|
77
|
+
it 'should not collide non-overlapping polys based on radius' do
|
78
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :polygon)
|
79
|
+
b = stub(:center_x => 61, :center_y => 0, :radius => 30, :collidable_shape => :polygon)
|
80
|
+
@arbiter.collide_polygon_polygon?(a,b).should be_false
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should not collide non-overlapping polys based on points' do
|
84
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :polygon,
|
85
|
+
:cw_world_points => [
|
86
|
+
[0,0],[0,30], [0,30]
|
87
|
+
],
|
88
|
+
:cw_world_lines => [
|
89
|
+
[0,0],[0,30],
|
90
|
+
[0,30],[30,0],
|
91
|
+
[30,0],[0,0]
|
92
|
+
],
|
93
|
+
:cw_world_edge_normals => [
|
94
|
+
[-30,0],
|
95
|
+
[30,30],
|
96
|
+
[0,-30]
|
97
|
+
]
|
98
|
+
|
99
|
+
)
|
100
|
+
b = stub(:center_x => 60, :center_y => 0, :radius => 30, :collidable_shape => :polygon,
|
101
|
+
:cw_world_points => [
|
102
|
+
[60,0],[60,30], [90,0]
|
103
|
+
],
|
104
|
+
:cw_world_lines => [
|
105
|
+
[60,0],[60,30],
|
106
|
+
[60,30],[90,0],
|
107
|
+
[90,0],[60,0]
|
108
|
+
],
|
109
|
+
:cw_world_edge_normals => [
|
110
|
+
[-30,0],
|
111
|
+
[30,30],
|
112
|
+
[0,-30]
|
113
|
+
]
|
114
|
+
)
|
115
|
+
@arbiter.collide_polygon_polygon?(a,b).should be_false
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should collide non-overlapping polys based on points' do
|
119
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :polygon,
|
120
|
+
:cw_world_points => [
|
121
|
+
[0,0],[0,30],[30,0]
|
122
|
+
],
|
123
|
+
:cw_world_lines => [
|
124
|
+
[0,0],[0,30],
|
125
|
+
[0,30],[30,0],
|
126
|
+
[30,0],[0,0]
|
127
|
+
],
|
128
|
+
:cw_world_edge_normals => [
|
129
|
+
[30,0],
|
130
|
+
[30,30],
|
131
|
+
[0,-30]
|
132
|
+
]
|
133
|
+
)
|
134
|
+
b = stub(:center_x => 29, :center_y => 0, :radius => 30, :collidable_shape => :polygon,
|
135
|
+
:cw_world_points => [
|
136
|
+
[29,0],[29,30],[59,0]
|
137
|
+
],
|
138
|
+
:cw_world_lines => [
|
139
|
+
[29,0],[29,30],
|
140
|
+
[29,30],[59,0],
|
141
|
+
[59,0],[29,0]
|
142
|
+
],
|
143
|
+
:cw_world_edge_normals => [
|
144
|
+
[-30,0],
|
145
|
+
[30,30],
|
146
|
+
[0,-30]
|
147
|
+
]
|
148
|
+
)
|
149
|
+
@arbiter.collide_polygon_polygon?(a,b).should be_true
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should collide completely overlapping polys based on points' do
|
153
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :polygon,
|
154
|
+
:cw_world_points => [
|
155
|
+
[0,0],[0,30],[30,0]
|
156
|
+
],
|
157
|
+
:cw_world_lines => [
|
158
|
+
[0,0],[0,30],
|
159
|
+
[0,30],[30,0],
|
160
|
+
[30,0],[0,0]
|
161
|
+
],
|
162
|
+
:cw_world_edge_normals => [
|
163
|
+
[30,0],
|
164
|
+
[30,30],
|
165
|
+
[0,-30]
|
166
|
+
]
|
167
|
+
)
|
168
|
+
b = stub(:center_x => 2, :center_y => 0, :radius => 10, :collidable_shape => :polygon,
|
169
|
+
:cw_world_points => [[10,0],[10,20],[20,0]],
|
170
|
+
:cw_world_lines => [
|
171
|
+
[10,0],[10,20],
|
172
|
+
[10,20],[20,0],
|
173
|
+
[20,0],[10,0]
|
174
|
+
],
|
175
|
+
:cw_world_edge_normals => [
|
176
|
+
[-20,0],
|
177
|
+
[-10,-20],
|
178
|
+
[0,-10]
|
179
|
+
]
|
180
|
+
)
|
181
|
+
@arbiter.collide_polygon_polygon?(a,b).should be_true
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe '#collide_circle_polygon?' do
|
186
|
+
it 'should collide overlapping circle and polygon' do
|
187
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :circle)
|
188
|
+
b = stub(:center_x => 2, :center_y => 0, :radius => 10, :collidable_shape => :polygon,
|
189
|
+
:cw_world_points => [[10,0],[10,20],[20,0]],
|
190
|
+
:cw_world_lines => [
|
191
|
+
[10,0],[10,20],
|
192
|
+
[10,20],[20,0],
|
193
|
+
[20,0],[10,0]
|
194
|
+
],
|
195
|
+
:cw_world_edge_normals => [
|
196
|
+
[-20,0],
|
197
|
+
[-10,-20],
|
198
|
+
[0,-10]
|
199
|
+
]
|
200
|
+
)
|
201
|
+
@arbiter.collide_circle_polygon?(a, b).should be_true
|
202
|
+
end
|
203
|
+
|
204
|
+
it 'should not collide overlapping circle and polygon' do
|
205
|
+
a = stub(:center_x => 0, :center_y => 0, :radius => 30, :collidable_shape => :circle)
|
206
|
+
b = stub(:center_x => 200, :center_y => 0, :radius => 10, :collidable_shape => :polygon,
|
207
|
+
:cw_world_points => [[10,0],[10,20],[20,0]],
|
208
|
+
:cw_world_lines => [
|
209
|
+
[208,0],[208,20],
|
210
|
+
[208,20],[218,0],
|
211
|
+
[218,0],[208,0]
|
212
|
+
],
|
213
|
+
:cw_world_edge_normals => [
|
214
|
+
[-20,0],
|
215
|
+
[-10,-20],
|
216
|
+
[0,-10]
|
217
|
+
]
|
218
|
+
)
|
219
|
+
@arbiter.collide_circle_polygon?(a, b).should be_false
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
describe '#collide_aabb_aabb' do
|
224
|
+
it 'should collide overlapping boxes' do
|
225
|
+
a = stub(:center_x => 0, :center_y => 0, :width => 30, :height => 20,
|
226
|
+
:collidable_shape => :aabb, :radius => 10,
|
227
|
+
:cw_world_points => [
|
228
|
+
[-15,10],[15,10],
|
229
|
+
[15,-10], [-15,10]
|
230
|
+
],
|
231
|
+
:cw_world_lines => [
|
232
|
+
[[-15,10],[15,10]],
|
233
|
+
[[15,10],[15,-10]],
|
234
|
+
[[15,-10],[-15,10]],
|
235
|
+
[[-15,10],[-15,10]]
|
236
|
+
],
|
237
|
+
:cw_world_edge_normals => [[1,0],[0,1]])
|
238
|
+
b = stub(:center_x => 5, :center_y => 5, :width => 10, :height => 2,
|
239
|
+
:collidable_shape => :aabb, :radius => 10,
|
240
|
+
:cw_world_points => [
|
241
|
+
[0,6],[10,6],
|
242
|
+
[10,4], [0,6]
|
243
|
+
],
|
244
|
+
:cw_world_lines => [
|
245
|
+
[[0,6],[10,6]],
|
246
|
+
[[10,6],[10,4]],
|
247
|
+
[[10,4],[0,6]],
|
248
|
+
[[0,6],[0,6]]
|
249
|
+
],
|
250
|
+
:cw_world_edge_normals => [[1,0],[0,1]])
|
251
|
+
|
252
|
+
@arbiter.collide_aabb_aabb?(a,b).should be_true
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
describe '#collide_aabb_circle' do
|
257
|
+
it 'should collide overlapping box and circle'
|
258
|
+
end
|
259
|
+
|
260
|
+
describe "#find_collisions" do
|
261
|
+
it "runs callbacks w/ unique collisions"
|
262
|
+
end
|
263
|
+
|
264
|
+
end
|
data/spec/behavior_spec.rb
CHANGED
@@ -2,10 +2,27 @@ require File.join(File.dirname(__FILE__),'helper')
|
|
2
2
|
require 'behavior'
|
3
3
|
|
4
4
|
describe 'A new behavior' do
|
5
|
+
before do
|
6
|
+
@actor = stub
|
7
|
+
@target = Behavior.new @actor
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should auto-require behaviors that it depends on'
|
11
|
+
it 'should relegate properly' do
|
12
|
+
@target.should_receive(:foo).and_return(:bar)
|
13
|
+
@target.relegates :foo
|
14
|
+
|
15
|
+
@actor.foo.should == :bar
|
16
|
+
end
|
5
17
|
|
6
|
-
it 'should
|
7
|
-
|
18
|
+
it 'should un-relegate properly' do
|
19
|
+
@target.should_receive(:foo).and_return(:bar)
|
20
|
+
@target.relegates :foo
|
21
|
+
@actor.foo.should == :bar
|
22
|
+
|
23
|
+
@target.removed
|
8
24
|
|
25
|
+
@actor.respond_to?(:foo).should be_false
|
9
26
|
end
|
10
27
|
|
11
28
|
end
|
data/spec/collidable_spec.rb
CHANGED
@@ -4,12 +4,112 @@ require 'collidable'
|
|
4
4
|
describe 'A new collidable behavior' do
|
5
5
|
before do
|
6
6
|
@stage = mock(:register_collidable => nil)
|
7
|
-
|
8
|
-
@actor = Actor.new
|
9
|
-
@collidable = Collidable.new @actor
|
7
|
+
@actor_opts = {:actor_type => :actor, :stage=>@stage, :input=>"input", :resources=> :rm}
|
8
|
+
@actor = Actor.new @actor_opts
|
10
9
|
end
|
11
10
|
|
12
|
-
|
13
|
-
|
11
|
+
|
12
|
+
describe "circle shape" do
|
13
|
+
before do
|
14
|
+
@behavior_opts = {:shape => :circle}
|
15
|
+
@collidable = Collidable.new @actor, @behavior_opts
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should recalculate_collidable_cache on update' do
|
19
|
+
@collidable.shape.should_receive(:recalculate_collidable_cache)
|
20
|
+
@collidable.update 4
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should relegate methods on actor' do
|
24
|
+
@collidable.should_receive(:width).and_return(44)
|
25
|
+
@actor.width.should == 44
|
26
|
+
@collidable.should_receive(:height).and_return(45)
|
27
|
+
@actor.height.should == 45
|
28
|
+
|
29
|
+
@collidable.should_receive(:collidable_shape).and_return(:circlez)
|
30
|
+
@actor.collidable_shape.should == :circlez
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should calculate center point for circle' do
|
34
|
+
@actor.x = 3
|
35
|
+
@actor.y = 6
|
36
|
+
@collidable = Collidable.new @actor, :shape => :circle, :radius => 20
|
37
|
+
@collidable.center_x.should be_close(23, 0.001)
|
38
|
+
@collidable.center_y.should be_close(26, 0.001)
|
39
|
+
end
|
14
40
|
end
|
41
|
+
|
42
|
+
describe "polygon shape" do
|
43
|
+
it 'should calculate center point for polygon' do
|
44
|
+
@collidable = Collidable.new @actor, :shape => :polygon, :points => [[0,0],[10,7],[20,10]]
|
45
|
+
@collidable.center_x.should be_close(10, 0.001)
|
46
|
+
@collidable.center_y.should be_close(5, 0.001)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should translate points to world coords for poly' do
|
50
|
+
@actor.x = 10
|
51
|
+
@actor.y = 5
|
52
|
+
@collidable = Collidable.new @actor, :shape => :polygon, :points => [[0,0],[10,7],[20,10]]
|
53
|
+
@collidable.cw_world_points.should == [[10,5],[20,12],[30,15]]
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should translate lines to world coords lines' do
|
57
|
+
@collidable = Collidable.new @actor, :shape => :polygon, :points => [[0,0],[10,7],[20,10]]
|
58
|
+
|
59
|
+
@collidable.cw_world_lines.should == [
|
60
|
+
[[0,0],[10,7]],
|
61
|
+
[[10,7],[20,10]],
|
62
|
+
[[20,10],[0,0]]
|
63
|
+
]
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should translate world lines to edge normals' do
|
67
|
+
@collidable = Collidable.new @actor, :shape => :polygon,
|
68
|
+
:points => [[0,0],[10,7],[20,10]]
|
69
|
+
|
70
|
+
@collidable.cw_world_edge_normals.should == [
|
71
|
+
[-7,10], [-3,10], [10,-20]
|
72
|
+
]
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should cache calcs until reset' do
|
76
|
+
@collidable = Collidable.new @actor, :shape => :polygon,
|
77
|
+
:points => [[0,0],[10,7],[20,10]]
|
78
|
+
# prime the cache
|
79
|
+
@collidable.cw_world_points.should == [[0,0],[10,7],[20,10]]
|
80
|
+
@collidable.cw_world_lines.should == [
|
81
|
+
[[0,0],[10,7]],
|
82
|
+
[[10,7],[20,10]],
|
83
|
+
[[20,10],[0,0]]
|
84
|
+
]
|
85
|
+
@collidable.cw_world_edge_normals.should == [
|
86
|
+
[-7,10], [-3,10], [10,-20]
|
87
|
+
]
|
88
|
+
|
89
|
+
@actor.x = 10
|
90
|
+
@actor.y = 5
|
91
|
+
@collidable.cw_world_points.should == [[0,0],[10,7],[20,10]]
|
92
|
+
@collidable.cw_world_lines.should == [
|
93
|
+
[[0,0],[10,7]],
|
94
|
+
[[10,7],[20,10]],
|
95
|
+
[[20,10],[0,0]]
|
96
|
+
]
|
97
|
+
@collidable.cw_world_edge_normals.should == [
|
98
|
+
[-7,10], [-3,10], [10,-20]
|
99
|
+
]
|
100
|
+
|
101
|
+
@collidable.clear_collidable_cache
|
102
|
+
@collidable.cw_world_points.should == [[10,5],[20,12],[30,15]]
|
103
|
+
@collidable.cw_world_lines.should == [
|
104
|
+
[[10,5],[20,12]],
|
105
|
+
[[20,12],[30,15]],
|
106
|
+
[[30,15],[10,5]]
|
107
|
+
]
|
108
|
+
@collidable.cw_world_edge_normals.should == [
|
109
|
+
[-7,10], [-3,10], [10,-20]
|
110
|
+
]
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
15
115
|
end
|
data/spec/helper.rb
CHANGED
@@ -2,7 +2,7 @@ here = File.dirname(__FILE__)
|
|
2
2
|
gamebox_root = File.expand_path(File.join(here, '..', 'lib'))
|
3
3
|
|
4
4
|
#$LOAD_PATH.unshift File.expand_path(gamebox_root, 'gamebox')
|
5
|
-
require '
|
5
|
+
require File.expand_path(File.join(here, '..', 'load_paths'))
|
6
6
|
require 'spec'
|
7
7
|
|
8
8
|
# TODO this lives in both gamebox.rb and here... seems strange
|
data/spec/label_spec.rb
CHANGED
data/spec/spatial_hash_spec.rb
CHANGED