gosu_extensions 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/core/collision.rb +73 -0
- data/lib/core/game_window.rb +74 -10
- data/lib/gosu_extensions.rb +1 -0
- data/spec/lib/core/collision_spec.rb +86 -0
- metadata +5 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class Collision
|
2
|
+
|
3
|
+
# Default collision functions
|
4
|
+
#
|
5
|
+
None = nil # do not collide
|
6
|
+
Simple = lambda {} # just collide
|
7
|
+
# Kill = lambda { kill! }
|
8
|
+
# Damage = lambda { damage! }
|
9
|
+
|
10
|
+
#
|
11
|
+
#
|
12
|
+
attr_reader :window, :this, :that, :definition
|
13
|
+
|
14
|
+
#
|
15
|
+
#
|
16
|
+
def initialize window, this, that = this, &definition
|
17
|
+
@window = window # TODO Remove.
|
18
|
+
@this = this
|
19
|
+
@that = that
|
20
|
+
@definition = definition && package(definition)
|
21
|
+
end
|
22
|
+
|
23
|
+
# TODO Extend the definition to incorporate this
|
24
|
+
# method. Or at least #complex, #simple.
|
25
|
+
#
|
26
|
+
def package definition
|
27
|
+
if definition.arity == 2
|
28
|
+
complex_package definition
|
29
|
+
else
|
30
|
+
simple_package definition
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
#
|
36
|
+
def simple_package definition
|
37
|
+
lambda do |this_shape, _|
|
38
|
+
# TODO break if found.
|
39
|
+
#
|
40
|
+
window.moveables.each do |movable|
|
41
|
+
if movable.shape == this_shape
|
42
|
+
movable.instance_eval &definition
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
#
|
50
|
+
def complex_package definition
|
51
|
+
lambda do |this_shape, that_shape|
|
52
|
+
this_that = Array.new(2)
|
53
|
+
# TODO break if found
|
54
|
+
#
|
55
|
+
window.moveables.each do |movable|
|
56
|
+
if movable.shape == this_shape
|
57
|
+
this_that[0] = movable
|
58
|
+
end
|
59
|
+
if movable.shape == that_shape
|
60
|
+
this_that[1] = movable
|
61
|
+
end
|
62
|
+
end
|
63
|
+
definition.call *this_that
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Install this collision on the given environment.
|
68
|
+
#
|
69
|
+
def install_on environment
|
70
|
+
environment.add_collision_func this, that, &definition
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
data/lib/core/game_window.rb
CHANGED
@@ -29,9 +29,12 @@ class GameWindow < Gosu::Window
|
|
29
29
|
attr_reader :environment,
|
30
30
|
:moveables,
|
31
31
|
:font,
|
32
|
-
:scheduling
|
32
|
+
:scheduling,
|
33
|
+
:collisions
|
33
34
|
attr_accessor :background_path,
|
34
|
-
:background_hard_borders
|
35
|
+
:background_hard_borders,
|
36
|
+
:stop_condition,
|
37
|
+
:proceed_condition
|
35
38
|
|
36
39
|
def initialize
|
37
40
|
setup_window
|
@@ -40,6 +43,8 @@ class GameWindow < Gosu::Window
|
|
40
43
|
setup_controls
|
41
44
|
setup_window_control # e.g. ESC => exits
|
42
45
|
|
46
|
+
@collisions = []
|
47
|
+
|
43
48
|
after_initialize
|
44
49
|
|
45
50
|
super self.screen_width, self.screen_height, self.full_screen, 16
|
@@ -61,6 +66,8 @@ class GameWindow < Gosu::Window
|
|
61
66
|
setup_collisions
|
62
67
|
|
63
68
|
install_main_loop
|
69
|
+
|
70
|
+
after_setup
|
64
71
|
end
|
65
72
|
|
66
73
|
# This is the main game loop.
|
@@ -153,12 +160,42 @@ class GameWindow < Gosu::Window
|
|
153
160
|
self.full_screen = true
|
154
161
|
end
|
155
162
|
end
|
156
|
-
|
157
|
-
|
163
|
+
|
164
|
+
attr_accessor :collisions
|
165
|
+
def no_collision this, that = this
|
166
|
+
# Doesn't work, as &nil == nil
|
167
|
+
# collision this, that, &Collision::None
|
168
|
+
InitializerHooks.register self do
|
169
|
+
self.collisions << Collision.new(self, this, that)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
def collision this, that = this, &definition
|
173
|
+
definition ||= Collision::Simple
|
158
174
|
InitializerHooks.register self do
|
159
|
-
|
175
|
+
self.collisions << Collision.new(self, this, that, &definition)
|
160
176
|
end
|
161
177
|
end
|
178
|
+
|
179
|
+
# Stop the game if this condition is true.
|
180
|
+
#
|
181
|
+
# Block will instance eval in the window.
|
182
|
+
#
|
183
|
+
# Use the callback after_stopping.
|
184
|
+
#
|
185
|
+
def stop_on &condition
|
186
|
+
InitializerHooks.register self do
|
187
|
+
self.stop_condition = condition
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# # Proceed if this condition is true.
|
192
|
+
# #
|
193
|
+
# def proceed_on &condition
|
194
|
+
# InitializerHooks.register self do
|
195
|
+
# self.proceed_condition = condition
|
196
|
+
# end
|
197
|
+
# end
|
198
|
+
|
162
199
|
end
|
163
200
|
|
164
201
|
# Setup methods
|
@@ -206,11 +243,16 @@ class GameWindow < Gosu::Window
|
|
206
243
|
@environment.window = self
|
207
244
|
@environment.damping = -self.damping + 1 # recalculate the damping such that 0.0 has no damping.
|
208
245
|
end
|
209
|
-
#
|
246
|
+
# Callbacks:
|
210
247
|
#
|
211
248
|
def setup_players; end
|
212
249
|
def setup_enemies; end
|
213
250
|
def setup_waves; end
|
251
|
+
def after_setup; end
|
252
|
+
def after_stopping; end
|
253
|
+
def before_proceeding; end
|
254
|
+
def step; end # The most important callback
|
255
|
+
|
214
256
|
#
|
215
257
|
#
|
216
258
|
# Example:
|
@@ -218,7 +260,7 @@ class GameWindow < Gosu::Window
|
|
218
260
|
# add_collision_func ...
|
219
261
|
#
|
220
262
|
def setup_collisions
|
221
|
-
self.
|
263
|
+
self.collisions.each { |collision| collision.install_on(environment) }
|
222
264
|
end
|
223
265
|
|
224
266
|
# Add controls for a player.
|
@@ -242,12 +284,29 @@ class GameWindow < Gosu::Window
|
|
242
284
|
def update
|
243
285
|
@current_loop.call
|
244
286
|
end
|
287
|
+
def stop
|
288
|
+
@current_loop = lambda do
|
289
|
+
proceed if proceed_condition && instance_eval(&proceed_condition)
|
290
|
+
advance_step
|
291
|
+
# TODO stopped
|
292
|
+
end
|
293
|
+
after_stopping
|
294
|
+
end
|
295
|
+
def proceed
|
296
|
+
before_proceeding
|
297
|
+
@current_loop = main_loop
|
298
|
+
end
|
245
299
|
# Advances to the next step in the game.
|
246
300
|
#
|
247
|
-
def
|
301
|
+
def advance_step
|
248
302
|
@step += 1
|
249
303
|
@scheduling.step
|
250
304
|
end
|
305
|
+
def next_step
|
306
|
+
stop if stop_condition && instance_eval(&stop_condition)
|
307
|
+
advance_step
|
308
|
+
step
|
309
|
+
end
|
251
310
|
# Each step, this is called to handle any input.
|
252
311
|
#
|
253
312
|
def handle_input
|
@@ -326,6 +385,7 @@ class GameWindow < Gosu::Window
|
|
326
385
|
def threaded time = 1, &code
|
327
386
|
@scheduling.add time, &code
|
328
387
|
end
|
388
|
+
alias after threaded
|
329
389
|
|
330
390
|
|
331
391
|
# Utility Methods
|
@@ -339,11 +399,15 @@ class GameWindow < Gosu::Window
|
|
339
399
|
end
|
340
400
|
# Randomly adds a Thing to a uniform random position.
|
341
401
|
#
|
342
|
-
def
|
402
|
+
def add type, x = nil, y = nil, &random_function
|
343
403
|
thing = type.new self
|
344
|
-
|
404
|
+
position = x && y && [x, y] || random_function && random_function[]
|
405
|
+
thing.warp_to *position
|
345
406
|
register thing
|
346
407
|
end
|
408
|
+
def randomly_add type
|
409
|
+
add type, *uniform_random_position
|
410
|
+
end
|
347
411
|
# Revives the player if not already in.
|
348
412
|
#
|
349
413
|
def revive player
|
data/lib/gosu_extensions.rb
CHANGED
@@ -0,0 +1,86 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '/../../spec_helper')
|
2
|
+
|
3
|
+
describe Collision do
|
4
|
+
|
5
|
+
context 'with collision' do
|
6
|
+
before(:each) do
|
7
|
+
@some_function = lambda {}
|
8
|
+
@collision = Collision.new :some_window, :this, :that, &@some_function
|
9
|
+
end
|
10
|
+
describe "install_on" do
|
11
|
+
it "should install itself on the given thing correctly" do
|
12
|
+
environment = stub :environment
|
13
|
+
environment.should_receive(:add_collision_func).once.with :this, :that, &@some_function
|
14
|
+
|
15
|
+
@collision.install_on environment
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'no collision' do
|
21
|
+
before(:each) do
|
22
|
+
@collision = Collision.new :some_window, :this, :that, &Collision::None
|
23
|
+
end
|
24
|
+
describe "install_on" do
|
25
|
+
it "should install itself on the given thing correctly" do
|
26
|
+
environment = stub :environment
|
27
|
+
environment.should_receive(:add_collision_func).once.with :this, :that, &Collision::None
|
28
|
+
|
29
|
+
@collision.install_on environment
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "complex_package" do
|
35
|
+
before(:each) do
|
36
|
+
@collision = Collision.new :some_window, :this, :that
|
37
|
+
end
|
38
|
+
it "should return a lambda with two params" do
|
39
|
+
@collision.complex_package(lambda{}).arity.should == 2
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "simple_package" do
|
44
|
+
before(:each) do
|
45
|
+
@collision = Collision.new :some_window, :this, :that
|
46
|
+
end
|
47
|
+
it "should return a lambda with two params" do
|
48
|
+
@collision.simple_package(lambda{}).arity.should == 2
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "package" do
|
53
|
+
context 'definition with two params' do
|
54
|
+
before(:each) do
|
55
|
+
@definition = lambda { |one, two| }
|
56
|
+
@collision = Collision.new :some_window, :this, :that, &@definition
|
57
|
+
end
|
58
|
+
it "should use the complex packaging" do
|
59
|
+
@collision.should_receive(:complex_package).once.with @definition
|
60
|
+
|
61
|
+
@collision.package @definition
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context 'definition with no params' do
|
65
|
+
before(:each) do
|
66
|
+
@definition = lambda { }
|
67
|
+
@collision = Collision.new :some_window, :this, :that, &@definition
|
68
|
+
end
|
69
|
+
it "should use the simple packaging" do
|
70
|
+
@collision.should_receive(:simple_package).once.with @definition
|
71
|
+
|
72
|
+
@collision.package @definition
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "constants" do
|
78
|
+
it "should be nil" do
|
79
|
+
Collision::None.should == nil
|
80
|
+
end
|
81
|
+
it "should be an empty lambda" do
|
82
|
+
Collision::Simple.call # well, Collision should not receive anything
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 3
|
9
|
+
version: 0.2.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Florian Hanke
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-12 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- Rakefile
|
54
54
|
- VERSION
|
55
55
|
- generator/gogogosu.rb
|
56
|
+
- lib/core/collision.rb
|
56
57
|
- lib/core/control.rb
|
57
58
|
- lib/core/controls.rb
|
58
59
|
- lib/core/environment.rb
|
@@ -122,6 +123,7 @@ signing_key:
|
|
122
123
|
specification_version: 3
|
123
124
|
summary: Default extensions built onto the popular Gosu Framework. Uses Chipmunk for game physics. That's it for now. I'm working on them. Anyway, GAME ON!
|
124
125
|
test_files:
|
126
|
+
- spec/lib/core/collision_spec.rb
|
125
127
|
- spec/lib/core/control_spec.rb
|
126
128
|
- spec/lib/core/controls_spec.rb
|
127
129
|
- spec/lib/core/initializer_hooks_spec.rb
|