rubyhop 1.3.1 → 1.4.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 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