gosu-examples 1.0.4 → 1.0.7

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.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +1 -1
  3. data/bin/gosu-examples +20 -22
  4. data/examples/chipmunk_and_rmagick.rb +25 -28
  5. data/examples/chipmunk_integration.rb +45 -48
  6. data/examples/cptn_ruby.rb +23 -26
  7. data/examples/opengl_integration.rb +61 -62
  8. data/examples/rmagick_integration.rb +87 -88
  9. data/examples/text_input.rb +157 -0
  10. data/examples/tutorial.rb +23 -26
  11. data/examples/welcome.rb +20 -23
  12. data/lib/gosu-examples/example.rb +34 -13
  13. data/lib/gosu-examples/sidebar.rb +16 -16
  14. metadata +10 -36
  15. data/examples/media/BrokenPNG.png +0 -0
  16. data/examples/media/Cursor.png +0 -0
  17. data/examples/media/JingleBells.mp3 +0 -0
  18. data/examples/media/JingleBells.ogg +0 -0
  19. data/examples/media/Loop.wav +0 -0
  20. data/examples/media/Sample.wav +0 -0
  21. data/examples/media/SquareTexture.png +0 -0
  22. data/examples/media/Wallpaper.png +0 -0
  23. data/examples/media/WallpaperXXL.png +0 -0
  24. data/examples/media/WhiteAlpha.png +0 -0
  25. data/examples/media/audio_formats/aiff_32bit_float.aiff +0 -0
  26. data/examples/media/audio_formats/au_16bit_pcm.au +0 -0
  27. data/examples/media/audio_formats/caf_be_16bit_44khz.caf +0 -0
  28. data/examples/media/audio_formats/caf_le_16bit_44khz.caf +0 -0
  29. data/examples/media/audio_formats/caf_le_8bit_44khz.caf +0 -0
  30. data/examples/media/audio_formats/general_midi.mid +0 -0
  31. data/examples/media/audio_formats/impulse_tracker.it +0 -0
  32. data/examples/media/audio_formats/mp3_128k_stereo.mp3 +0 -0
  33. data/examples/media/audio_formats/mp3_avg_96kbit_jointstereo.mp3 +0 -0
  34. data/examples/media/audio_formats/ogg_vorbis.ogg +0 -0
  35. data/examples/media/audio_formats/wav_16bit_pcm.wav +0 -0
  36. data/examples/media/audio_formats/wav_32bit_pcm.wav +0 -0
  37. data/examples/media/audio_formats/wav_4bit_ms_adpcm.wav +0 -0
  38. data/examples/media/image_formats/test.jpg +0 -0
  39. data/examples/media/image_formats/test.psd +0 -0
  40. data/examples/media/vera.ttf +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 888d1aceda91b77fb517e8b8bcf29c0465b0db10
4
- data.tar.gz: b078a35fb710a436a9c1a0f1df81a01e3483a28e
2
+ SHA256:
3
+ metadata.gz: 35dec2483af7a950e86155f3fb389c6e475ed0f00c0b15aa73cb58d14ec20003
4
+ data.tar.gz: 781bce8991c9191bae8eb976fb5bf3c072e5171b610d5b5a689b2dcf91beb99f
5
5
  SHA512:
6
- metadata.gz: 90eddc66bbd574cf91b55c8c61c7796ad4146612d14c5f72c092643ae03bcacfe0dbda96e6296c9c75051ba99c1880d088d8dd049f7d06bfde4ea5da71c7f658
7
- data.tar.gz: 9ca2489faf897835cd19a248c23f500d250ecf95a385873b8ee728ccdef028a47fba38b172870837a0bb94cab5ea924d0bc0e51a9fb77ca6134d907bdc7d24f7
6
+ metadata.gz: ef736babe72e026806ce9a113b3d425f4bf637de7afcfed5ea3634f8abb46e8240288382ab0d031fcf4ea555f46e867d3d1336395476c50c69508f467a392be5
7
+ data.tar.gz: 83912efaf8d40af9f559f96d3b6e9481e970c1a16f9c4c4cf14d02f627bba285c066d26055ce0fa87a9b32f0ba7c1aa498b0b993ab539964c02dc7d9ccc4a773
data/README.md CHANGED
@@ -26,5 +26,5 @@ Some examples require the following additional libraries:
26
26
  ```bash
27
27
  gem install chipmunk
28
28
  gem install rmagick
29
- gem install opengl
29
+ gem install opengl-bindings
30
30
  ```
data/bin/gosu-examples CHANGED
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'rubygems'
4
- require 'gosu'
3
+ require "gosu"
5
4
 
6
5
  Dir.chdir "#{File.dirname __FILE__}/../examples"
7
6
 
8
- $LOAD_PATH << "#{File.dirname __FILE__}/../lib/gosu-examples"
9
-
10
- require 'example'
11
- require 'sidebar'
7
+ require_relative "../lib/gosu-examples/example"
8
+ require_relative "../lib/gosu-examples/sidebar"
12
9
 
13
10
  Example.load_examples "*.rb"
14
11
 
15
12
  class ExampleBox < Gosu::Window
16
13
  def initialize
17
- super Sidebar::WIDTH, Sidebar::HEIGHT, :fullscreen => ARGV.include?('--fullscreen')
18
-
19
- @sidebar = Sidebar.new { |example| change_example(example) }
14
+ welcome_class = Example.initial_example
15
+ welcome = welcome_class.new
16
+
17
+ super welcome.width + Sidebar::WIDTH, welcome.height, fullscreen: ARGV.include?("--fullscreen")
20
18
 
21
- welcome_class = Example.examples.find { |example| example.name =~ /::Welcome$/ }
22
- change_example(welcome_class)
19
+ @sidebar = Sidebar.new do |example_class|
20
+ self.current_example = example_class.new unless @current_example.is_a? example_class
21
+ end
22
+ self.current_example = welcome
23
23
  end
24
24
 
25
25
  def update
@@ -43,11 +43,11 @@ class ExampleBox < Gosu::Window
43
43
  case id
44
44
  when Gosu::KB_ESCAPE
45
45
  close
46
- when Gosu.char_to_button_id('E')
46
+ when Gosu.char_to_button_id("E")
47
47
  if filename = @current_example.class.source_file
48
48
  open_file_or_folder filename
49
49
  end
50
- when Gosu.char_to_button_id('O')
50
+ when Gosu.char_to_button_id("O")
51
51
  if filename = @current_example.class.source_file
52
52
  open_file_or_folder File.dirname(filename)
53
53
  end
@@ -73,14 +73,12 @@ class ExampleBox < Gosu::Window
73
73
 
74
74
  private
75
75
 
76
- def change_example(example)
77
- if @current_example.class != example
78
- @current_example = nil
79
- GC.start
80
- @current_example = example.new
81
- self.width = @current_example.width + Sidebar::WIDTH
82
- self.height = @current_example.height
83
- end
76
+ def current_example=(example)
77
+ self.text_input = nil
78
+ @current_example = example
79
+ @current_example.parent_window = self
80
+ self.width = @current_example.width + Sidebar::WIDTH
81
+ self.height = @current_example.height
84
82
  end
85
83
 
86
84
  def open_file_or_folder(filename)
@@ -89,7 +87,7 @@ class ExampleBox < Gosu::Window
89
87
  elsif RUBY_PLATFORM =~ /mingw[0-9]*$/
90
88
  `explorer "#{filename.gsub('/', '\\')}"`
91
89
  else
92
- `xdg-open '#{filename}'`
90
+ fork { exec "xdg-open '#{filename}'" }
93
91
  end
94
92
  end
95
93
  end
@@ -1,15 +1,12 @@
1
- # Encoding: UTF-8
2
-
3
1
  # Based on the C Demo3 demonstration distributed with Chipmunk.
4
2
  # Also with some help from the chipmunk_integration.rb program.
5
3
  #
6
4
  # License: Same as for Gosu (MIT)
7
5
  # Created on 21/10/2007, 00:05:19 by Robert Sheehan
8
6
 
9
- require 'rubygems'
10
- require 'gosu'
11
- require 'chipmunk'
12
- require 'rmagick'
7
+ require "gosu"
8
+ require "chipmunk"
9
+ require "rmagick"
13
10
 
14
11
  # Layering of sprites
15
12
  module ZOrder
@@ -18,7 +15,7 @@ end
18
15
 
19
16
  WIDTH = 640
20
17
  HEIGHT = 480
21
- TICK = 1.0/60.0
18
+ TICK = 1.0 / 60.0
22
19
  NUM_POLYGONS = 80
23
20
  NUM_SIDES = 4
24
21
  EDGE_SIZE = 15
@@ -27,37 +24,37 @@ class ChipmunkAndRMagick < (Example rescue Gosu::Window)
27
24
  def radians_to_vec2(radians)
28
25
  CP::Vec2.new(Math::cos(radians), Math::sin(radians))
29
26
  end
30
-
27
+
31
28
  def initialize
32
29
  super WIDTH, HEIGHT
33
-
30
+
34
31
  self.caption = "Chipmunk, RMagick and Gosu"
35
-
32
+
36
33
  @space = CP::Space.new
37
34
  @space.iterations = 5
38
35
  @space.gravity = CP::Vec2.new(0, 100)
39
-
36
+
40
37
  # you can replace the background with any image with this line
41
38
  # background = Magick::ImageList.new("media/space.png")
42
39
  fill = Magick::TextureFill.new(Magick::ImageList.new("granite:"))
43
40
  background = Magick::Image.new(WIDTH, HEIGHT, fill)
44
41
  setup_triangles(background)
45
- @background_image = Gosu::Image.new(background, :tileable => true) # turn the image into a Gosu one
42
+ @background_image = Gosu::Image.new(background, tileable: true) # turn the image into a Gosu one
46
43
  @boxes = create_boxes(NUM_POLYGONS)
47
44
  end
48
-
45
+
49
46
  # Create all of the static triangles.
50
47
  # Adds them to the space and the background image.
51
48
  def setup_triangles(background)
52
49
  gc = Magick::Draw.new
53
50
  gc.stroke_width(2)
54
- gc.stroke('red')
55
- gc.fill('blue')
51
+ gc.stroke("red")
52
+ gc.fill("blue")
56
53
  # all the triangles are part of the same body
57
54
  body = CP::Body.new(Float::MAX, Float::MAX)
58
55
  base = 15
59
56
  height = 10
60
- shape_vertices = [CP::Vec2.new(-base, base), CP::Vec2.new(base, base), CP::Vec2.new(0, -height)]
57
+ shape_vertices = [CP::Vec2.new(-base, base), CP::Vec2.new(base, base), CP::Vec2.new(0, -height)]
61
58
  # make shapes and images
62
59
  8.times do |i|
63
60
  8.times do |j|
@@ -68,7 +65,7 @@ class ChipmunkAndRMagick < (Example rescue Gosu::Window)
68
65
  shape.e = 1
69
66
  shape.u = 1
70
67
  @space.add_static_shape(shape)
71
- gc.polygon(x - base + 1, y + base - 1, x + base - 1, y + base - 1, x, y - height + 1)
68
+ gc.polygon(x - base + 1, y + base - 1, x + base - 1, y + base - 1, x, y - height + 1)
72
69
  end
73
70
  end
74
71
  # do the drawing
@@ -84,24 +81,24 @@ class ChipmunkAndRMagick < (Example rescue Gosu::Window)
84
81
  end
85
82
  return vertices
86
83
  end
87
-
84
+
88
85
  # Produces the image of a polygon.
89
86
  def polygon_image(vertices)
90
- box_image = Magick::Image.new(EDGE_SIZE * 2, EDGE_SIZE * 2) { self.background_color = 'transparent' }
87
+ box_image = Magick::Image.new(EDGE_SIZE * 2, EDGE_SIZE * 2) { self.background_color = "transparent" }
91
88
  gc = Magick::Draw.new
92
- gc.stroke('red')
93
- gc.fill('plum')
89
+ gc.stroke("red")
90
+ gc.fill("plum")
94
91
  draw_vertices = vertices.map { |v| [v.x + EDGE_SIZE, v.y + EDGE_SIZE] }.flatten
95
92
  gc.polygon(*draw_vertices)
96
93
  gc.draw(box_image)
97
94
  return Gosu::Image.new(box_image)
98
95
  end
99
-
96
+
100
97
  # Produces the polygon objects and adds them to the space.
101
98
  def create_boxes(num)
102
99
  box_vertices = polygon_vertices(NUM_SIDES, EDGE_SIZE)
103
100
  box_image = polygon_image(box_vertices)
104
- boxes = []
101
+ boxes = []
105
102
  num.times do
106
103
  body = CP::Body.new(1, CP::moment_for_poly(1.0, box_vertices, CP::Vec2.new(0, 0))) # mass, moment of inertia
107
104
  body.p = CP::Vec2.new(rand(WIDTH), rand(40) - 50)
@@ -110,17 +107,17 @@ class ChipmunkAndRMagick < (Example rescue Gosu::Window)
110
107
  shape.u = 0.4
111
108
  boxes << Box.new(box_image, body)
112
109
  @space.add_body(body)
113
- @space.add_shape(shape)
110
+ @space.add_shape(shape)
114
111
  end
115
112
  return boxes
116
113
  end
117
-
114
+
118
115
  # All the simulation is done here.
119
116
  def update
120
117
  @space.step(TICK)
121
118
  @boxes.each { |box| box.check_off_screen }
122
119
  end
123
-
120
+
124
121
  # All the updating of the screen is done here.
125
122
  def draw
126
123
  @background_image.draw(0, 0, ZOrder::BACKGROUND)
@@ -135,7 +132,7 @@ class Box
135
132
  @image = image
136
133
  @body = body
137
134
  end
138
-
135
+
139
136
  # If it goes offscreen we put it back to the top.
140
137
  def check_off_screen
141
138
  pos = @body.p
@@ -143,7 +140,7 @@ class Box
143
140
  @body.p = CP::Vec2.new(rand * WIDTH, 0)
144
141
  end
145
142
  end
146
-
143
+
147
144
  def draw
148
145
  @image.draw_rot(@body.p.x, @body.p.y, ZOrder::BOX, @body.a.radians_to_gosu)
149
146
  end
@@ -1,5 +1,3 @@
1
- # Encoding: UTF-8
2
-
3
1
  ## File: ChipmunkIntegration.rb
4
2
  ## Author: Dirk Johnson
5
3
  ## Version: 1.0.0
@@ -8,9 +6,8 @@
8
6
  ## Comments: Based on the Gosu Ruby Tutorial, but incorporating the Chipmunk Physics Engine
9
7
  ## See https://github.com/jlnr/gosu/wiki/Ruby-Chipmunk-Integration for the accompanying text.
10
8
 
11
- require 'rubygems'
12
- require 'gosu'
13
- require 'chipmunk'
9
+ require "gosu"
10
+ require "chipmunk"
14
11
 
15
12
  WIDTH = 640
16
13
  HEIGHT = 480
@@ -35,32 +32,32 @@ class Player
35
32
  @shape = shape
36
33
  @shape.body.p = CP::Vec2.new(0.0, 0.0) # position
37
34
  @shape.body.v = CP::Vec2.new(0.0, 0.0) # velocity
38
-
35
+
39
36
  # Keep in mind that down the screen is positive y, which means that PI/2 radians,
40
37
  # which you might consider the top in the traditional Trig unit circle sense is actually
41
38
  # the bottom; thus 3PI/2 is the top
42
- @shape.body.a = (3*Math::PI/2.0) # angle in radians; faces towards top of screen
39
+ @shape.body.a = (3 * Math::PI / 2.0) # angle in radians; faces towards top of screen
43
40
  end
44
-
41
+
45
42
  # Directly set the position of our Player
46
43
  def warp(vect)
47
44
  @shape.body.p = vect
48
45
  end
49
-
46
+
50
47
  # Apply negative Torque; Chipmunk will do the rest
51
48
  # SUBSTEPS is used as a divisor to keep turning rate constant
52
49
  # even if the number of steps per update are adjusted
53
50
  def turn_left
54
- @shape.body.t -= 400.0/SUBSTEPS
51
+ @shape.body.t -= 400.0 / SUBSTEPS
55
52
  end
56
-
53
+
57
54
  # Apply positive Torque; Chipmunk will do the rest
58
55
  # SUBSTEPS is used as a divisor to keep turning rate constant
59
56
  # even if the number of steps per update are adjusted
60
57
  def turn_right
61
- @shape.body.t += 400.0/SUBSTEPS
58
+ @shape.body.t += 400.0 / SUBSTEPS
62
59
  end
63
-
60
+
64
61
  # Apply forward force; Chipmunk will do the rest
65
62
  # SUBSTEPS is used as a divisor to keep acceleration rate constant
66
63
  # even if the number of steps per update are adjusted
@@ -68,27 +65,27 @@ class Player
68
65
  # forward momentum by creating a vector in the direction of the facing
69
66
  # and with a magnitude representing the force we want to apply
70
67
  def accelerate
71
- @shape.body.apply_force(@shape.body.rot * (3000.0/SUBSTEPS), CP::Vec2.new(0.0, 0.0))
68
+ @shape.body.apply_force(@shape.body.rot * (3000.0 / SUBSTEPS), CP::Vec2.new(0.0, 0.0))
72
69
  end
73
-
70
+
74
71
  # Apply even more forward force
75
72
  # See accelerate for more details
76
73
  def boost
77
74
  @shape.body.apply_force(@shape.body.rot * (3000.0), CP::Vec2.new(0.0, 0.0))
78
75
  end
79
-
76
+
80
77
  # Apply reverse force
81
78
  # See accelerate for more details
82
79
  def reverse
83
- @shape.body.apply_force(-@shape.body.rot * (1000.0/SUBSTEPS), CP::Vec2.new(0.0, 0.0))
80
+ @shape.body.apply_force(-@shape.body.rot * (1000.0 / SUBSTEPS), CP::Vec2.new(0.0, 0.0))
84
81
  end
85
-
82
+
86
83
  # Wrap to the other side of the screen when we fly off the edge
87
84
  def validate_position
88
85
  l_position = CP::Vec2.new(@shape.body.p.x % WIDTH, @shape.body.p.y % HEIGHT)
89
86
  @shape.body.p = l_position
90
87
  end
91
-
88
+
92
89
  def draw
93
90
  @image.draw_rot(@shape.body.p.x, @shape.body.p.y, ZOrder::Player, @shape.body.a.radians_to_gosu)
94
91
  end
@@ -98,7 +95,7 @@ end
98
95
  # Of course... it just sits around and looks good...
99
96
  class Star
100
97
  attr_reader :shape
101
-
98
+
102
99
  def initialize(animation, shape)
103
100
  @animation = animation
104
101
  @color = Gosu::Color.new(0xff_000000)
@@ -111,8 +108,8 @@ class Star
111
108
  @shape.body.a = 0.gosu_to_radians # faces towards top of screen
112
109
  end
113
110
 
114
- def draw
115
- img = @animation[Gosu.milliseconds / 100 % @animation.size];
111
+ def draw
112
+ img = @animation[Gosu.milliseconds / 100 % @animation.size]
116
113
  img.draw(@shape.body.p.x - img.width / 2.0, @shape.body.p.y - img.height / 2.0, ZOrder::Stars, 1, 1, @color, :add)
117
114
  end
118
115
  end
@@ -122,52 +119,52 @@ end
122
119
  class ChipmunkIntegration < (Example rescue Gosu::Window)
123
120
  def initialize
124
121
  super WIDTH, HEIGHT
125
-
122
+
126
123
  self.caption = "Gosu & Chipmunk Integration Demo"
127
-
128
- @background_image = Gosu::Image.new("media/space.png", :tileable => true)
124
+
125
+ @background_image = Gosu::Image.new("media/space.png", tileable: true)
129
126
 
130
127
  # Put the beep here, as it is the environment now that determines collision
131
128
  @beep = Gosu::Sample.new("media/beep.wav")
132
-
129
+
133
130
  # Put the score here, as it is the environment that tracks this now
134
131
  @score = 0
135
132
  @font = Gosu::Font.new(20)
136
-
133
+
137
134
  # Time increment over which to apply a physics "step" ("delta t")
138
- @dt = (1.0/60.0)
139
-
135
+ @dt = (1.0 / 60.0)
136
+
140
137
  # Create our Space and set its damping
141
138
  # A damping of 0.8 causes the ship bleed off its force and torque over time
142
139
  # This is not realistic behavior in a vacuum of space, but it gives the game
143
140
  # the feel I'd like in this situation
144
141
  @space = CP::Space.new
145
- @space.damping = 0.8
146
-
142
+ @space.damping = 0.8
143
+
147
144
  # Create the Body for the Player
148
145
  body = CP::Body.new(10.0, 150.0)
149
-
146
+
150
147
  # In order to create a shape, we must first define it
151
148
  # Chipmunk defines 3 types of Shapes: Segments, Circles and Polys
152
149
  # We'll use s simple, 4 sided Poly for our Player (ship)
153
150
  # You need to define the vectors so that the "top" of the Shape is towards 0 radians (the right)
154
151
  shape_array = [CP::Vec2.new(-25.0, -25.0), CP::Vec2.new(-25.0, 25.0), CP::Vec2.new(25.0, 1.0), CP::Vec2.new(25.0, -1.0)]
155
- shape = CP::Shape::Poly.new(body, shape_array, CP::Vec2.new(0,0))
156
-
152
+ shape = CP::Shape::Poly.new(body, shape_array, CP::Vec2.new(0, 0))
153
+
157
154
  # The collision_type of a shape allows us to set up special collision behavior
158
155
  # based on these types. The actual value for the collision_type is arbitrary
159
156
  # and, as long as it is consistent, will work for us; of course, it helps to have it make sense
160
157
  shape.collision_type = :ship
161
-
158
+
162
159
  @space.add_body(body)
163
160
  @space.add_shape(shape)
164
161
 
165
162
  @player = Player.new(shape)
166
163
  @player.warp(CP::Vec2.new(320, 240)) # move to the center of the window
167
-
164
+
168
165
  @star_anim = Gosu::Image.load_tiles("media/star.png", 25, 25)
169
166
  @stars = Array.new
170
-
167
+
171
168
  # Here we define what is supposed to happen when a Player (ship) collides with a Star
172
169
  # I create a @remove_shapes array because we cannot remove either Shapes or Bodies
173
170
  # from Space within a collision closure, rather, we have to wait till the closure
@@ -182,7 +179,7 @@ class ChipmunkIntegration < (Example rescue Gosu::Window)
182
179
  @beep.play
183
180
  @remove_shapes << star_shape
184
181
  end
185
-
182
+
186
183
  # Here we tell Space that we don't want one star bumping into another
187
184
  # The reason we need to do this is because when the Player hits a Star,
188
185
  # the Star will travel until it is removed in the update cycle below
@@ -208,16 +205,16 @@ class ChipmunkIntegration < (Example rescue Gosu::Window)
208
205
  @space.remove_shape(shape)
209
206
  end
210
207
  @remove_shapes.clear # clear out the shapes for next pass
211
-
208
+
212
209
  # When a force or torque is set on a Body, it is cumulative
213
210
  # This means that the force you applied last SUBSTEP will compound with the
214
211
  # force applied this SUBSTEP; which is probably not the behavior you want
215
212
  # We reset the forces on the Player each SUBSTEP for this reason
216
213
  @player.shape.body.reset_forces
217
-
214
+
218
215
  # Wrap around the screen to the other side
219
216
  @player.validate_position
220
-
217
+
221
218
  # Check keyboard
222
219
  if Gosu.button_down? Gosu::KB_LEFT
223
220
  @player.turn_left
@@ -225,7 +222,7 @@ class ChipmunkIntegration < (Example rescue Gosu::Window)
225
222
  if Gosu.button_down? Gosu::KB_RIGHT
226
223
  @player.turn_right
227
224
  end
228
-
225
+
229
226
  if Gosu.button_down? Gosu::KB_UP
230
227
  if Gosu.button_down?(Gosu::KB_RIGHT_SHIFT) or Gosu.button_down?(Gosu::KB_LEFT_SHIFT)
231
228
  @player.boost
@@ -235,21 +232,21 @@ class ChipmunkIntegration < (Example rescue Gosu::Window)
235
232
  elsif Gosu.button_down? Gosu::KB_DOWN
236
233
  @player.reverse
237
234
  end
238
-
235
+
239
236
  # Perform the step over @dt period of time
240
237
  # For best performance @dt should remain consistent for the game
241
238
  @space.step(@dt)
242
239
  end
243
-
240
+
244
241
  # Each update (not SUBSTEP) we see if we need to add more Stars
245
242
  if rand(100) < 4 and @stars.size < 25
246
243
  body = CP::Body.new(0.0001, 0.0001)
247
- shape = CP::Shape::Circle.new(body, 25/2, CP::Vec2.new(0.0, 0.0))
244
+ shape = CP::Shape::Circle.new(body, 25 / 2, CP::Vec2.new(0.0, 0.0))
248
245
  shape.collision_type = :star
249
-
246
+
250
247
  @space.add_body(body)
251
248
  @space.add_shape(shape)
252
-
249
+
253
250
  @stars.push(Star.new(@star_anim, shape))
254
251
  end
255
252
  end
@@ -258,7 +255,7 @@ class ChipmunkIntegration < (Example rescue Gosu::Window)
258
255
  @background_image.draw(0, 0, ZOrder::Background)
259
256
  @player.draw
260
257
  @stars.each { |star| star.draw }
261
- @font.draw("Score: #{@score}", 10, 10, ZOrder::UI, 1.0, 1.0, 0xff_ffff00)
258
+ @font.draw_text("Score: #{@score}", 10, 10, ZOrder::UI, 1.0, 1.0, 0xff_ffff00)
262
259
  end
263
260
 
264
261
  def button_down(id)
@@ -1,6 +1,4 @@
1
- # Encoding: UTF-8
2
-
3
- # Basically, the tutorial game taken to a jump'n'run perspective.
1
+ # A simple jump-and-run/platformer game with a tile-based map.
4
2
 
5
3
  # Shows how to
6
4
  # * implement jumping/gravity
@@ -17,7 +15,7 @@
17
15
  # 4) similarly, add sound effects for various events
18
16
  # Exploring this game's code and Gosu:
19
17
  # 5) make the player wider, so he doesn't fall off edges as easily
20
- # 6) add background music (check if playing in Window#update to implement
18
+ # 6) add background music (check if playing in Window#update to implement
21
19
  # looping)
22
20
  # 7) implement parallax scrolling for the star background!
23
21
  # Getting tricky:
@@ -27,8 +25,7 @@
27
25
  # ...Enemies, a more sophisticated object system, weapons, title and credits
28
26
  # screens...
29
27
 
30
- require 'rubygems'
31
- require 'gosu'
28
+ require "gosu"
32
29
 
33
30
  WIDTH, HEIGHT = 640, 480
34
31
 
@@ -44,7 +41,7 @@ class CollectibleGem
44
41
  @image = image
45
42
  @x, @y = x, y
46
43
  end
47
-
44
+
48
45
  def draw
49
46
  # Draw, slowly rotating
50
47
  @image.draw_rot(@x, @y, 0, 25 * Math.sin(Gosu.milliseconds / 133.7))
@@ -64,9 +61,9 @@ class Player
64
61
  @standing, @walk1, @walk2, @jump = *Gosu::Image.load_tiles("media/cptn_ruby.png", 50, 50)
65
62
  # This always points to the frame that is currently drawn.
66
63
  # This is set in update, and used in draw.
67
- @cur_image = @standing
64
+ @cur_image = @standing
68
65
  end
69
-
66
+
70
67
  def draw
71
68
  # Flip vertically when facing to the left.
72
69
  if @dir == :left
@@ -78,14 +75,14 @@ class Player
78
75
  end
79
76
  @cur_image.draw(@x + offs_x, @y - 49, 0, factor, 1.0)
80
77
  end
81
-
78
+
82
79
  # Could the object be placed at x + offs_x/y + offs_y without being stuck?
83
80
  def would_fit(offs_x, offs_y)
84
81
  # Check at the center/top and center/bottom for map collisions
85
82
  not @map.solid?(@x + offs_x, @y + offs_y) and
86
83
  not @map.solid?(@x + offs_x, @y + offs_y - 45)
87
84
  end
88
-
85
+
89
86
  def update(move_x)
90
87
  # Select image depending on action
91
88
  if (move_x == 0)
@@ -96,7 +93,7 @@ class Player
96
93
  if (@vy < 0)
97
94
  @cur_image = @jump
98
95
  end
99
-
96
+
100
97
  # Directional walking, horizontal movement
101
98
  if move_x > 0
102
99
  @dir = :right
@@ -119,13 +116,13 @@ class Player
119
116
  (-@vy).times { if would_fit(0, -1) then @y -= 1 else @vy = 0 end }
120
117
  end
121
118
  end
122
-
119
+
123
120
  def try_to_jump
124
121
  if @map.solid?(@x, @y + 1)
125
122
  @vy = -20
126
123
  end
127
124
  end
128
-
125
+
129
126
  def collect_gems(gems)
130
127
  # Same as in the tutorial game.
131
128
  gems.reject! do |c|
@@ -137,10 +134,10 @@ end
137
134
  # Map class holds and draws tiles and gems.
138
135
  class Map
139
136
  attr_reader :width, :height, :gems
140
-
137
+
141
138
  def initialize(filename)
142
139
  # Load 60x60 tiles, 5px overlap in all four directions.
143
- @tileset = Gosu::Image.load_tiles("media/tileset.png", 60, 60, :tileable => true)
140
+ @tileset = Gosu::Image.load_tiles("media/tileset.png", 60, 60, tileable: true)
144
141
 
145
142
  gem_img = Gosu::Image.new("media/gem.png")
146
143
  @gems = []
@@ -153,9 +150,9 @@ class Map
153
150
  case lines[y][x, 1]
154
151
  when '"'
155
152
  Tiles::Grass
156
- when '#'
153
+ when "#"
157
154
  Tiles::Earth
158
- when 'x'
155
+ when "x"
159
156
  @gems.push(CollectibleGem.new(gem_img, x * 50 + 25, y * 50 + 25))
160
157
  nil
161
158
  else
@@ -164,7 +161,7 @@ class Map
164
161
  end
165
162
  end
166
163
  end
167
-
164
+
168
165
  def draw
169
166
  # Very primitive drawing function:
170
167
  # Draws all the tiles, some off-screen, some on-screen.
@@ -180,7 +177,7 @@ class Map
180
177
  end
181
178
  @gems.each { |c| c.draw }
182
179
  end
183
-
180
+
184
181
  # Solid at a given pixel position?
185
182
  def solid?(x, y)
186
183
  y < 0 || @tiles[x / 50][y / 50]
@@ -190,16 +187,16 @@ end
190
187
  class CptnRuby < (Example rescue Gosu::Window)
191
188
  def initialize
192
189
  super WIDTH, HEIGHT
193
-
190
+
194
191
  self.caption = "Cptn. Ruby"
195
-
196
- @sky = Gosu::Image.new("media/space.png", :tileable => true)
192
+
193
+ @sky = Gosu::Image.new("media/space.png", tileable: true)
197
194
  @map = Map.new("media/cptn_ruby_map.txt")
198
195
  @cptn = Player.new(@map, 400, 100)
199
196
  # The scrolling position is stored as top left corner of the screen.
200
197
  @camera_x = @camera_y = 0
201
198
  end
202
-
199
+
203
200
  def update
204
201
  move_x = 0
205
202
  move_x -= 5 if Gosu.button_down? Gosu::KB_LEFT
@@ -210,7 +207,7 @@ class CptnRuby < (Example rescue Gosu::Window)
210
207
  @camera_x = [[@cptn.x - WIDTH / 2, 0].max, @map.width * 50 - WIDTH].min
211
208
  @camera_y = [[@cptn.y - HEIGHT / 2, 0].max, @map.height * 50 - HEIGHT].min
212
209
  end
213
-
210
+
214
211
  def draw
215
212
  @sky.draw 0, 0, 0
216
213
  Gosu.translate(-@camera_x, -@camera_y) do
@@ -218,7 +215,7 @@ class CptnRuby < (Example rescue Gosu::Window)
218
215
  @cptn.draw
219
216
  end
220
217
  end
221
-
218
+
222
219
  def button_down(id)
223
220
  case id
224
221
  when Gosu::KB_UP