-
Notifications
You must be signed in to change notification settings - Fork 0
/
asteroids.rb
105 lines (82 loc) · 2.46 KB
/
asteroids.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
require 'optparse'
require 'gosu'
require_relative 'asteroid'
require_relative 'bullet'
require_relative 'explosion'
require_relative 'fire'
require_relative 'player'
require_relative 'star'
class SampleWindow < Gosu::Window
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
def initialize(options)
super SCREEN_WIDTH, SCREEN_HEIGHT
@instance = self
self.caption = 'Sample Game'
@options = options
@background_image = Gosu::Image.new('media/space.jpg', tileable: true)
@player = Player.new
@player.warp(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)
@star_anim = Gosu::Image.load_tiles('media/star.png', 25, 25)
@stars = []
@font = Gosu::Font.new(20)
@asteroid_img = Gosu::Image.new('media/asteroid.png')
@asteroids = []
end
def update
@player.turn_left if go_left?
@player.turn_right if go_right?
@player.accelerate if go_forward?
@player.move
@player.collect_stars(@stars)
@player.kill_asteroids(@asteroids, @asteroid_img)
@stars.push(Star.new(@star_anim)) if add_star?
@stars.each(&:update)
@asteroids.push(Asteroid.new(@asteroid_img)) if add_asteroid?
@asteroids.each(&:update)
end
def draw
@player.draw
@background_image.draw(0, 0, 0)
@stars.each(&:draw)
@asteroids.each(&:draw)
@font.draw("Score: #{@player.score}", 10, 10, ZOrder::UI, 1.0, 1.0, 0xff_ffff00)
return unless @options[:debug]
# DEBUG CODE STARTS HERE
@font.draw("Stars: #{@stars.size}", 700, 10, ZOrder::UI, 1.0, 1.0, 0xff_ffff00)
@font.draw("FPS: #{1000.0 / update_interval}", 700, 550, ZOrder::UI, 1.0, 1.0, 0xff_ffff00)
end
def button_down(id)
close if id == Gosu::KbEscape
@player.fire_bullet if id == Gosu::KbSpace
end
private
def add_star?
rand(100) < 4 && @stars.size < 250
end
def add_asteroid?
(rand(100) < 4) && (@asteroids.select(&:main_asteroid).size < 3)
end
def go_left?
(Gosu.button_down? Gosu::KbLeft) || (Gosu.button_down? Gosu::GpLeft)
end
def go_right?
(Gosu.button_down? Gosu::KbRight) || (Gosu.button_down? Gosu::GpRight)
end
def go_forward?
(Gosu.button_down? Gosu::KbUp) || (Gosu.button_down? Gosu::GpButton0)
end
end
module ZOrder
BACKGROUND, STARS, PLAYER, UI = *0..3
end
options = {}
OptionParser.new do |opts|
opts.banner = 'Usage: sample.rb [options]'
opts.on('-d', '--debug', 'Show debug info') do |v|
options[:debug] = v
end
end.parse!
puts options if options[:debug]
window = SampleWindow.new(options)
window.show