rubyhop 1.3.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f49ae37a43dabdb45883f90788300e3deb68d15c
4
- data.tar.gz: 4e8dea45396416c59c68131ddfca22814279f3e4
3
+ metadata.gz: 9a79c2be24346b3a2b05d7a5faa1a11468f0718d
4
+ data.tar.gz: 3c4c10013ba91b663be0b2edb21179fb101e3616
5
5
  SHA512:
6
- metadata.gz: c3658819821ab3f4090d0319baa159e51303ccee5e84933ce8fb1eb4d4a572d8a62edd0ecb1aa066165437f752eb341f47c1311c932d6745819ebb65dfb0e694
7
- data.tar.gz: 6442fccc3f1e83da0262d2bac2b15582710ec94989c4fd2abc7f5505db3af697a76be560d510e6960ab636dc21570234f9a33a1e217cc9489f66596c609bf8f6
6
+ metadata.gz: b0c2033ee10d5375b6df619e3cd35310644274eebc51f0397dae6a57ff8e2665f2c6558b0163585c90027d10b0da7535a8f55c7f310f1abc0ba2269d60b18150
7
+ data.tar.gz: 861d015e110241042a446371981cf3e53fb6b038c3daf7257a2631b19e71d8a0ed1e91aaf1a859ff617f050aedaa0ff8698f0484088c6c1a0d6bad870ea4cca1
data/Manifest.txt CHANGED
@@ -4,14 +4,17 @@ Manifest.txt
4
4
  README.txt
5
5
  Rakefile
6
6
  bin/rubyhop
7
- lib/background.png
8
- lib/gameover.mp3
9
- lib/hoop.png
10
- lib/hop.mp3
11
- lib/music.mp3
12
- lib/rubyguy-dead.png
13
- lib/rubyguy-fall.png
14
- lib/rubyguy-rise.png
15
- lib/rubyguy.png
16
7
  lib/rubyhop.rb
8
+ lib/rubyhop/assets/background.png
9
+ lib/rubyhop/assets/gameover.mp3
10
+ lib/rubyhop/assets/hoop.png
11
+ lib/rubyhop/assets/hop.mp3
12
+ lib/rubyhop/assets/music.mp3
13
+ lib/rubyhop/assets/rubyguy-dead.png
14
+ lib/rubyhop/assets/rubyguy-fall.png
15
+ lib/rubyhop/assets/rubyguy-rise.png
16
+ lib/rubyhop/assets/rubyguy.png
17
+ lib/rubyhop/hoop.rb
18
+ lib/rubyhop/level.rb
19
+ lib/rubyhop/player.rb
17
20
  test/test_rubyhop.rb
data/Rakefile CHANGED
@@ -21,5 +21,5 @@ end
21
21
 
22
22
  desc "Run the game"
23
23
  task :run do
24
- `ruby -Ilib -e "require 'rubyhop'; RubyhopGame.new.show"`
24
+ `ruby -Ilib -e "require 'rubyhop'; Rubyhop.play!"`
25
25
  end
data/bin/rubyhop CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
  require "rubyhop"
3
- RubyhopGame.new.show
3
+ Rubyhop.play!
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,23 @@
1
+ class Hoop
2
+ attr_accessor :x, :y, :active
3
+ def initialize
4
+ @hoop = Rubyhop.image "hoop.png"
5
+ # center of screen
6
+ @x = @y = 0
7
+ @active = true
8
+ end
9
+ def miss player
10
+ if (@x - player.x).abs < 12 &&
11
+ (@y - player.y).abs > 72
12
+ # the player missed the hoop
13
+ return true
14
+ end
15
+ false
16
+ end
17
+ def update movement
18
+ @x -= movement
19
+ end
20
+ def draw
21
+ @hoop.draw @x - 66, @y - 98, 1000 - @x
22
+ end
23
+ end
@@ -0,0 +1,181 @@
1
+ class Level
2
+ def initialize
3
+ # Add callback holders
4
+ @continue_callbacks = []
5
+ @quit_callbacks = []
6
+ @fail_callbacks = []
7
+ end
8
+
9
+ def on_continue &block
10
+ @continue_callbacks << block
11
+ end
12
+
13
+ def on_quit &block
14
+ @quit_callbacks << block
15
+ end
16
+
17
+ def on_fail &block
18
+ @fail_callbacks << block
19
+ end
20
+
21
+ def continue!
22
+ @continue_callbacks.each { |c| c.call }
23
+ end
24
+
25
+ def quit!
26
+ @quit_callbacks.each { |c| c.call }
27
+ end
28
+
29
+ def fail!
30
+ @fail_callbacks.each { |c| c.call }
31
+ end
32
+
33
+ def start!
34
+ raise "Must override"
35
+ end
36
+
37
+ def update
38
+ raise "Must override"
39
+ end
40
+
41
+ def draw
42
+ raise "Must override"
43
+ end
44
+ end
45
+
46
+
47
+ class HopLevel < Level
48
+ attr_accessor :movement, :score
49
+ def initialize
50
+ super
51
+ @music = Rubyhop.song "music.mp3"
52
+ @music.play true
53
+ @player = Player.new
54
+ @hoops = 6.times.map { Hoop.new }
55
+ init_hoops!
56
+ @movement = 3
57
+ end
58
+
59
+ def start!
60
+ @score = 0
61
+ @movement = 3
62
+ @player.start!
63
+ init_hoops!
64
+ end
65
+
66
+ def init_hoops!
67
+ @hoops.each do |hoop|
68
+ hoop.y = 325
69
+ end
70
+ hoop_start = 400
71
+ @hoops.each do |hoop|
72
+ reset_hoop! hoop
73
+ hoop_start += 200
74
+ hoop.x = hoop_start
75
+ end
76
+ end
77
+
78
+ def reset_hoop! hoop
79
+ idx = @hoops.index hoop
80
+ prev = @hoops[idx - 1]
81
+ new_y = ((prev.y-150..prev.y+125).to_a & (150..500).to_a).sample
82
+ hoop.x += 1200
83
+ hoop.y = new_y
84
+ hoop.active = true
85
+ end
86
+
87
+ def button_down id
88
+ quit! if id == Gosu::KbEscape
89
+ @player.hop if id == Gosu::KbSpace
90
+ end
91
+
92
+ def update
93
+ @movement += 0.0025
94
+ @player.update
95
+ if @player.offscreen?
96
+ # kick out to loading screen to try again?
97
+ fail!
98
+ end
99
+ @hoops.each do |hoop|
100
+ hoop.update @movement
101
+ reset_hoop!(hoop) if hoop.x < -200
102
+ @player.die! if hoop.miss @player
103
+ # increase score and flag as inactive
104
+ if hoop.active && @player.alive && hoop.x < @player.x
105
+ @score += 1
106
+ hoop.active = false
107
+ end
108
+ end
109
+ end
110
+
111
+ def draw
112
+ @player.draw
113
+ @hoops.each(&:draw)
114
+ draw_score
115
+ end
116
+
117
+ def draw_score
118
+ Rubyhop.score_font.draw "Score: #{@score}", 700, 10, 1, 1.0, 1.0, Gosu::Color::RED
119
+ end
120
+ end
121
+
122
+ class MessageLevel < Level
123
+ def initialize
124
+ super
125
+ @rubyguy = Rubyhop.image "rubyguy.png"
126
+
127
+ create_image!
128
+ end
129
+
130
+ def message
131
+ "This is a dumb message, you should override it"
132
+ end
133
+
134
+ def create_image!
135
+ @msg = Rubyhop.text_image message
136
+ end
137
+
138
+ def start!
139
+ create_image!
140
+ end
141
+
142
+ def update
143
+ quit! if Rubyhop.button_down? Gosu::KbEscape
144
+ continue! if ( Rubyhop.button_down?(Gosu::KbSpace) ||
145
+ Rubyhop.button_down?(Gosu::KbReturn) ||
146
+ Rubyhop.button_down?(Gosu::KbEnter) )
147
+ end
148
+
149
+ def draw
150
+ c = Math.cos(Rubyhop.time*4)
151
+ half_w = Rubyhop.width / 2
152
+ half_h = Rubyhop.height / 2
153
+ scale = 1.0+c*0.1
154
+ @rubyguy.draw_rot(half_w, half_h - 80, 1,
155
+ 0, 0.5, 0.5, scale, scale)
156
+
157
+ s = Math.sin Rubyhop.time
158
+ scale = 1.0+(0.1*s**3).abs
159
+ @msg.draw_rot( (half_w + (100*(s)).to_i),
160
+ (half_h + 160 + (50*s**3).abs),
161
+ 1, s*5, 0.5, 0.5, scale, scale,
162
+ Gosu::Color::RED )
163
+ end
164
+ end
165
+
166
+ class TitleLevel < MessageLevel
167
+ def message
168
+ "Stay alive by hopping!\n" +
169
+ "Press SPACE to hop!\n" +
170
+ "Press ESCAPE to close."
171
+ end
172
+ end
173
+
174
+ class FailLevel < MessageLevel
175
+ def message
176
+ "You scored #{Rubyhop.score}.\n" +
177
+ "Your high score is #{Rubyhop.high_score}.\n" +
178
+ "Press SPACE if you dare to continue...\n" +
179
+ "Or ESCAPE if it is just too much for you."
180
+ end
181
+ end
@@ -0,0 +1,60 @@
1
+ class Player
2
+ attr_accessor :x, :y, :alive
3
+ def initialize
4
+ # position
5
+ start!
6
+ @gravity = -0.25
7
+ @hop = 7.5
8
+ # sounds
9
+ @sound = Rubyhop.sound "hop.mp3"
10
+ @gameover = Rubyhop.sound "gameover.mp3"
11
+ # images
12
+ @rise = Rubyhop.image "rubyguy-rise.png"
13
+ @fall = Rubyhop.image "rubyguy-fall.png"
14
+ @dead = Rubyhop.image "rubyguy-dead.png"
15
+ end
16
+ def hop
17
+ if @alive
18
+ @sound.play
19
+ @velocity += @hop
20
+ end
21
+ end
22
+ def start!
23
+ @x = Rubyhop.width / 3
24
+ @y = Rubyhop.height / 2
25
+ @velocity = 0.0
26
+ @alive = true
27
+ end
28
+ def die!
29
+ if @alive
30
+ # Set velocity to one last hop
31
+ @velocity = 5.0
32
+ @gameover.play
33
+ @alive = false
34
+ end
35
+ end
36
+ def update
37
+ @velocity += @gravity
38
+ @y -= @velocity
39
+ if @alive && (@y < 32 || @y > Rubyhop.height - 32)
40
+ die!
41
+ end
42
+ end
43
+ def offscreen?
44
+ @y > 1000
45
+ end
46
+ def draw
47
+ image.draw @x - 32, @y - 32, 1000 - @x
48
+ end
49
+ def image
50
+ if @alive
51
+ if @velocity >= 0
52
+ @rise
53
+ else
54
+ @fall
55
+ end
56
+ else
57
+ @dead
58
+ end
59
+ end
60
+ end
data/lib/rubyhop.rb CHANGED
@@ -1,330 +1,87 @@
1
1
  require "gosu"
2
+ require "singleton"
3
+ require "rubyhop/level"
4
+ require "rubyhop/player"
5
+ require "rubyhop/hoop"
2
6
 
3
7
  def get_my_file file
4
- "#{File.dirname(__FILE__)}/#{file}"
8
+ "#{File.dirname(__FILE__)}/rubyhop/assets/#{file}"
5
9
  end
6
10
 
7
- class Player
8
- attr_accessor :x, :y, :alive
9
- def initialize level
10
- @level = level
11
- @window = @level.window
12
- # position
13
- start!
14
- @gravity = -0.25
15
- @hop = 7.5
16
- # sounds
17
- @sound = Gosu::Sample.new @window, get_my_file("hop.mp3")
18
- @gameover = Gosu::Sample.new @window, get_my_file("gameover.mp3")
19
- # images
20
- @rise = Gosu::Image.new @window, get_my_file("rubyguy-rise.png")
21
- @fall = Gosu::Image.new @window, get_my_file("rubyguy-fall.png")
22
- @dead = Gosu::Image.new @window, get_my_file("rubyguy-dead.png")
23
- end
24
- def hop
25
- if @alive
26
- @sound.play
27
- @velocity += @hop
28
- end
29
- end
30
- def start!
31
- @x = @window.width/3
32
- @y = @window.height/2
33
- @velocity = 0.0
34
- @alive = true
35
- end
36
- def die!
37
- if @alive
38
- # Set velocity to one last hop
39
- @velocity = 5.0
40
- @gameover.play
41
- @alive = false
42
- end
43
- end
44
- def update
45
- @velocity += @gravity
46
- @y -= @velocity
47
- if @alive && (@y < 32 || @y > @window.height - 32)
48
- die!
49
- end
50
- if @y > 1000
51
- # kick out to loading screen to try again?
52
- @level.fail!
53
- end
54
- end
55
- def draw
56
- image.draw @x - 32, @y - 32, 1000 - @x
57
- end
58
- def image
59
- if @alive
60
- if @velocity >= 0
61
- @rise
62
- else
63
- @fall
64
- end
65
- else
66
- @dead
67
- end
11
+ class Sound < Gosu::Sample
12
+ def initialize filename
13
+ super Rubyhop.instance, get_my_file(filename)
68
14
  end
69
15
  end
70
16
 
71
- class Hoop
72
- attr_accessor :x, :y, :active
73
- def initialize level
74
- @level = level
75
- @window = @level.window
76
- @hoop = Gosu::Image.new @window, get_my_file("hoop.png")
77
- # center of screen
78
- @x = @y = 0
79
- @active = true
80
- end
81
- def miss player
82
- if (@x - player.x).abs < 12 &&
83
- (@y - player.y).abs > 72
84
- # the player missed the hoop
85
- return true
86
- end
87
- false
88
- end
89
- def update
90
- @x -= @level.movement
91
- end
92
- def draw
93
- @hoop.draw @x - 66, @y - 98, 1000 - @x
94
- end
95
- end
96
-
97
- class HopLevel
98
- attr_accessor :window, :movement, :score
99
- def initialize window
100
- @window = window
101
- @music = Gosu::Song.new @window, get_my_file("music.mp3")
102
- @music.play true
103
- @player = Player.new self
104
- @hoops = 6.times.map { Hoop.new self }
105
- init_hoops!
106
- @font = Gosu::Font.new @window, Gosu::default_font_name, 20
107
- @movement = 3
108
-
109
- # Add callback holders
110
- @fail_callbacks = []
111
- @quit_callbacks = []
112
- end
113
-
114
- def on_fail &block
115
- @fail_callbacks << block
116
- end
117
-
118
- def on_quit &block
119
- @quit_callbacks << block
120
- end
121
-
122
- def start!
123
- @score = 0
124
- @movement = 3
125
- @player.start!
126
- init_hoops!
127
- end
128
-
129
- def fail!
130
- @fail_callbacks.each { |c| c.call }
131
- end
132
-
133
- def quit!
134
- @quit_callbacks.each { |c| c.call }
135
- end
136
-
137
- def init_hoops!
138
- @hoops.each do |hoop|
139
- hoop.y = 325
140
- end
141
- hoop_start = 400
142
- @hoops.each do |hoop|
143
- reset_hoop! hoop
144
- hoop_start += 200
145
- hoop.x = hoop_start
146
- end
147
- end
148
-
149
- def reset_hoop! hoop
150
- idx = @hoops.index hoop
151
- prev = @hoops[idx - 1]
152
- new_y = ((prev.y-150..prev.y+125).to_a & (150..500).to_a).sample
153
- hoop.x += 1200
154
- hoop.y = new_y
155
- hoop.active = true
156
- end
157
-
158
- def button_down id
159
- quit! if id == Gosu::KbEscape
160
- @player.hop if id == Gosu::KbSpace
161
- end
162
-
163
- def update
164
- @movement += 0.0025
165
- @player.update
166
- @hoops.each do |hoop|
167
- hoop.update
168
- reset_hoop!(hoop) if hoop.x < -200
169
- @player.die! if hoop.miss @player
170
- # increase score and flag as inactive
171
- if hoop.active && @player.alive && hoop.x < @player.x
172
- @score += 1
173
- hoop.active = false
174
- end
175
- end
176
- end
177
-
178
- def draw
179
- @player.draw
180
- @hoops.each &:draw
181
- @font.draw "Score: #{@score}", 700, 10, 1, 1.0, 1.0, Gosu::Color::RED
17
+ class Song < Gosu::Song
18
+ def initialize filename
19
+ super Rubyhop.instance, get_my_file(filename)
182
20
  end
183
21
  end
184
22
 
185
- class TitleLevel
186
- attr_accessor :window
187
- def initialize window
188
- @window = window
189
- @rubyguy = Gosu::Image.new @window, get_my_file("rubyguy.png")
190
-
191
- create_image!
192
-
193
- # Add callback holders
194
- @continue_callbacks = []
195
- @quit_callbacks = []
196
- end
197
-
198
- def create_image!
199
- @msg = Gosu::Image.from_text @window,
200
- "Stay alive by hopping!\n" +
201
- "Press SPACE to hop!\n" +
202
- "Press ESCAPE to close.",
203
- Gosu::default_font_name, 24
204
- @msg_x = @window.width/2 - @msg.width/2
205
- @msg_y = @window.height * 2 / 3
206
- end
207
-
208
- def on_continue &block
209
- @continue_callbacks << block
210
- end
211
-
212
- def on_quit &block
213
- @quit_callbacks << block
214
- end
215
-
216
- def continue!
217
- @continue_callbacks.each { |c| c.call }
23
+ class Image < Gosu::Image
24
+ attr_accessor :filename
25
+ def initialize filename
26
+ @filename = filename
27
+ super Rubyhop.instance, get_my_file(filename)
218
28
  end
219
29
 
220
- def quit!
221
- @quit_callbacks.each { |c| c.call }
222
- end
223
-
224
- def start!
225
- create_image!
226
- end
227
-
228
- def update
229
- quit! if @window.button_down? Gosu::KbEscape
230
- continue! if ( @window.button_down?(Gosu::KbSpace) ||
231
- @window.button_down?(Gosu::KbReturn) ||
232
- @window.button_down?(Gosu::KbEnter) )
233
- end
234
-
235
- def draw
236
- c = Math.cos(@window.time*4)
237
- @rubyguy.draw_rot(((@window.width)/2), ((@window.height)/2 - 80), 1, 0,
238
- 0.5, 0.5, 1.0+c*0.1, 1.0+c*0.1)
239
- s = Math.sin @window.time
240
- @msg.draw_rot( ((@window.width)/2 + (100*(s)).to_i),
241
- ((@window.height)/2 + 160 + s*s*s.abs*50),
242
- 1, s*5, 0.5, 0.5,
243
- 1.0+(0.1*s*s*s.abs), 1.0+(0.1*s*s*s.abs),
244
- Gosu::Color::RED )
30
+ def self.from_text message, font = Gosu::default_font_name, size = 24
31
+ super Rubyhop.instance, message, font, size
245
32
  end
246
33
  end
247
34
 
248
- class FailLevel
249
- attr_accessor :window
250
- def initialize window
251
- @window = window
252
- @rubyguy = Gosu::Image.new @window, get_my_file("rubyguy.png")
35
+ class Rubyhop < Gosu::Window
36
+ VERSION = "1.4.0"
253
37
 
254
- create_image!
38
+ include Singleton
255
39
 
256
- # Add callback holders
257
- @continue_callbacks = []
258
- @quit_callbacks = []
259
- end
260
-
261
- def create_image!
262
- @msg = Gosu::Image.from_text @window,
263
- "You scored #{@window.score}.\n" +
264
- "Your high score is #{@window.high_score}.\n" +
265
- "Press SPACE if you dare to continue...\n" +
266
- "Or ESCAPE if it is just too much for you.",
267
- Gosu::default_font_name, 24
268
- @msg_x = @window.width/2 - @msg.width/2
269
- @msg_y = @window.height * 2 / 3
270
- end
40
+ attr_reader :time, :sounds, :score, :high_score
271
41
 
272
- def on_continue &block
273
- @continue_callbacks << block
42
+ def self.image filename
43
+ Image.new filename
274
44
  end
275
45
 
276
- def on_quit &block
277
- @quit_callbacks << block
46
+ def self.text_image message, font = Gosu::default_font_name, size = 24
47
+ Image.from_text message, font, size
278
48
  end
279
49
 
280
- def continue!
281
- @continue_callbacks.each { |c| c.call }
50
+ def self.song filename
51
+ Song.new filename
282
52
  end
283
53
 
284
- def quit!
285
- @quit_callbacks.each { |c| c.call }
54
+ def self.sound filename
55
+ Sound.new filename
286
56
  end
287
57
 
288
- def start!
289
- create_image!
58
+ def self.score_font
59
+ @@font ||= Gosu::Font.new Rubyhop.instance, Gosu::default_font_name, 20
290
60
  end
291
61
 
292
- def update
293
- quit! if @window.button_down? Gosu::KbEscape
294
- continue! if ( @window.button_down?(Gosu::KbSpace) ||
295
- @window.button_down?(Gosu::KbReturn) ||
296
- @window.button_down?(Gosu::KbEnter) )
62
+ def self.play!
63
+ self.instance.setup.show
297
64
  end
298
65
 
299
- def draw
300
- c = Math.cos(@window.time*4)
301
- @rubyguy.draw_rot(((@window.width)/2), ((@window.height)/2 - 80), 1, 0,
302
- 0.5, 0.5, 1.0+c*0.1, 1.0+c*0.1)
303
- s = Math.sin @window.time
304
- @msg.draw_rot( ((@window.width)/2 + (100*(s)).to_i),
305
- ((@window.height)/2 + 160 + s*s*s.abs*50),
306
- 1, s*5, 0.5, 0.5,
307
- 1.0+(0.1*s*s*s.abs), 1.0+(0.1*s*s*s.abs),
308
- Gosu::Color::RED )
66
+ def self.method_missing method, *args
67
+ self.instance.send(method, *args)
309
68
  end
310
- end
311
69
 
312
- class RubyhopGame < Gosu::Window
313
- VERSION = "1.3.1"
314
- attr_reader :time, :sounds, :score, :high_score
315
70
  def initialize width=800, height=600, fullscreen=false
316
71
  super
72
+ end
317
73
 
74
+ def setup
318
75
  self.caption = "Ruby Hop - #{VERSION}"
319
- @background = Gosu::Image.new self, get_my_file("background.png")
76
+ @background = Rubyhop.image "background.png"
320
77
 
321
78
  # Scores
322
79
  @score = @high_score = 0
323
80
 
324
81
  # Levels
325
- @title = TitleLevel.new self
326
- @hop = HopLevel.new self
327
- @fail = FailLevel.new self
82
+ @title = TitleLevel.new
83
+ @hop = HopLevel.new
84
+ @fail = FailLevel.new
328
85
 
329
86
  @title.on_continue { play! }
330
87
  @title.on_quit { close }
@@ -336,6 +93,7 @@ class RubyhopGame < Gosu::Window
336
93
  @fail.on_quit { close }
337
94
 
338
95
  title!
96
+ self
339
97
  end
340
98
 
341
99
  def title!
data/test/test_rubyhop.rb CHANGED
@@ -1,8 +1,120 @@
1
- require "test/unit"
1
+ require "minitest/autorun"
2
2
  require "rubyhop"
3
3
 
4
- class TestRubyhop < Test::Unit::TestCase
4
+ class TestRubyhop < MiniTest::Test
5
5
  def test_sanity
6
6
  flunk "write tests or I will kneecap you"
7
7
  end
8
8
  end
9
+
10
+ class TestLevel < MiniTest::Test
11
+
12
+ def setup
13
+ @callbacks = {quit: 0, fail: 0, continue: 0}
14
+ @level = Level.new
15
+ @level.on_quit { @callbacks[:quit] += 1 }
16
+ @level.on_fail { @callbacks[:fail] += 1 }
17
+ @level.on_continue { @callbacks[:continue] += 1 }
18
+ end
19
+
20
+ def test_fail
21
+ assert_equal 0, @callbacks[:fail]
22
+ @level.fail!
23
+ assert_equal 1, @callbacks[:fail]
24
+ @level.fail!
25
+ @level.fail!
26
+ assert_equal 3, @callbacks[:fail]
27
+ end
28
+
29
+ def test_quit
30
+ assert_equal 0, @callbacks[:quit]
31
+ @level.quit!
32
+ assert_equal 1, @callbacks[:quit]
33
+ @level.quit!
34
+ @level.quit!
35
+ assert_equal 3, @callbacks[:quit]
36
+ end
37
+
38
+ def test_continue
39
+ assert_equal 0, @callbacks[:continue]
40
+ @level.continue!
41
+ assert_equal 1, @callbacks[:continue]
42
+ @level.continue!
43
+ @level.continue!
44
+ assert_equal 3, @callbacks[:continue]
45
+ end
46
+
47
+ def test_raises
48
+ assert_raises RuntimeError do
49
+ @level.start!
50
+ end
51
+ assert_raises RuntimeError do
52
+ @level.update
53
+ end
54
+ assert_raises RuntimeError do
55
+ @level.draw
56
+ end
57
+ end
58
+ end
59
+
60
+ class TestPlayer < MiniTest::Test
61
+
62
+ def setup
63
+ @player = Player.new
64
+ end
65
+
66
+ def test_initialization
67
+ assert_equal 266, @player.x
68
+ assert_equal 300, @player.y
69
+ assert_equal true, @player.alive
70
+ assert_equal 'rubyguy-rise.png', @player.image.filename
71
+ end
72
+
73
+ def test_hop
74
+ @player.hop
75
+ @player.update
76
+ assert_equal 266, @player.x
77
+ assert_equal 292.75, @player.y
78
+ end
79
+
80
+ def test_gravity
81
+ 3.times do
82
+ @player.update
83
+ end
84
+ assert_equal 'rubyguy-fall.png', @player.image.filename
85
+ end
86
+
87
+ def test_die_bang
88
+ @player.die!
89
+ assert_equal false, @player.alive
90
+ assert_equal 'rubyguy-dead.png', @player.image.filename
91
+ end
92
+
93
+ def test_offscreen_eh
94
+ assert_equal false, @player.offscreen?
95
+ 140.times do
96
+ @player.update
97
+ end
98
+ assert_equal true, @player.offscreen?
99
+ end
100
+ end
101
+
102
+ class TestHoop < MiniTest::Test
103
+
104
+ def setup
105
+ @hoop = Hoop.new
106
+ end
107
+
108
+ def test_initialize
109
+ assert_equal 0, @hoop.x
110
+ assert_equal 0, @hoop.y
111
+ assert_equal true, @hoop.active
112
+ end
113
+
114
+ def test_update
115
+ @hoop.update 10
116
+ assert_equal -10, @hoop.x
117
+ assert_equal 0, @hoop.y
118
+ end
119
+
120
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyhop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-10 00:00:00.000000000 Z
11
+ date: 2014-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -70,16 +70,19 @@ files:
70
70
  - README.txt
71
71
  - Rakefile
72
72
  - bin/rubyhop
73
- - lib/background.png
74
- - lib/gameover.mp3
75
- - lib/hoop.png
76
- - lib/hop.mp3
77
- - lib/music.mp3
78
- - lib/rubyguy-dead.png
79
- - lib/rubyguy-fall.png
80
- - lib/rubyguy-rise.png
81
- - lib/rubyguy.png
82
73
  - lib/rubyhop.rb
74
+ - lib/rubyhop/assets/background.png
75
+ - lib/rubyhop/assets/gameover.mp3
76
+ - lib/rubyhop/assets/hoop.png
77
+ - lib/rubyhop/assets/hop.mp3
78
+ - lib/rubyhop/assets/music.mp3
79
+ - lib/rubyhop/assets/rubyguy-dead.png
80
+ - lib/rubyhop/assets/rubyguy-fall.png
81
+ - lib/rubyhop/assets/rubyguy-rise.png
82
+ - lib/rubyhop/assets/rubyguy.png
83
+ - lib/rubyhop/hoop.rb
84
+ - lib/rubyhop/level.rb
85
+ - lib/rubyhop/player.rb
83
86
  - test/test_rubyhop.rb
84
87
  homepage: http://blowmage.com/rubyhop
85
88
  licenses:
@@ -103,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
106
  version: '0'
104
107
  requirements: []
105
108
  rubyforge_project: rubyhop
106
- rubygems_version: 2.2.0
109
+ rubygems_version: 2.2.2
107
110
  signing_key:
108
111
  specification_version: 4
109
112
  summary: Super awesome Ruby-themed game