gosu-examples 1.0.3 → 1.0.4
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 +4 -4
- data/README.md +23 -7
- data/bin/gosu-examples +22 -22
- data/examples/chipmunk_and_rmagick.rb +6 -6
- data/examples/chipmunk_integration.rb +16 -21
- data/examples/cptn_ruby.rb +18 -13
- data/examples/media/header@2x.psd +0 -0
- data/examples/opengl_integration.rb +9 -9
- data/examples/rmagick_integration.rb +18 -16
- data/examples/tutorial.rb +27 -22
- data/examples/welcome.rb +7 -6
- data/lib/gosu-examples/example.rb +8 -25
- data/lib/gosu-examples/sidebar.rb +6 -6
- metadata +27 -28
- data/examples/media/header.psd +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 888d1aceda91b77fb517e8b8bcf29c0465b0db10
|
4
|
+
data.tar.gz: b078a35fb710a436a9c1a0f1df81a01e3483a28e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90eddc66bbd574cf91b55c8c61c7796ad4146612d14c5f72c092643ae03bcacfe0dbda96e6296c9c75051ba99c1880d088d8dd049f7d06bfde4ea5da71c7f658
|
7
|
+
data.tar.gz: 9ca2489faf897835cd19a248c23f500d250ecf95a385873b8ee728ccdef028a47fba38b172870837a0bb94cab5ea924d0bc0e51a9fb77ca6134d907bdc7d24f7
|
data/README.md
CHANGED
@@ -1,14 +1,30 @@
|
|
1
1
|
Gosu Examples
|
2
2
|
=============
|
3
3
|
|
4
|
-
|
4
|
+
<img src="screenshot.png" width="526">
|
5
5
|
|
6
|
-
|
6
|
+
This is a collection of Ruby example games for the [Gosu library](https://www.libgosu.org/).
|
7
7
|
|
8
|
-
|
8
|
+
(You can find C++ examples in the [main gosu repository](https://github.com/gosu/gosu/tree/master/examples).)
|
9
9
|
|
10
|
-
|
11
|
-
`gem install rmagick`
|
12
|
-
`gem install opengl`
|
10
|
+
To install and run the `gosu-examples` gem:
|
13
11
|
|
14
|
-
|
12
|
+
```bash
|
13
|
+
gem install gosu-examples
|
14
|
+
gosu-examples
|
15
|
+
```
|
16
|
+
|
17
|
+
You can also [download and unpack this repository](https://github.com/gosu/gosu-examples/archive/master.zip) and then run individual examples from the terminal:
|
18
|
+
|
19
|
+
```bash
|
20
|
+
cd gosu-examples-master/examples
|
21
|
+
ruby tutorial.rb
|
22
|
+
```
|
23
|
+
|
24
|
+
Some examples require the following additional libraries:
|
25
|
+
|
26
|
+
```bash
|
27
|
+
gem install chipmunk
|
28
|
+
gem install rmagick
|
29
|
+
gem install opengl
|
30
|
+
```
|
data/bin/gosu-examples
CHANGED
@@ -10,25 +10,20 @@ $LOAD_PATH << "#{File.dirname __FILE__}/../lib/gosu-examples"
|
|
10
10
|
require 'example'
|
11
11
|
require 'sidebar'
|
12
12
|
|
13
|
-
Example.load_examples "
|
13
|
+
Example.load_examples "*.rb"
|
14
14
|
|
15
15
|
class ExampleBox < Gosu::Window
|
16
|
-
# TODO - the ExampleWindow should resize to fit once Gosu::Window#resize has been added.
|
17
|
-
# See https://github.com/jlnr/gosu/issues/255
|
18
|
-
EXAMPLE_WIDTH = 600
|
19
|
-
EXAMPLE_HEIGHT = 600
|
20
|
-
|
21
16
|
def initialize
|
22
|
-
super Sidebar::WIDTH
|
17
|
+
super Sidebar::WIDTH, Sidebar::HEIGHT, :fullscreen => ARGV.include?('--fullscreen')
|
23
18
|
|
24
19
|
@sidebar = Sidebar.new { |example| change_example(example) }
|
25
20
|
|
26
21
|
welcome_class = Example.examples.find { |example| example.name =~ /::Welcome$/ }
|
27
|
-
|
22
|
+
change_example(welcome_class)
|
28
23
|
end
|
29
24
|
|
30
25
|
def update
|
31
|
-
self.caption = "Gosu Example Box - #{@current_example.caption} (#{Gosu
|
26
|
+
self.caption = "Gosu Example Box - #{@current_example.caption} (#{Gosu.fps} FPS)"
|
32
27
|
|
33
28
|
@current_example.update
|
34
29
|
end
|
@@ -36,9 +31,9 @@ class ExampleBox < Gosu::Window
|
|
36
31
|
def draw
|
37
32
|
@current_example.draw
|
38
33
|
|
39
|
-
flush
|
34
|
+
Gosu.flush
|
40
35
|
|
41
|
-
translate(
|
36
|
+
Gosu.translate(@current_example.width, 0) do
|
42
37
|
current_filename = @current_example.class.source_file
|
43
38
|
@sidebar.draw(current_filename)
|
44
39
|
end
|
@@ -46,23 +41,26 @@ class ExampleBox < Gosu::Window
|
|
46
41
|
|
47
42
|
def button_down(id)
|
48
43
|
case id
|
49
|
-
when Gosu::
|
44
|
+
when Gosu::KB_ESCAPE
|
50
45
|
close
|
51
|
-
when char_to_button_id('
|
52
|
-
if filename = @current_example.class.source_file
|
46
|
+
when Gosu.char_to_button_id('E')
|
47
|
+
if filename = @current_example.class.source_file
|
53
48
|
open_file_or_folder filename
|
54
49
|
end
|
55
|
-
when char_to_button_id('O')
|
56
|
-
if filename = @current_example.class.source_file
|
50
|
+
when Gosu.char_to_button_id('O')
|
51
|
+
if filename = @current_example.class.source_file
|
57
52
|
open_file_or_folder File.dirname(filename)
|
58
53
|
end
|
59
54
|
else
|
60
|
-
if id == Gosu::
|
61
|
-
@sidebar.click(mouse_x -
|
55
|
+
if id == Gosu::MS_LEFT and mouse_x >= @current_example.width
|
56
|
+
@sidebar.click(mouse_x - @current_example.width, mouse_y)
|
62
57
|
else
|
63
58
|
@current_example.button_down(id)
|
64
59
|
end
|
65
60
|
end
|
61
|
+
|
62
|
+
# Call super to enable alt+enter/cmd+F for toggling fullscreen mode.
|
63
|
+
super
|
66
64
|
end
|
67
65
|
|
68
66
|
def button_up(id)
|
@@ -76,18 +74,20 @@ class ExampleBox < Gosu::Window
|
|
76
74
|
private
|
77
75
|
|
78
76
|
def change_example(example)
|
79
|
-
if @current_example.class != example
|
77
|
+
if @current_example.class != example
|
80
78
|
@current_example = nil
|
81
79
|
GC.start
|
82
80
|
@current_example = example.new
|
81
|
+
self.width = @current_example.width + Sidebar::WIDTH
|
82
|
+
self.height = @current_example.height
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
86
|
def open_file_or_folder(filename)
|
87
|
-
if RUBY_PLATFORM =~ /darwin[0-9]*$/
|
87
|
+
if RUBY_PLATFORM =~ /darwin[0-9]*$/
|
88
88
|
`open '#{filename}'`
|
89
|
-
elsif RUBY_PLATFORM =~ /mingw[0-9]*$/
|
90
|
-
`explorer
|
89
|
+
elsif RUBY_PLATFORM =~ /mingw[0-9]*$/
|
90
|
+
`explorer "#{filename.gsub('/', '\\')}"`
|
91
91
|
else
|
92
92
|
`xdg-open '#{filename}'`
|
93
93
|
end
|
@@ -13,11 +13,11 @@ require 'rmagick'
|
|
13
13
|
|
14
14
|
# Layering of sprites
|
15
15
|
module ZOrder
|
16
|
-
|
16
|
+
BACKGROUND, BOX = *0..1
|
17
17
|
end
|
18
18
|
|
19
|
-
WIDTH =
|
20
|
-
HEIGHT =
|
19
|
+
WIDTH = 640
|
20
|
+
HEIGHT = 480
|
21
21
|
TICK = 1.0/60.0
|
22
22
|
NUM_POLYGONS = 80
|
23
23
|
NUM_SIDES = 4
|
@@ -63,7 +63,7 @@ class ChipmunkAndRMagick < (Example rescue Gosu::Window)
|
|
63
63
|
8.times do |j|
|
64
64
|
stagger = (j % 2) * 40
|
65
65
|
x = i * 80 + stagger
|
66
|
-
y =
|
66
|
+
y = j * 70 + 80
|
67
67
|
shape = CP::Shape::Poly.new(body, shape_vertices, CP::Vec2.new(x, y))
|
68
68
|
shape.e = 1
|
69
69
|
shape.u = 1
|
@@ -123,7 +123,7 @@ class ChipmunkAndRMagick < (Example rescue Gosu::Window)
|
|
123
123
|
|
124
124
|
# All the updating of the screen is done here.
|
125
125
|
def draw
|
126
|
-
@background_image.draw(0, 0, ZOrder::
|
126
|
+
@background_image.draw(0, 0, ZOrder::BACKGROUND)
|
127
127
|
@boxes.each { |box| box.draw }
|
128
128
|
end
|
129
129
|
end
|
@@ -145,7 +145,7 @@ class Box
|
|
145
145
|
end
|
146
146
|
|
147
147
|
def draw
|
148
|
-
@image.draw_rot(@body.p.x, @body.p.y, ZOrder::
|
148
|
+
@image.draw_rot(@body.p.x, @body.p.y, ZOrder::BOX, @body.a.radians_to_gosu)
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
@@ -12,8 +12,8 @@ require 'rubygems'
|
|
12
12
|
require 'gosu'
|
13
13
|
require 'chipmunk'
|
14
14
|
|
15
|
-
WIDTH =
|
16
|
-
HEIGHT =
|
15
|
+
WIDTH = 640
|
16
|
+
HEIGHT = 480
|
17
17
|
|
18
18
|
# The number of steps to process every Gosu update
|
19
19
|
# The Player ship can get going so fast as to "move through" a
|
@@ -68,19 +68,19 @@ class Player
|
|
68
68
|
# forward momentum by creating a vector in the direction of the facing
|
69
69
|
# and with a magnitude representing the force we want to apply
|
70
70
|
def accelerate
|
71
|
-
@shape.body.apply_force(
|
71
|
+
@shape.body.apply_force(@shape.body.rot * (3000.0/SUBSTEPS), CP::Vec2.new(0.0, 0.0))
|
72
72
|
end
|
73
73
|
|
74
74
|
# Apply even more forward force
|
75
75
|
# See accelerate for more details
|
76
76
|
def boost
|
77
|
-
@shape.body.apply_force(
|
77
|
+
@shape.body.apply_force(@shape.body.rot * (3000.0), CP::Vec2.new(0.0, 0.0))
|
78
78
|
end
|
79
79
|
|
80
80
|
# Apply reverse force
|
81
81
|
# See accelerate for more details
|
82
82
|
def reverse
|
83
|
-
@shape.body.apply_force(
|
83
|
+
@shape.body.apply_force(-@shape.body.rot * (1000.0/SUBSTEPS), CP::Vec2.new(0.0, 0.0))
|
84
84
|
end
|
85
85
|
|
86
86
|
# Wrap to the other side of the screen when we fly off the edge
|
@@ -92,13 +92,6 @@ class Player
|
|
92
92
|
def draw
|
93
93
|
@image.draw_rot(@shape.body.p.x, @shape.body.p.y, ZOrder::Player, @shape.body.a.radians_to_gosu)
|
94
94
|
end
|
95
|
-
|
96
|
-
private
|
97
|
-
|
98
|
-
# Convenience method for converting from radians to a Vec2 vector.
|
99
|
-
def radians_to_vec2(radians)
|
100
|
-
CP::Vec2.new(Math::cos(radians), Math::sin(radians))
|
101
|
-
end
|
102
95
|
end
|
103
96
|
|
104
97
|
# See how simple our Star is?
|
@@ -115,11 +108,11 @@ class Star
|
|
115
108
|
@shape = shape
|
116
109
|
@shape.body.p = CP::Vec2.new(rand * WIDTH, rand * HEIGHT) # position
|
117
110
|
@shape.body.v = CP::Vec2.new(0.0, 0.0) # velocity
|
118
|
-
@shape.body.a =
|
111
|
+
@shape.body.a = 0.gosu_to_radians # faces towards top of screen
|
119
112
|
end
|
120
113
|
|
121
114
|
def draw
|
122
|
-
img = @animation[Gosu
|
115
|
+
img = @animation[Gosu.milliseconds / 100 % @animation.size];
|
123
116
|
img.draw(@shape.body.p.x - img.width / 2.0, @shape.body.p.y - img.height / 2.0, ZOrder::Stars, 1, 1, @color, :add)
|
124
117
|
end
|
125
118
|
end
|
@@ -226,20 +219,20 @@ class ChipmunkIntegration < (Example rescue Gosu::Window)
|
|
226
219
|
@player.validate_position
|
227
220
|
|
228
221
|
# Check keyboard
|
229
|
-
if Gosu
|
222
|
+
if Gosu.button_down? Gosu::KB_LEFT
|
230
223
|
@player.turn_left
|
231
224
|
end
|
232
|
-
if Gosu
|
225
|
+
if Gosu.button_down? Gosu::KB_RIGHT
|
233
226
|
@player.turn_right
|
234
227
|
end
|
235
228
|
|
236
|
-
if Gosu
|
237
|
-
if Gosu
|
229
|
+
if Gosu.button_down? Gosu::KB_UP
|
230
|
+
if Gosu.button_down?(Gosu::KB_RIGHT_SHIFT) or Gosu.button_down?(Gosu::KB_LEFT_SHIFT)
|
238
231
|
@player.boost
|
239
232
|
else
|
240
233
|
@player.accelerate
|
241
234
|
end
|
242
|
-
elsif Gosu
|
235
|
+
elsif Gosu.button_down? Gosu::KB_DOWN
|
243
236
|
@player.reverse
|
244
237
|
end
|
245
238
|
|
@@ -249,7 +242,7 @@ class ChipmunkIntegration < (Example rescue Gosu::Window)
|
|
249
242
|
end
|
250
243
|
|
251
244
|
# Each update (not SUBSTEP) we see if we need to add more Stars
|
252
|
-
if rand(100) < 4 and @stars.size < 25
|
245
|
+
if rand(100) < 4 and @stars.size < 25
|
253
246
|
body = CP::Body.new(0.0001, 0.0001)
|
254
247
|
shape = CP::Shape::Circle.new(body, 25/2, CP::Vec2.new(0.0, 0.0))
|
255
248
|
shape.collision_type = :star
|
@@ -269,8 +262,10 @@ class ChipmunkIntegration < (Example rescue Gosu::Window)
|
|
269
262
|
end
|
270
263
|
|
271
264
|
def button_down(id)
|
272
|
-
if id == Gosu::
|
265
|
+
if id == Gosu::KB_ESCAPE
|
273
266
|
close
|
267
|
+
else
|
268
|
+
super
|
274
269
|
end
|
275
270
|
end
|
276
271
|
end
|
data/examples/cptn_ruby.rb
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
require 'rubygems'
|
31
31
|
require 'gosu'
|
32
32
|
|
33
|
-
WIDTH, HEIGHT =
|
33
|
+
WIDTH, HEIGHT = 640, 480
|
34
34
|
|
35
35
|
module Tiles
|
36
36
|
Grass = 0
|
@@ -47,7 +47,7 @@ class CollectibleGem
|
|
47
47
|
|
48
48
|
def draw
|
49
49
|
# Draw, slowly rotating
|
50
|
-
@image.draw_rot(@x, @y, 0, 25 * Math.sin(Gosu
|
50
|
+
@image.draw_rot(@x, @y, 0, 25 * Math.sin(Gosu.milliseconds / 133.7))
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -69,7 +69,7 @@ class Player
|
|
69
69
|
|
70
70
|
def draw
|
71
71
|
# Flip vertically when facing to the left.
|
72
|
-
if @dir == :left
|
72
|
+
if @dir == :left
|
73
73
|
offs_x = -25
|
74
74
|
factor = 1.0
|
75
75
|
else
|
@@ -91,18 +91,18 @@ class Player
|
|
91
91
|
if (move_x == 0)
|
92
92
|
@cur_image = @standing
|
93
93
|
else
|
94
|
-
@cur_image = (Gosu
|
94
|
+
@cur_image = (Gosu.milliseconds / 175 % 2 == 0) ? @walk1 : @walk2
|
95
95
|
end
|
96
96
|
if (@vy < 0)
|
97
97
|
@cur_image = @jump
|
98
98
|
end
|
99
99
|
|
100
100
|
# Directional walking, horizontal movement
|
101
|
-
if move_x > 0
|
101
|
+
if move_x > 0
|
102
102
|
@dir = :right
|
103
103
|
move_x.times { if would_fit(1, 0) then @x += 1 end }
|
104
104
|
end
|
105
|
-
if move_x < 0
|
105
|
+
if move_x < 0
|
106
106
|
@dir = :left
|
107
107
|
(-move_x).times { if would_fit(-1, 0) then @x -= 1 end }
|
108
108
|
end
|
@@ -112,16 +112,16 @@ class Player
|
|
112
112
|
# jumping curve will be the parabole we want it to be.
|
113
113
|
@vy += 1
|
114
114
|
# Vertical movement
|
115
|
-
if @vy > 0
|
115
|
+
if @vy > 0
|
116
116
|
@vy.times { if would_fit(0, 1) then @y += 1 else @vy = 0 end }
|
117
117
|
end
|
118
|
-
if @vy < 0
|
118
|
+
if @vy < 0
|
119
119
|
(-@vy).times { if would_fit(0, -1) then @y -= 1 else @vy = 0 end }
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
123
|
def try_to_jump
|
124
|
-
if @map.solid?(@x, @y + 1)
|
124
|
+
if @map.solid?(@x, @y + 1)
|
125
125
|
@vy = -20
|
126
126
|
end
|
127
127
|
end
|
@@ -202,8 +202,8 @@ class CptnRuby < (Example rescue Gosu::Window)
|
|
202
202
|
|
203
203
|
def update
|
204
204
|
move_x = 0
|
205
|
-
move_x -= 5 if Gosu
|
206
|
-
move_x += 5 if Gosu
|
205
|
+
move_x -= 5 if Gosu.button_down? Gosu::KB_LEFT
|
206
|
+
move_x += 5 if Gosu.button_down? Gosu::KB_RIGHT
|
207
207
|
@cptn.update(move_x)
|
208
208
|
@cptn.collect_gems(@map.gems)
|
209
209
|
# Scrolling follows player
|
@@ -213,15 +213,20 @@ class CptnRuby < (Example rescue Gosu::Window)
|
|
213
213
|
|
214
214
|
def draw
|
215
215
|
@sky.draw 0, 0, 0
|
216
|
-
Gosu
|
216
|
+
Gosu.translate(-@camera_x, -@camera_y) do
|
217
217
|
@map.draw
|
218
218
|
@cptn.draw
|
219
219
|
end
|
220
220
|
end
|
221
221
|
|
222
222
|
def button_down(id)
|
223
|
-
|
223
|
+
case id
|
224
|
+
when Gosu::KB_UP
|
224
225
|
@cptn.try_to_jump
|
226
|
+
when Gosu::KB_ESCAPE
|
227
|
+
close
|
228
|
+
else
|
229
|
+
super
|
225
230
|
end
|
226
231
|
end
|
227
232
|
end
|
Binary file
|
@@ -9,7 +9,7 @@ require 'rubygems'
|
|
9
9
|
require 'gosu'
|
10
10
|
require 'gl'
|
11
11
|
|
12
|
-
WIDTH, HEIGHT =
|
12
|
+
WIDTH, HEIGHT = 640, 480
|
13
13
|
|
14
14
|
module ZOrder
|
15
15
|
Background, Stars, Player, UI = *0..3
|
@@ -32,7 +32,7 @@ class GLBackground
|
|
32
32
|
|
33
33
|
def scroll
|
34
34
|
@scrolls += 1
|
35
|
-
if @scrolls == SCROLLS_PER_STEP
|
35
|
+
if @scrolls == SCROLLS_PER_STEP
|
36
36
|
@scrolls = 0
|
37
37
|
@height_map.shift
|
38
38
|
@height_map.push Array.new(POINTS_X) { rand }
|
@@ -42,7 +42,7 @@ class GLBackground
|
|
42
42
|
def draw(z)
|
43
43
|
# gl will execute the given block in a clean OpenGL environment, then reset
|
44
44
|
# everything so Gosu's rendering can take place again.
|
45
|
-
Gosu
|
45
|
+
Gosu.gl(z) { exec_gl }
|
46
46
|
end
|
47
47
|
|
48
48
|
private
|
@@ -143,7 +143,7 @@ class Player
|
|
143
143
|
|
144
144
|
def collect_stars(stars)
|
145
145
|
stars.reject! do |star|
|
146
|
-
if Gosu
|
146
|
+
if Gosu.distance(@x, @y, star.x, star.y) < 35
|
147
147
|
@score += 10
|
148
148
|
@beep.play
|
149
149
|
true
|
@@ -170,7 +170,7 @@ class Star
|
|
170
170
|
end
|
171
171
|
|
172
172
|
def draw
|
173
|
-
img = @animation[Gosu
|
173
|
+
img = @animation[Gosu.milliseconds / 100 % @animation.size];
|
174
174
|
img.draw_rot(@x, @y, ZOrder::Stars, @y, 0.5, 0.5, 1, 1, @color, :add)
|
175
175
|
end
|
176
176
|
|
@@ -199,10 +199,10 @@ class OpenGLIntegration < (Example rescue Gosu::Window)
|
|
199
199
|
end
|
200
200
|
|
201
201
|
def update
|
202
|
-
@player.move_left
|
203
|
-
@player.move_right if Gosu
|
204
|
-
@player.accelerate if Gosu
|
205
|
-
@player.brake
|
202
|
+
@player.move_left if Gosu.button_down? Gosu::KB_LEFT or Gosu.button_down? Gosu::GP_LEFT
|
203
|
+
@player.move_right if Gosu.button_down? Gosu::KB_RIGHT or Gosu.button_down? Gosu::GP_RIGHT
|
204
|
+
@player.accelerate if Gosu.button_down? Gosu::KB_UP or Gosu.button_down? Gosu::GP_UP
|
205
|
+
@player.brake if Gosu.button_down? Gosu::KB_DOWN or Gosu.button_down? Gosu::GP_DOWN
|
206
206
|
|
207
207
|
@player.collect_stars(@stars)
|
208
208
|
|
@@ -17,7 +17,7 @@ require 'rubygems'
|
|
17
17
|
require 'gosu'
|
18
18
|
require 'rmagick'
|
19
19
|
|
20
|
-
WIDTH, HEIGHT =
|
20
|
+
WIDTH, HEIGHT = 640, 480
|
21
21
|
|
22
22
|
NULL_PIXEL = Magick::Pixel.from_color('none')
|
23
23
|
|
@@ -156,7 +156,7 @@ class Player
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def draw
|
159
|
-
if dead
|
159
|
+
if dead
|
160
160
|
# Poor, broken soldier.
|
161
161
|
@@images[0].draw_rot(x, y, 0, 290 * @dir, 0.5, 0.65, @dir * 0.5, 0.5, @color)
|
162
162
|
@@images[2].draw_rot(x, y, 0, 160 * @dir, 0.95, 0.5, 0.5, @dir * 0.5, @color)
|
@@ -164,7 +164,7 @@ class Player
|
|
164
164
|
# Was moved last frame?
|
165
165
|
if @show_walk_anim
|
166
166
|
# Yes: Display walking animation.
|
167
|
-
frame = Gosu
|
167
|
+
frame = Gosu.milliseconds / 200 % 2
|
168
168
|
else
|
169
169
|
# No: Stand around (boring).
|
170
170
|
frame = 0
|
@@ -185,7 +185,7 @@ class Player
|
|
185
185
|
# Gravity.
|
186
186
|
@vy += 1
|
187
187
|
|
188
|
-
if @vy > 1
|
188
|
+
if @vy > 1
|
189
189
|
# Move upwards until hitting something.
|
190
190
|
@vy.times do
|
191
191
|
if @window.map.solid?(x, y + 1)
|
@@ -240,7 +240,7 @@ class Player
|
|
240
240
|
end
|
241
241
|
|
242
242
|
def hit_by? missile
|
243
|
-
if Gosu
|
243
|
+
if Gosu.distance(missile.x, missile.y, x, y) < 30
|
244
244
|
# Was hit :(
|
245
245
|
@dead = true
|
246
246
|
return true
|
@@ -260,7 +260,7 @@ class Missile
|
|
260
260
|
|
261
261
|
def initialize(window, x, y, angle)
|
262
262
|
# Horizontal/vertical velocity.
|
263
|
-
@vx, @vy = Gosu
|
263
|
+
@vx, @vy = Gosu.offset_x(angle, 20).to_i, Gosu.offset_y(angle, 20).to_i
|
264
264
|
|
265
265
|
@window, @x, @y = window, x + @vx, y + @vy
|
266
266
|
end
|
@@ -271,7 +271,7 @@ class Missile
|
|
271
271
|
@y += @vy
|
272
272
|
@vy += 1
|
273
273
|
# Hit anything?
|
274
|
-
if @window.map.solid?(x, y) or @window.objects.any? { |o| o.hit_by?(self) }
|
274
|
+
if @window.map.solid?(x, y) or @window.objects.any? { |o| o.hit_by?(self) }
|
275
275
|
# Create great particles.
|
276
276
|
5.times { @window.objects << Particle.new(@window, x - 25 + rand(51), y - 25 + rand(51)) }
|
277
277
|
@window.map.blast(x, y)
|
@@ -285,7 +285,7 @@ class Missile
|
|
285
285
|
|
286
286
|
def draw
|
287
287
|
# Just draw a small rectangle.
|
288
|
-
Gosu
|
288
|
+
Gosu.draw_rect x-2, y-2, 4, 4, 0xff_800000
|
289
289
|
end
|
290
290
|
|
291
291
|
def hit_by?(missile)
|
@@ -370,7 +370,7 @@ class RMagickIntegration < (Example rescue Gosu::Window)
|
|
370
370
|
cur_text = @player_instructions[@current_player] if not @waiting
|
371
371
|
cur_text = @player_won_messages[1 - @current_player] if @players[@current_player].dead
|
372
372
|
|
373
|
-
if cur_text
|
373
|
+
if cur_text
|
374
374
|
x, y = 0, 30
|
375
375
|
cur_text.draw(x - 1, y, 0, 1, 1, 0xff_000000)
|
376
376
|
cur_text.draw(x + 1, y, 0, 1, 1, 0xff_000000)
|
@@ -389,22 +389,24 @@ class RMagickIntegration < (Example rescue Gosu::Window)
|
|
389
389
|
@objects.reject! { |o| o.update == false }
|
390
390
|
|
391
391
|
# If it's a player's turn, forward controls.
|
392
|
-
if not @waiting and not @players[@current_player].dead
|
392
|
+
if not @waiting and not @players[@current_player].dead
|
393
393
|
player = @players[@current_player]
|
394
|
-
player.aim_up if Gosu
|
395
|
-
player.aim_down if Gosu
|
396
|
-
player.try_walk(-1) if Gosu
|
397
|
-
player.try_walk(+1) if Gosu
|
398
|
-
player.try_jump if Gosu
|
394
|
+
player.aim_up if Gosu.button_down? Gosu::KB_UP
|
395
|
+
player.aim_down if Gosu.button_down? Gosu::KB_DOWN
|
396
|
+
player.try_walk(-1) if Gosu.button_down? Gosu::KB_LEFT
|
397
|
+
player.try_walk(+1) if Gosu.button_down? Gosu::KB_RIGHT
|
398
|
+
player.try_jump if Gosu.button_down? Gosu::KB_RETURN
|
399
399
|
end
|
400
400
|
end
|
401
401
|
|
402
402
|
def button_down(id)
|
403
|
-
if id == Gosu::
|
403
|
+
if id == Gosu::KB_SPACE and not @waiting and not @players[@current_player].dead
|
404
404
|
# Shoot! This is handled in button_down because holding space shouldn't auto-fire.
|
405
405
|
@players[@current_player].shoot
|
406
406
|
@current_player = 1 - @current_player
|
407
407
|
@waiting = true
|
408
|
+
else
|
409
|
+
super
|
408
410
|
end
|
409
411
|
end
|
410
412
|
end
|
data/examples/tutorial.rb
CHANGED
@@ -3,10 +3,8 @@
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'gosu'
|
5
5
|
|
6
|
-
WIDTH, HEIGHT = 600, 600
|
7
|
-
|
8
6
|
module ZOrder
|
9
|
-
|
7
|
+
BACKGROUND, STARS, PLAYER, UI = *0..3
|
10
8
|
end
|
11
9
|
|
12
10
|
class Player
|
@@ -32,27 +30,27 @@ class Player
|
|
32
30
|
end
|
33
31
|
|
34
32
|
def accelerate
|
35
|
-
@vel_x += Gosu
|
36
|
-
@vel_y += Gosu
|
33
|
+
@vel_x += Gosu.offset_x(@angle, 0.5)
|
34
|
+
@vel_y += Gosu.offset_y(@angle, 0.5)
|
37
35
|
end
|
38
36
|
|
39
37
|
def move
|
40
38
|
@x += @vel_x
|
41
39
|
@y += @vel_y
|
42
|
-
@x %=
|
43
|
-
@y %=
|
40
|
+
@x %= 640
|
41
|
+
@y %= 480
|
44
42
|
|
45
43
|
@vel_x *= 0.95
|
46
44
|
@vel_y *= 0.95
|
47
45
|
end
|
48
46
|
|
49
47
|
def draw
|
50
|
-
@image.draw_rot(@x, @y, ZOrder::
|
48
|
+
@image.draw_rot(@x, @y, ZOrder::PLAYER, @angle)
|
51
49
|
end
|
52
50
|
|
53
51
|
def collect_stars(stars)
|
54
52
|
stars.reject! do |star|
|
55
|
-
if Gosu
|
53
|
+
if Gosu.distance(@x, @y, star.x, star.y) < 35
|
56
54
|
@score += 10
|
57
55
|
@beep.play
|
58
56
|
true
|
@@ -68,25 +66,24 @@ class Star
|
|
68
66
|
|
69
67
|
def initialize(animation)
|
70
68
|
@animation = animation
|
71
|
-
@color = Gosu::Color.
|
69
|
+
@color = Gosu::Color::BLACK.dup
|
72
70
|
@color.red = rand(256 - 40) + 40
|
73
71
|
@color.green = rand(256 - 40) + 40
|
74
72
|
@color.blue = rand(256 - 40) + 40
|
75
|
-
@x = rand *
|
76
|
-
@y = rand *
|
73
|
+
@x = rand * 640
|
74
|
+
@y = rand * 480
|
77
75
|
end
|
78
76
|
|
79
77
|
def draw
|
80
|
-
img = @animation[Gosu
|
78
|
+
img = @animation[Gosu.milliseconds / 100 % @animation.size]
|
81
79
|
img.draw(@x - img.width / 2.0, @y - img.height / 2.0,
|
82
|
-
ZOrder::
|
80
|
+
ZOrder::STARS, 1, 1, @color, :add)
|
83
81
|
end
|
84
82
|
end
|
85
83
|
|
86
84
|
class Tutorial < (Example rescue Gosu::Window)
|
87
85
|
def initialize
|
88
|
-
super
|
89
|
-
|
86
|
+
super 640, 480
|
90
87
|
self.caption = "Tutorial Game"
|
91
88
|
|
92
89
|
@background_image = Gosu::Image.new("media/space.png", :tileable => true)
|
@@ -101,28 +98,36 @@ class Tutorial < (Example rescue Gosu::Window)
|
|
101
98
|
end
|
102
99
|
|
103
100
|
def update
|
104
|
-
if Gosu
|
101
|
+
if Gosu.button_down? Gosu::KB_LEFT or Gosu.button_down? Gosu::GP_LEFT
|
105
102
|
@player.turn_left
|
106
103
|
end
|
107
|
-
if Gosu
|
104
|
+
if Gosu.button_down? Gosu::KB_RIGHT or Gosu.button_down? Gosu::GP_RIGHT
|
108
105
|
@player.turn_right
|
109
106
|
end
|
110
|
-
if Gosu
|
107
|
+
if Gosu.button_down? Gosu::KB_UP or Gosu.button_down? Gosu::GP_BUTTON_0
|
111
108
|
@player.accelerate
|
112
109
|
end
|
113
110
|
@player.move
|
114
111
|
@player.collect_stars(@stars)
|
115
112
|
|
116
|
-
if rand(100) < 4 and @stars.size < 25
|
113
|
+
if rand(100) < 4 and @stars.size < 25
|
117
114
|
@stars.push(Star.new(@star_anim))
|
118
115
|
end
|
119
116
|
end
|
120
117
|
|
121
118
|
def draw
|
122
|
-
@background_image.draw(0, 0, ZOrder::
|
119
|
+
@background_image.draw(0, 0, ZOrder::BACKGROUND)
|
123
120
|
@player.draw
|
124
121
|
@stars.each { |star| star.draw }
|
125
|
-
@font.draw("Score: #{@player.score}", 10, 10, ZOrder::UI, 1.0, 1.0,
|
122
|
+
@font.draw("Score: #{@player.score}", 10, 10, ZOrder::UI, 1.0, 1.0, Gosu::Color::YELLOW)
|
123
|
+
end
|
124
|
+
|
125
|
+
def button_down(id)
|
126
|
+
if id == Gosu::KB_ESCAPE
|
127
|
+
close
|
128
|
+
else
|
129
|
+
super
|
130
|
+
end
|
126
131
|
end
|
127
132
|
end
|
128
133
|
|
data/examples/welcome.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'gosu'
|
5
5
|
|
6
|
-
WIDTH, HEIGHT =
|
6
|
+
WIDTH, HEIGHT = 640, 480
|
7
7
|
|
8
8
|
class Welcome < (Example rescue Gosu::Window)
|
9
9
|
PADDING = 20
|
@@ -20,11 +20,12 @@ class Welcome < (Example rescue Gosu::Window)
|
|
20
20
|
|
21
21
|
Every example can be run both from this tool <i>and</i> from the terminal/command line as a stand-alone Ruby script.
|
22
22
|
|
23
|
-
|
23
|
+
Keyboard shortcuts:
|
24
24
|
|
25
|
-
• To see the source code of an example or feature demo, press <b>
|
25
|
+
• To see the source code of an example or feature demo, press <b>E</b>.
|
26
26
|
• To open the ‘examples’ folder, press <b>O</b>.
|
27
|
-
• To quit this tool, press <b>Esc</b>.
|
27
|
+
• To quit this tool, press <b>Esc</b>.
|
28
|
+
• To toggle fullscreen mode, press <b>Alt+Enter</b> (Windows, Linux) or <b>cmd+F</b> (macOS).
|
28
29
|
|
29
30
|
Why not take a look at the code for this example right now? Simply press <b>S</b>."
|
30
31
|
|
@@ -46,8 +47,8 @@ class Welcome < (Example rescue Gosu::Window)
|
|
46
47
|
# Disregard the math in this method, it doesn't look as good as I thought it
|
47
48
|
# would. =(
|
48
49
|
|
49
|
-
angle = Gosu
|
50
|
-
scale = (Gosu
|
50
|
+
angle = Gosu.milliseconds / 50.0
|
51
|
+
scale = (Gosu.milliseconds % 1000) / 1000.0
|
51
52
|
|
52
53
|
[1, 0].each do |extra_scale|
|
53
54
|
@background.draw_rot WIDTH * 0.5, HEIGHT * 0.75, 0, angle, 0.5, 0.5,
|
@@ -17,24 +17,11 @@ class Example
|
|
17
17
|
|
18
18
|
def button_up(id)
|
19
19
|
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class Feature < Example
|
23
|
-
def self.inherited(subclass)
|
24
|
-
@@features ||= {}
|
25
|
-
@@features[subclass] = self.current_source_file
|
26
|
-
end
|
27
20
|
|
28
|
-
def
|
29
|
-
|
21
|
+
def close
|
22
|
+
# no-op, examples cannot close the containing window.
|
30
23
|
end
|
31
|
-
|
32
|
-
def self.source_file
|
33
|
-
@@examples[self]
|
34
|
-
end
|
35
|
-
end
|
36
24
|
|
37
|
-
class Example
|
38
25
|
def self.current_source_file
|
39
26
|
@current_source_file
|
40
27
|
end
|
@@ -49,7 +36,7 @@ class Example
|
|
49
36
|
end
|
50
37
|
|
51
38
|
def self.examples
|
52
|
-
@@examples.keys
|
39
|
+
@@examples.keys
|
53
40
|
end
|
54
41
|
|
55
42
|
def self.source_file
|
@@ -59,18 +46,14 @@ class Example
|
|
59
46
|
def self.load_examples(pattern)
|
60
47
|
Dir.glob(pattern) do |file|
|
61
48
|
begin
|
62
|
-
# Remember
|
63
|
-
# next file.
|
64
|
-
#
|
49
|
+
# Remember which file we are loading.
|
65
50
|
Example.current_source_file = File.expand_path(file)
|
66
51
|
|
67
|
-
# Load the example
|
68
|
-
#
|
69
|
-
#
|
70
|
-
# load() does not let us refer to the anonymous module it creates, but we
|
71
|
-
# can enumerate all loaded examples and features using Example.examples and
|
72
|
-
# Feature.features afterwards.
|
52
|
+
# Load the example in a sandbox module (second parameter to load()). This way, examples can
|
53
|
+
# define classes and constants with the same names, and they will not collide.
|
73
54
|
#
|
55
|
+
# load() does not let us refer to the anonymous module it creates, but we can enumerate all
|
56
|
+
# loaded examples using Example.examples thanks to the "inherited" callback above.
|
74
57
|
load file, true
|
75
58
|
rescue Exception => e
|
76
59
|
puts "*** Cannot load #{file}:"
|
@@ -1,13 +1,13 @@
|
|
1
1
|
class Sidebar
|
2
|
-
WIDTH =
|
2
|
+
WIDTH = 300
|
3
3
|
HEIGHT = 600
|
4
4
|
FONT = Gosu::Font.new(20)
|
5
|
-
HEADER = Gosu::Image.new("media/header.psd", :tileable => true)
|
5
|
+
HEADER = Gosu::Image.new("media/header@2x.psd", :tileable => true)
|
6
6
|
|
7
7
|
class Button
|
8
8
|
HEIGHT = 25
|
9
9
|
SPACING = 5
|
10
|
-
TOP_Y = HEADER.height + 15
|
10
|
+
TOP_Y = HEADER.height / 2 + 15
|
11
11
|
|
12
12
|
attr_reader :filename
|
13
13
|
|
@@ -19,7 +19,7 @@ class Sidebar
|
|
19
19
|
text_color = Gosu::Color::BLACK
|
20
20
|
|
21
21
|
if is_current
|
22
|
-
Gosu
|
22
|
+
Gosu.draw_rect 0, @top, Sidebar::WIDTH, HEIGHT, 0xff_1565e5 if is_current
|
23
23
|
text_color = Gosu::Color::WHITE
|
24
24
|
end
|
25
25
|
|
@@ -44,8 +44,8 @@ class Sidebar
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def draw(current_filename)
|
47
|
-
Gosu
|
48
|
-
HEADER.draw 0, 0, 0
|
47
|
+
Gosu.draw_rect 0, 0, WIDTH, HEIGHT, Gosu::Color::WHITE
|
48
|
+
HEADER.draw 0, 0, 0, 0.5, 0.5
|
49
49
|
|
50
50
|
@buttons.each do |button|
|
51
51
|
is_current = (button.filename == current_filename)
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gosu-examples
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Raschke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gosu
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.11.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.11.0
|
27
27
|
description: The `gosu-examples` tool provides an easy way to run and inspect example
|
28
28
|
games written for the Gosu game development library.
|
29
29
|
email: julian@raschke.de
|
@@ -32,18 +32,22 @@ executables:
|
|
32
32
|
extensions: []
|
33
33
|
extra_rdoc_files: []
|
34
34
|
files:
|
35
|
-
- bin/gosu-examples
|
36
35
|
- LICENSE
|
37
36
|
- README.md
|
38
|
-
-
|
39
|
-
- lib/gosu-examples/sidebar.rb
|
37
|
+
- bin/gosu-examples
|
40
38
|
- examples/chipmunk_and_rmagick.rb
|
41
39
|
- examples/chipmunk_integration.rb
|
42
40
|
- examples/cptn_ruby.rb
|
43
|
-
- examples/
|
44
|
-
- examples/
|
45
|
-
- examples/
|
46
|
-
- examples/
|
41
|
+
- examples/media/BrokenPNG.png
|
42
|
+
- examples/media/Cursor.png
|
43
|
+
- examples/media/JingleBells.mp3
|
44
|
+
- examples/media/JingleBells.ogg
|
45
|
+
- examples/media/Loop.wav
|
46
|
+
- examples/media/Sample.wav
|
47
|
+
- examples/media/SquareTexture.png
|
48
|
+
- examples/media/Wallpaper.png
|
49
|
+
- examples/media/WallpaperXXL.png
|
50
|
+
- examples/media/WhiteAlpha.png
|
47
51
|
- examples/media/audio_formats/aiff_32bit_float.aiff
|
48
52
|
- examples/media/audio_formats/au_16bit_pcm.au
|
49
53
|
- examples/media/audio_formats/caf_be_16bit_44khz.caf
|
@@ -58,33 +62,29 @@ files:
|
|
58
62
|
- examples/media/audio_formats/wav_32bit_pcm.wav
|
59
63
|
- examples/media/audio_formats/wav_4bit_ms_adpcm.wav
|
60
64
|
- examples/media/beep.wav
|
61
|
-
- examples/media/BrokenPNG.png
|
62
65
|
- examples/media/cptn_ruby.png
|
63
66
|
- examples/media/cptn_ruby_map.txt
|
64
|
-
- examples/media/Cursor.png
|
65
67
|
- examples/media/earth.png
|
66
68
|
- examples/media/explosion.wav
|
67
69
|
- examples/media/gem.png
|
68
|
-
- examples/media/header.psd
|
70
|
+
- examples/media/header@2x.psd
|
69
71
|
- examples/media/image_formats/test.jpg
|
70
72
|
- examples/media/image_formats/test.psd
|
71
|
-
- examples/media/JingleBells.mp3
|
72
|
-
- examples/media/JingleBells.ogg
|
73
73
|
- examples/media/landscape.svg
|
74
74
|
- examples/media/large_star.png
|
75
|
-
- examples/media/Loop.wav
|
76
|
-
- examples/media/Sample.wav
|
77
75
|
- examples/media/smoke.png
|
78
76
|
- examples/media/soldier.png
|
79
77
|
- examples/media/space.png
|
80
|
-
- examples/media/SquareTexture.png
|
81
78
|
- examples/media/star.png
|
82
79
|
- examples/media/starfighter.bmp
|
83
80
|
- examples/media/tileset.png
|
84
81
|
- examples/media/vera.ttf
|
85
|
-
- examples/
|
86
|
-
- examples/
|
87
|
-
- examples/
|
82
|
+
- examples/opengl_integration.rb
|
83
|
+
- examples/rmagick_integration.rb
|
84
|
+
- examples/tutorial.rb
|
85
|
+
- examples/welcome.rb
|
86
|
+
- lib/gosu-examples/example.rb
|
87
|
+
- lib/gosu-examples/sidebar.rb
|
88
88
|
homepage: http://www.libgosu.org/
|
89
89
|
licenses: []
|
90
90
|
metadata: {}
|
@@ -94,19 +94,18 @@ require_paths:
|
|
94
94
|
- lib
|
95
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
|
-
- -
|
97
|
+
- - ">="
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: 1.8.2
|
100
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - ">="
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
105
|
requirements: []
|
106
106
|
rubyforge_project:
|
107
|
-
rubygems_version: 2.
|
107
|
+
rubygems_version: 2.6.8
|
108
108
|
signing_key:
|
109
109
|
specification_version: 4
|
110
110
|
summary: Ruby examples for the Gosu library
|
111
111
|
test_files: []
|
112
|
-
has_rdoc:
|
data/examples/media/header.psd
DELETED
Binary file
|