rubygame 2.5.3 → 2.6.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.
Files changed (88) hide show
  1. data/CREDITS +6 -4
  2. data/NEWS +79 -0
  3. data/README +55 -72
  4. data/ROADMAP +20 -13
  5. data/doc/custom_sdl_load_paths.rdoc +79 -0
  6. data/doc/getting_started.rdoc +65 -36
  7. data/doc/keyboard_symbols.rdoc +243 -0
  8. data/doc/macosx_install.rdoc +49 -35
  9. data/doc/windows_install.rdoc +36 -108
  10. data/lib/rubygame.rb +62 -24
  11. data/lib/rubygame/audio.rb +147 -0
  12. data/lib/rubygame/clock.rb +164 -1
  13. data/lib/rubygame/color.rb +40 -7
  14. data/lib/rubygame/color/models/hsl.rb +1 -1
  15. data/lib/rubygame/color/models/hsv.rb +1 -1
  16. data/lib/rubygame/color/models/rgb.rb +1 -1
  17. data/lib/rubygame/color/palettes/css.rb +1 -3
  18. data/lib/rubygame/color/palettes/x11.rb +1 -2
  19. data/lib/rubygame/constants.rb +297 -0
  20. data/lib/rubygame/deprecated_mixer.rb +555 -0
  21. data/lib/rubygame/event.rb +122 -6
  22. data/lib/rubygame/event_handler.rb +3 -1
  23. data/lib/rubygame/event_hook.rb +6 -2
  24. data/lib/rubygame/event_triggers.rb +1 -1
  25. data/lib/rubygame/events.rb +416 -1
  26. data/lib/rubygame/ftor.rb +1 -7
  27. data/lib/rubygame/gfx.rb +583 -0
  28. data/lib/rubygame/gl.rb +107 -0
  29. data/lib/rubygame/image.rb +140 -0
  30. data/lib/rubygame/joystick.rb +184 -0
  31. data/lib/rubygame/main.rb +82 -0
  32. data/lib/rubygame/mediabag.rb +1 -1
  33. data/lib/rubygame/mixer.rb +30 -0
  34. data/lib/rubygame/music.rb +493 -0
  35. data/lib/rubygame/queue.rb +3 -1
  36. data/lib/rubygame/rect.rb +9 -9
  37. data/lib/rubygame/screen.rb +357 -0
  38. data/lib/rubygame/shared.rb +40 -4
  39. data/lib/rubygame/sound.rb +428 -0
  40. data/lib/rubygame/surface.rb +626 -0
  41. data/lib/rubygame/ttf.rb +311 -0
  42. data/samples/FreeSans.ttf +0 -0
  43. data/samples/README +6 -5
  44. data/samples/demo_draw.rb +1 -1
  45. data/samples/demo_gl.rb +3 -1
  46. data/samples/demo_gl_tex.rb +4 -2
  47. data/samples/demo_rubygame.rb +114 -105
  48. data/samples/demo_sfont.rb +1 -1
  49. data/samples/demo_ttf.rb +3 -1
  50. data/samples/demo_utf8.rb +1 -1
  51. data/samples/image_viewer.rb +118 -0
  52. data/samples/load_and_blit.rb +1 -1
  53. data/samples/rubygame.png +0 -0
  54. metadata +34 -40
  55. data/Rakefile +0 -537
  56. data/doc/extended_readme.rdoc +0 -49
  57. data/ext/body/rubygame_body.so +0 -0
  58. data/ext/rubygame/rubygame_clock.c +0 -301
  59. data/ext/rubygame/rubygame_clock.h +0 -32
  60. data/ext/rubygame/rubygame_event.c +0 -760
  61. data/ext/rubygame/rubygame_event.h +0 -48
  62. data/ext/rubygame/rubygame_event2.c +0 -661
  63. data/ext/rubygame/rubygame_event2.h +0 -29
  64. data/ext/rubygame/rubygame_gfx.c +0 -942
  65. data/ext/rubygame/rubygame_gfx.h +0 -101
  66. data/ext/rubygame/rubygame_gl.c +0 -154
  67. data/ext/rubygame/rubygame_gl.h +0 -32
  68. data/ext/rubygame/rubygame_image.c +0 -252
  69. data/ext/rubygame/rubygame_image.h +0 -41
  70. data/ext/rubygame/rubygame_joystick.c +0 -336
  71. data/ext/rubygame/rubygame_joystick.h +0 -41
  72. data/ext/rubygame/rubygame_main.c +0 -158
  73. data/ext/rubygame/rubygame_main.h +0 -36
  74. data/ext/rubygame/rubygame_mixer.c +0 -1024
  75. data/ext/rubygame/rubygame_mixer.h +0 -36
  76. data/ext/rubygame/rubygame_music.c +0 -1017
  77. data/ext/rubygame/rubygame_music.h +0 -29
  78. data/ext/rubygame/rubygame_screen.c +0 -572
  79. data/ext/rubygame/rubygame_screen.h +0 -45
  80. data/ext/rubygame/rubygame_shared.c +0 -269
  81. data/ext/rubygame/rubygame_shared.h +0 -69
  82. data/ext/rubygame/rubygame_sound.c +0 -863
  83. data/ext/rubygame/rubygame_sound.h +0 -29
  84. data/ext/rubygame/rubygame_surface.c +0 -1153
  85. data/ext/rubygame/rubygame_surface.h +0 -62
  86. data/ext/rubygame/rubygame_ttf.c +0 -599
  87. data/ext/rubygame/rubygame_ttf.h +0 -69
  88. data/samples/keys.rb +0 -52
@@ -0,0 +1,311 @@
1
+ #--
2
+ # Rubygame -- Ruby code and bindings to SDL to facilitate game creation
3
+ # Copyright (C) 2004-2009 John Croisant
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
+ #++
19
+
20
+
21
+
22
+ require "ruby-sdl-ffi/ttf"
23
+
24
+ Rubygame::VERSIONS[:sdl_ttf] = SDL::TTF.Linked_Version().to_ary
25
+
26
+
27
+ # *IMPORTANT*: this class only exists if SDL_ttf is available!
28
+ # Your code should check "defined?(Rubygame::TTF) != nil" to see if
29
+ # you can use this class, or be prepared to rescue from NameError.
30
+ #
31
+ # TTF provides an interface to SDL_ttf, allowing TrueType Font files to be
32
+ # loaded and used to render text to Surfaces.
33
+ #
34
+ # The TTF class *must* be initialized with the #setup method before any
35
+ # TTF objects can be created or used.
36
+ #
37
+ class Rubygame::TTF
38
+
39
+
40
+ # Attempt to setup the TTF class for use by initializing SDL_ttf.
41
+ # This *must* be called before the TTF class can be used.
42
+ # Raises SDLError if there is a problem initializing SDL_ttf.
43
+ #
44
+ def self.setup
45
+ if( SDL::TTF.WasInit() == 0 and SDL::TTF.Init() != 0 )
46
+ raise( Rubygame::SDLError,
47
+ "Could not setup TTF class: #{SDL.GetError()}" )
48
+ end
49
+ end
50
+
51
+
52
+ # Clean up and quit SDL_ttf, making the TTF class unusable as a result
53
+ # (until it is setup again). This does not need to be called before Rubygame
54
+ # exits, as it will be done automatically.
55
+ #
56
+ def self.quit
57
+ if( SDL::TTF.WasInit() != 0 )
58
+ SDL::TTF.Quit()
59
+ end
60
+ end
61
+
62
+
63
+
64
+ # Create a new TTF object, which can render text to a Surface with a
65
+ # particular font style and size.
66
+ #
67
+ # file:: filename of the TrueType font to use. Should be a TTF or
68
+ # FON file.
69
+ # size:: point size (based on 72DPI). (That means the height in pixels from
70
+ # the bottom of the descent to the top of the ascent.)
71
+ #
72
+ def initialize( file, size )
73
+ if( SDL::TTF.WasInit() == 0 )
74
+ raise( Rubygame::SDLError,
75
+ "You must call TTF.setup before opening a font." )
76
+ end
77
+
78
+ @struct = SDL::TTF.OpenFont( file, size )
79
+
80
+ if( @struct.pointer.null? )
81
+ raise Rubygame::SDLError, "Could not open font: #{SDL.GetError()}"
82
+ end
83
+ end
84
+
85
+
86
+ attr_reader :struct # :nodoc:
87
+ protected :struct
88
+
89
+
90
+ def _get_style( style ) # :nodoc:
91
+ return (SDL::TTF.GetFontStyle(@struct) & style == style)
92
+ end
93
+
94
+
95
+ # Sets the style and returns the old value.
96
+ #
97
+ def _set_style( enable, style ) # :nodoc:
98
+ old = SDL::TTF.GetFontStyle(@struct)
99
+ if( !enable and (old & style == style ) )
100
+ SDL::TTF.SetFontStyle( @struct, old ^ style )
101
+ return true
102
+ elsif( enable )
103
+ SDL::TTF.SetFontStyle( @struct, old | style )
104
+ return false
105
+ else
106
+ # No change
107
+ return enable;
108
+ end
109
+ end
110
+
111
+
112
+
113
+ # True if bold mode is enabled for this font.
114
+ #
115
+ def bold?
116
+ _get_style( SDL::TTF::STYLE_BOLD )
117
+ end
118
+ alias :bold :bold?
119
+
120
+
121
+ # Enable or disable bold mode for this font. Returns the old value.
122
+ #
123
+ def bold=( enabled )
124
+ _set_style( enabled, SDL::TTF::STYLE_BOLD )
125
+ end
126
+
127
+
128
+
129
+ # True if italic mode is enabled for this font.
130
+ #
131
+ def italic?
132
+ _get_style( SDL::TTF::STYLE_ITALIC )
133
+ end
134
+ alias :italic :italic?
135
+
136
+
137
+ # Enable or disable italic mode for this font. Returns the old
138
+ # value.
139
+ #
140
+ def italic=( enabled )
141
+ _set_style( enabled, SDL::TTF::STYLE_ITALIC )
142
+ end
143
+
144
+
145
+
146
+ # True if underline mode is enabled for this font.
147
+ #
148
+ def underline?
149
+ _get_style( SDL::TTF::STYLE_UNDERLINE )
150
+ end
151
+ alias :underline :underline?
152
+
153
+
154
+ # Enable or disable underline mode for this font. Returns the old
155
+ # value.
156
+ #
157
+ def underline=( enabled )
158
+ _set_style( enabled, SDL::TTF::STYLE_UNDERLINE )
159
+ end
160
+
161
+
162
+ # Return the biggest height (bottom to top; in pixels) of all glyphs
163
+ # in the font.
164
+ #
165
+ def height
166
+ SDL::TTF.FontHeight( @struct )
167
+ end
168
+
169
+
170
+ # Return the biggest ascent (baseline to top; in pixels) of all
171
+ # glyphs in the font.
172
+ #
173
+ def ascent
174
+ SDL::TTF.FontAnscent( @struct )
175
+ end
176
+
177
+
178
+ # Return the biggest descent (baseline to bottom; in pixels) of all
179
+ # glyphs in the font.
180
+ #
181
+ def descent
182
+ SDL::TTF.FontDescent( @struct )
183
+ end
184
+
185
+
186
+ # Return the recommended distance (in pixels) from a point on a line
187
+ # of text to the same point on the line of text below it.
188
+ #
189
+ def line_skip
190
+ SDL::TTF.FontLineSkip( @struct )
191
+ end
192
+
193
+
194
+
195
+ # The width and height the text would be if it were rendered,
196
+ # without the overhead of actually rendering it.
197
+ #
198
+ def size_text( text )
199
+ SDL::TTF.SizeText(@struct, text)
200
+ end
201
+
202
+
203
+ # The width and height the UTF-8 encoded text would be if it were
204
+ # rendered, without the overhead of actually rendering it.
205
+ #
206
+ def size_utf8( text )
207
+ SDL::TTF.SizeUTF8(@struct, text)
208
+ end
209
+
210
+
211
+ # The width and height the Unicode text would be if it were
212
+ # rendered, without the overhead of actually rendering it.
213
+ #
214
+ def size_unicode( text )
215
+ SDL::TTF.SizeUNICODE(@struct, text)
216
+ end
217
+
218
+
219
+
220
+ # Does the heavy lifting for the render methods.
221
+ #
222
+ def _render( text, smooth, color, back, shaded, blended, solid ) # :nodoc;
223
+
224
+ color = SDL::Color.new( Rubygame::Color.make_sdl_rgba(color) )
225
+
226
+ if back
227
+ back = SDL::Color.new( Rubygame::Color.make_sdl_rgba(back) )
228
+ end
229
+
230
+ surf =
231
+ if smooth
232
+ if back
233
+ shaded.call( @struct, text, color, back )
234
+ else
235
+ blended.call( @struct, text, color )
236
+ end
237
+ else
238
+ if back
239
+ s = solid.call( @struct, text, color )
240
+ SDL::SetColors( s, back.pointer, 0, 1 )
241
+ SDL::SetColorKey( s, 0, 0 );
242
+ s
243
+ else
244
+ solid.call( @struct, text, color )
245
+ end
246
+ end
247
+
248
+ if surf.pointer.null?
249
+ raise Rubygame::SDLError, "Could not render text: #{SDL.GetError()}"
250
+ end
251
+
252
+ return Rubygame::Surface.new( surf )
253
+
254
+ end
255
+
256
+
257
+ # Renders a string to a Surface with the font's style and the given
258
+ # color(s).
259
+ #
260
+ # text:: the text string to render
261
+ # smooth:: Use anti-aliasing if true. Enabling this makes the text
262
+ # look much nicer (smooth curves), but is much slower.
263
+ # color:: the color to render the text, in the form [r,g,b]
264
+ # back:: the color to use as a background for the text. This
265
+ # option can be omitted to have a transparent background.
266
+ #
267
+ def render( text, smooth, color, back=nil )
268
+ _render( text, smooth, color, back,
269
+ SDL::TTF.method(:RenderText_Shaded),
270
+ SDL::TTF.method(:RenderText_Blended),
271
+ SDL::TTF.method(:RenderText_Solid) )
272
+ end
273
+
274
+
275
+ # Renders a UTF-8 string to a Surface with the font's style and the
276
+ # given color(s).
277
+ #
278
+ # text:: the text string to render
279
+ # smooth:: Use anti-aliasing if true. Enabling this makes the text
280
+ # look much nicer (smooth curves), but is much slower.
281
+ # color:: the color to render the text, in the form [r,g,b]
282
+ # back:: the color to use as a background for the text. This
283
+ # option can be omitted to have a transparent background.
284
+ #
285
+ def render_utf8( text, smooth, color, back=nil )
286
+ _render( text, smooth, color, back,
287
+ SDL::TTF.method(:RenderUTF8_Shaded),
288
+ SDL::TTF.method(:RenderUTF8_Blended),
289
+ SDL::TTF.method(:RenderUTF8_Solid) )
290
+ end
291
+
292
+
293
+ # Renders a Unicode string to a Surface with the font's style and
294
+ # the given color(s).
295
+ #
296
+ # text:: the text string to render
297
+ # smooth:: Use anti-aliasing if true. Enabling this makes the text
298
+ # look much nicer (smooth curves), but is much slower.
299
+ # color:: the color to render the text, in the form [r,g,b]
300
+ # back:: the color to use as a background for the text. This
301
+ # option can be omitted to have a transparent background.
302
+ #
303
+ def render_unicode( text, smooth, color, back=nil )
304
+ _render( text, smooth, color, back,
305
+ SDL::TTF.method(:RenderUNICODE_Shaded),
306
+ SDL::TTF.method(:RenderUNICODE_Blended),
307
+ SDL::TTF.method(:RenderUNICODE_Solid) )
308
+ end
309
+
310
+
311
+ end
Binary file
@@ -6,14 +6,14 @@ Copyright and licensing information for those items is included herein
6
6
  for your convenience.
7
7
 
8
8
 
9
-
10
- "ruby.png" copyright (C) 2006 John Croisant
11
- "term16.png" copyright (C) 2005 John Croisant
12
9
  "panda.png" copyright (C) 2004 John Croisant
10
+ "ruby.png" copyright (C) 2006 John Croisant
11
+ "rubygame.png" copyright (C) 2009 John Croisant
13
12
  "song.ogg" copyright (C) 1999 Bjorn De Meyer
13
+ "term16.png" copyright (C) 2005 John Croisant
14
14
 
15
15
 
16
- "ruby.png", "term16.png", "panda.png", and "song.ogg"
16
+ "panda.png", "ruby.png", "rubygame.png", "song.ogg", and "term16.png"
17
17
  are licensed under the Creative Commons Attribution-ShareAlike 2.5 License.
18
18
 
19
19
  To view a copy of this license, visit
@@ -28,7 +28,8 @@ or send a letter to:
28
28
 
29
29
 
30
30
 
31
- "FreeSans.ttf" copyright (C) 2002-2003 Free Software Foundation
31
+ "FreeSans.ttf" Copyleft 2002, 2003, 2005, 2008, 2009
32
+ Free Software Foundation.
32
33
 
33
34
  "FreeSans.ttf" is licensed under the GNU General Public License.
34
35
 
@@ -30,7 +30,7 @@ Surface.autoload_dirs = [ File.dirname(__FILE__) ]
30
30
 
31
31
 
32
32
 
33
- screen = Screen.set_mode([320,240])
33
+ screen = Screen.open([320,240])
34
34
  screen.title = "Drawing test"
35
35
 
36
36
 
@@ -27,7 +27,7 @@ Rubygame::GL.set_attrib(Rubygame::GL::BLUE_SIZE, 5)
27
27
  Rubygame::GL.set_attrib(Rubygame::GL::DEPTH_SIZE, 16)
28
28
  Rubygame::GL.set_attrib(Rubygame::GL::DOUBLEBUFFER, 1)
29
29
 
30
- Rubygame::Screen.set_mode([WIDE,HIGH], 16, [Rubygame::OPENGL])
30
+ Rubygame::Screen.open([WIDE,HIGH], 16, [Rubygame::OPENGL])
31
31
  queue = Rubygame::EventQueue.new()
32
32
  clock = Rubygame::Clock.new { |c| c.target_framerate = 60 }
33
33
 
@@ -149,3 +149,5 @@ catch(:rubygame_quit) do
149
149
 
150
150
  end
151
151
  end
152
+
153
+ Rubygame.quit
@@ -21,7 +21,7 @@ WIDE = 640
21
21
  HIGH = 480
22
22
  SCALE = 500.0
23
23
  shadedCube=true
24
- TEXTURE = "ruby.png"
24
+ TEXTURE = "rubygame.png"
25
25
 
26
26
  Rubygame.init
27
27
 
@@ -31,7 +31,7 @@ Rubygame::GL.set_attrib(Rubygame::GL::BLUE_SIZE, 5)
31
31
  Rubygame::GL.set_attrib(Rubygame::GL::DEPTH_SIZE, 16)
32
32
  Rubygame::GL.set_attrib(Rubygame::GL::DOUBLEBUFFER, 1)
33
33
 
34
- Rubygame::Screen.set_mode([WIDE,HIGH], 16, [Rubygame::OPENGL])
34
+ Rubygame::Screen.open([WIDE,HIGH], 16, [Rubygame::OPENGL])
35
35
  queue = Rubygame::EventQueue.new()
36
36
  clock = Rubygame::Clock.new { |c| c.target_framerate = 60 }
37
37
 
@@ -197,3 +197,5 @@ catch(:rubygame_quit) do
197
197
 
198
198
  end
199
199
  end
200
+
201
+ Rubygame.quit
@@ -46,11 +46,13 @@ $smooth = false
46
46
  Rubygame.init()
47
47
 
48
48
 
49
- # SDL_gfx is required for drawing shapes and rotating/zooming Surfaces.
50
- $gfx_ok = (VERSIONS[:sdl_gfx] != nil)
49
+ # SDL_gfx is required for rotating/zooming Surfaces.
50
+ $gfx_ok = [:rotozoom, :zoom, :zoom_to].all? { |method|
51
+ Rubygame::Surface.new([1,1]).respond_to?( method )
52
+ }
51
53
 
52
54
  unless ( $gfx_ok )
53
- raise "You must have SDL_gfx support to run this demo!"
55
+ raise "This demo requires Surface rotozoom and zoom support (SDL_gfx)"
54
56
  end
55
57
 
56
58
 
@@ -110,18 +112,23 @@ class Panda
110
112
  include Sprites::Sprite
111
113
  include EventHandler::HasEventHandler
112
114
 
113
- # Autoload the "panda.png" image and set its colorkey
114
- @@pandapic = Surface["panda.png"]
115
- @@pandapic.set_colorkey(@@pandapic.get_at(0,0))
115
+ def self.pandapic
116
+ return @pandapic if @pandapic
117
+ # Autoload the "panda.png" image and set its colorkey
118
+ @pandapic = Surface["panda.png"]
119
+ @pandapic.set_colorkey(@pandapic.get_at(0,0))
120
+ @pandapic.to_display_alpha
121
+ end
122
+
116
123
 
117
124
  attr_accessor :vx, :vy, :speed
118
125
  def initialize(x,y)
119
126
  super()
120
127
  @vx, @vy = 0,0
121
128
  @speed = 40
122
- @image = @@pandapic
123
- @rect = Rect.new(x,y,*@@pandapic.size)
124
-
129
+ @pandapic = self.class.pandapic
130
+ @image = @pandapic
131
+ @rect = Rect.new(x,y,*@pandapic.size)
125
132
  end
126
133
 
127
134
  def update_image(time)
@@ -154,7 +161,7 @@ class SpinnyPanda < Panda
154
161
 
155
162
  def update_image(time)
156
163
  @angle += (@rate * time) % 360
157
- @image = @@pandapic.rotozoom(@angle,1,$smooth)
164
+ @image = @pandapic.rotozoom(@angle,1,$smooth)
158
165
  end
159
166
  end
160
167
 
@@ -172,7 +179,7 @@ class ExpandaPanda < Panda
172
179
  def update_image(time)
173
180
  @delta = (@delta + time*@rate/36) % (Math::PI*2)
174
181
  zoom = 1 + Math.sin(@delta)/2
175
- @image = @@pandapic.zoom(zoom,$smooth)
182
+ @image = @pandapic.zoom(zoom,$smooth)
176
183
  end
177
184
  end
178
185
 
@@ -189,63 +196,12 @@ class WobblyPanda < Panda
189
196
 
190
197
  def update_image(time)
191
198
  @delta = (@delta + time*@rate/36) % (Math::PI*2)
192
- zoomx = (1.5 + Math.sin(@delta)/6) * @@pandapic.width
193
- zoomy = (1.5 + Math.cos(@delta)/5) * @@pandapic.height
194
- @image = @@pandapic.zoom_to(zoomx,zoomy,$smooth)
195
- end
196
- end
197
-
198
-
199
- # Create the very cute panda objects!
200
- panda1 = SpinnyPanda.new(100,50)
201
- panda2 = ExpandaPanda.new(150,50)
202
- panda3 = WobblyPanda.new(200,50,0.5)
203
-
204
- # Set their depths. This affects which one appears in front
205
- # of the other in case they overlap.
206
- panda1.depth = 0 # in between the others
207
- panda2.depth = 10 # behind both of the others
208
- panda3.depth = -10 # in front of both of the others
209
-
210
-
211
-
212
-
213
- ###############
214
- # PANDA GROUP #
215
- ###############
216
-
217
-
218
- # Create a spritegroup to manage the pandas.
219
- pandas = Sprites::Group.new
220
- pandas.extend(Sprites::UpdateGroup)
221
- pandas.extend(Sprites::DepthSortGroup)
222
-
223
- # Add the pandas to the group.
224
- pandas.push(panda1,panda2,panda3)
225
-
226
-
227
- # Extend the pandas group with event hooks.
228
- class << pandas
229
- include EventHandler::HasEventHandler
230
-
231
- # Draw all the sprites and refresh
232
- # those parts of the screen
233
- def do_draw( event )
234
- dirty_rects = draw( event.screen )
235
- event.screen.update_rects(dirty_rects)
236
- end
237
-
238
- # Erase the sprites from the screen by
239
- # drawing over them with the background.
240
- def do_undraw( event )
241
- undraw( event.screen, event.background )
199
+ zoomx = (1.5 + Math.sin(@delta)/6) * @pandapic.width
200
+ zoomy = (1.5 + Math.cos(@delta)/5) * @pandapic.height
201
+ @image = @pandapic.zoom_to(zoomx,zoomy,$smooth)
242
202
  end
243
203
  end
244
204
 
245
- pandas.make_magic_hooks( :tick => :update,
246
- DrawSprites => :do_draw,
247
- UndrawSprites => :do_undraw )
248
-
249
205
 
250
206
 
251
207
  ##########
@@ -254,7 +210,7 @@ pandas.make_magic_hooks( :tick => :update,
254
210
 
255
211
 
256
212
  # Create the SDL window
257
- screen = Screen.set_mode([320,240])
213
+ screen = Screen.open([320,240])
258
214
  screen.title = "Rubygame test"
259
215
  screen.show_cursor = false;
260
216
 
@@ -289,9 +245,9 @@ ttfont.render( "Press escape or q to quit.",
289
245
 
290
246
 
291
247
 
292
- ############################
293
- # EVENT HOOKS AND HANDLING #
294
- ############################
248
+ #########################
249
+ # EVENT HOOKS FACTORIES #
250
+ #########################
295
251
 
296
252
 
297
253
  # Factory methods for creating event triggers
@@ -328,51 +284,105 @@ def joyreleased( button )
328
284
  end
329
285
 
330
286
 
331
- #######################
332
- # PANDA 1 EVENT HOOKS #
333
- #######################
334
287
 
335
- hooks = {
336
- # Start moving when an arrow key is pressed
337
- :up => proc { |owner, event| owner.vy = -1 },
338
- :down => proc { |owner, event| owner.vy = 1 },
339
- :left => proc { |owner, event| owner.vx = -1 },
340
- :right => proc { |owner, event| owner.vx = 1 },
288
+ ###################
289
+ # PANDA INSTANCES #
290
+ ###################
341
291
 
342
- # Stop moving when the arrow key is released
343
- released( :up ) => proc { |owner, event| owner.vy = 0 },
344
- released( :down ) => proc { |owner, event| owner.vy = 0 },
345
- released( :left ) => proc { |owner, event| owner.vx = 0 },
346
- released( :right ) => proc { |owner, event| owner.vx = 0 },
347
292
 
348
- # Move according to how far the joystick axis is moved
349
- joyaxis( 0 ) => proc { |owner, event| owner.vx = event.value },
350
- joyaxis( 1 ) => proc { |owner, event| owner.vy = event.value },
293
+ def make_pandas( game )
351
294
 
352
- # Fast speed when button is pressed, normal speed when released
353
- joypressed( 4 ) => proc { |owner, event| owner.speed *= 2.0 },
354
- joyreleased( 4 ) => proc { |owner, event| owner.speed *= 0.5 }
355
- }
295
+ # Create the very cute panda objects!
296
+ panda1 = SpinnyPanda.new(100,50)
297
+ panda2 = ExpandaPanda.new(150,50)
298
+ panda3 = WobblyPanda.new(200,50,0.5)
356
299
 
357
- panda1.make_magic_hooks( hooks )
300
+ # Set their depths. This affects which one appears in front
301
+ # of the other in case they overlap.
302
+ panda1.depth = 0 # in between the others
303
+ panda2.depth = 10 # behind both of the others
304
+ panda3.depth = -10 # in front of both of the others
358
305
 
359
306
 
360
- #######################
361
- # PANDA 2 EVENT HOOKS #
362
- #######################
307
+ # PANDA GROUP #
363
308
 
364
- hooks = {
365
- # Move according to how far the joystick axis is moved
366
- joyaxis( 2 ) => proc { |owner, event| owner.vx = event.value },
367
- joyaxis( 3 ) => proc { |owner, event| owner.vy = event.value },
309
+ # Create a spritegroup to manage the pandas.
310
+ pandas = Sprites::Group.new
311
+ pandas.extend(Sprites::UpdateGroup)
312
+ pandas.extend(Sprites::DepthSortGroup)
368
313
 
369
- # Fast speed when button is pressed, normal speed when released
370
- joypressed( 5 ) => proc { |owner, event| owner.speed *= 2.0 },
371
- joyreleased( 5 ) => proc { |owner, event| owner.speed *= 0.5 }
372
- }
314
+ # Add the pandas to the group.
315
+ pandas.push(panda1,panda2,panda3)
316
+
317
+
318
+ # Extend the pandas group with event hooks.
319
+ class << pandas
320
+ include EventHandler::HasEventHandler
321
+
322
+ # Draw all the sprites and refresh
323
+ # those parts of the screen
324
+ def do_draw( event )
325
+ dirty_rects = draw( event.screen )
326
+ event.screen.update_rects(dirty_rects)
327
+ end
328
+
329
+ # Erase the sprites from the screen by
330
+ # drawing over them with the background.
331
+ def do_undraw( event )
332
+ undraw( event.screen, event.background )
333
+ end
334
+ end
335
+
336
+ pandas.make_magic_hooks( :tick => :update,
337
+ DrawSprites => :do_draw,
338
+ UndrawSprites => :do_undraw )
339
+
340
+
341
+ # PANDA 1 EVENT HOOKS #
342
+
343
+ hooks = {
344
+ # Start moving when an arrow key is pressed
345
+ :up => proc { |owner, event| owner.vy = -1 },
346
+ :down => proc { |owner, event| owner.vy = 1 },
347
+ :left => proc { |owner, event| owner.vx = -1 },
348
+ :right => proc { |owner, event| owner.vx = 1 },
373
349
 
374
- panda2.make_magic_hooks( hooks )
350
+ # Stop moving when the arrow key is released
351
+ released( :up ) => proc { |owner, event| owner.vy = 0 },
352
+ released( :down ) => proc { |owner, event| owner.vy = 0 },
353
+ released( :left ) => proc { |owner, event| owner.vx = 0 },
354
+ released( :right ) => proc { |owner, event| owner.vx = 0 },
375
355
 
356
+ # Move according to how far the joystick axis is moved
357
+ joyaxis( 0 ) => proc { |owner, event| owner.vx = event.value },
358
+ joyaxis( 1 ) => proc { |owner, event| owner.vy = event.value },
359
+
360
+ # Fast speed when button is pressed, normal speed when released
361
+ joypressed( 4 ) => proc { |owner, event| owner.speed *= 2.0 },
362
+ joyreleased( 4 ) => proc { |owner, event| owner.speed *= 0.5 }
363
+ }
364
+
365
+ panda1.make_magic_hooks( hooks )
366
+
367
+
368
+ # PANDA 2 EVENT HOOKS #
369
+
370
+ hooks = {
371
+ # Move according to how far the joystick axis is moved
372
+ joyaxis( 2 ) => proc { |owner, event| owner.vx = event.value },
373
+ joyaxis( 3 ) => proc { |owner, event| owner.vy = event.value },
374
+
375
+ # Fast speed when button is pressed, normal speed when released
376
+ joypressed( 5 ) => proc { |owner, event| owner.speed *= 2.0 },
377
+ joyreleased( 5 ) => proc { |owner, event| owner.speed *= 0.5 }
378
+ }
379
+
380
+ panda2.make_magic_hooks( hooks )
381
+
382
+
383
+ game.register( pandas, panda1, panda2 )
384
+
385
+ end
376
386
 
377
387
 
378
388
 
@@ -538,8 +548,7 @@ end
538
548
 
539
549
  $game = Game.new( screen, background )
540
550
 
541
- # Register the pandas to receive events.
542
- $game.register( pandas, panda1, panda2 )
551
+ make_pandas( $game )
543
552
 
544
553
  # Start the main game loop. It will repeat forever
545
554
  # until the user quits the game!