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
@@ -17,14 +17,17 @@
17
17
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
  #++
19
19
 
20
- require 'rubygame/color/models/base'
21
- require 'rubygame/color/models/rgb'
22
- require 'rubygame/color/models/hsv'
23
- require 'rubygame/color/models/hsl'
24
20
 
25
- require 'rubygame/color/palettes/palette'
26
- require 'rubygame/color/palettes/x11'
27
- require 'rubygame/color/palettes/css'
21
+
22
+ %w{ base rgb hsv hsl }.each do |f|
23
+ require( File.join( File.dirname(__FILE__), "color", "models", f ) )
24
+ end
25
+
26
+ %w{ palette x11 css }.each do |f|
27
+ require( File.join( File.dirname(__FILE__), "color", "palettes", f ) )
28
+ end
29
+
30
+
28
31
 
29
32
  module Rubygame
30
33
 
@@ -74,6 +77,36 @@ module Rubygame
74
77
  GLOBAL[name] = color
75
78
  end
76
79
 
80
+
81
+ # For use by Rubygame methods only:
82
+
83
+ # Convert a color name (string or symbol), Color instance, or Array
84
+ # to a color array.
85
+ def self.convert_color( color ) # :nodoc:
86
+ color =
87
+ if color.kind_of?(Symbol) or color.kind_of?(String)
88
+ Rubygame::Color[color].to_sdl_rgba_ary
89
+ elsif color.respond_to? :to_sdl_rgba_ary
90
+ color.to_sdl_rgba_ary
91
+ elsif color.respond_to? :to_ary
92
+ color.to_ary
93
+ else
94
+ raise TypeError, "unsupported type #{color.class} for color"
95
+ end
96
+
97
+ unless color.size.between?(3,4) and color.all?{|n| n.kind_of? Numeric}
98
+ raise TypeError, "invalid color: #{color.inspect}"
99
+ end
100
+
101
+ return color
102
+ end
103
+
104
+ def self.make_sdl_rgba( color ) # :nodoc:
105
+ r,g,b,a = convert_color(color).collect!{ |c| c.to_i }[0,4]
106
+ a = 255 if a.nil?
107
+ [r,g,b,a]
108
+ end
109
+
77
110
  end
78
111
  end
79
112
 
@@ -17,7 +17,7 @@
17
17
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
  #++
19
19
 
20
- require 'rubygame/color/models/base'
20
+
21
21
 
22
22
  module Rubygame
23
23
  module Color
@@ -17,7 +17,7 @@
17
17
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
  #++
19
19
 
20
- require 'rubygame/color/models/base'
20
+
21
21
 
22
22
  module Rubygame
23
23
  module Color
@@ -17,7 +17,7 @@
17
17
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
  #++
19
19
 
20
- require 'rubygame/color/models/base'
20
+
21
21
 
22
22
  module Rubygame
23
23
  module Color
@@ -17,9 +17,7 @@
17
17
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
  #++
19
19
 
20
- require 'rubygame/color'
21
- require 'rubygame/color/palettes/palette'
22
- require 'rubygame/color/palettes/x11'
20
+
23
21
 
24
22
  module Rubygame
25
23
  module Color
@@ -17,8 +17,7 @@
17
17
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
  #++
19
19
 
20
- require 'rubygame/color'
21
- require 'rubygame/color/palettes/palette'
20
+
22
21
 
23
22
  module Rubygame
24
23
  module Color
@@ -19,6 +19,303 @@
19
19
 
20
20
  module Rubygame
21
21
 
22
+
23
+ # Event constants
24
+ NOEVENT = SDL::NOEVENT
25
+ ACTIVEEVENT = SDL::ACTIVEEVENT
26
+ KEYDOWN = SDL::KEYDOWN
27
+ KEYUP = SDL::KEYUP
28
+ MOUSEMOTION = SDL::MOUSEMOTION
29
+ MOUSEBUTTONDOWN = SDL::MOUSEBUTTONDOWN
30
+ MOUSEBUTTONUP = SDL::MOUSEBUTTONUP
31
+ JOYAXISMOTION = SDL::JOYAXISMOTION
32
+ JOYBALLMOTION = SDL::JOYBALLMOTION
33
+ JOYHATMOTION = SDL::JOYHATMOTION
34
+ JOYBUTTONDOWN = SDL::JOYBUTTONDOWN
35
+ JOYBUTTONUP = SDL::JOYBUTTONUP
36
+ QUIT = SDL::QUIT
37
+ SYSWMEVENT = SDL::SYSWMEVENT
38
+ VIDEORESIZE = SDL::VIDEORESIZE
39
+ VIDEOEXPOSE = SDL::VIDEOEXPOSE
40
+ USEREVENT = SDL::USEREVENT
41
+
42
+
43
+ # Joystick constants
44
+ HAT_CENTERED = SDL::HAT_CENTERED
45
+ HAT_UP = SDL::HAT_UP
46
+ HAT_RIGHT = SDL::HAT_RIGHT
47
+ HAT_DOWN = SDL::HAT_DOWN
48
+ HAT_LEFT = SDL::HAT_LEFT
49
+ HAT_RIGHTUP = SDL::HAT_RIGHTUP
50
+ HAT_RIGHTDOWN = SDL::HAT_RIGHTDOWN
51
+ HAT_LEFTUP = SDL::HAT_LEFTUP
52
+ HAT_LEFTDOWN = SDL::HAT_LEFTDOWN
53
+
54
+
55
+ # Mouse constants
56
+ MOUSE_LEFT = SDL::BUTTON_LEFT
57
+ MOUSE_MIDDLE = SDL::BUTTON_MIDDLE
58
+ MOUSE_RIGHT = SDL::BUTTON_RIGHT
59
+ MOUSE_LMASK = SDL::BUTTON_LMASK
60
+ MOUSE_MMASK = SDL::BUTTON_MMASK
61
+ MOUSE_RMASK = SDL::BUTTON_RMASK
62
+
63
+
64
+ # ASCII key symbols
65
+ K_UNKNOWN = SDL::K_UNKNOWN
66
+ K_FIRST = SDL::K_FIRST
67
+ K_BACKSPACE = SDL::K_BACKSPACE
68
+ K_TAB = SDL::K_TAB
69
+ K_CLEAR = SDL::K_CLEAR
70
+ K_RETURN = SDL::K_RETURN
71
+ K_PAUSE = SDL::K_PAUSE
72
+ K_ESCAPE = SDL::K_ESCAPE
73
+ K_SPACE = SDL::K_SPACE
74
+ K_EXCLAIM = SDL::K_EXCLAIM
75
+ K_QUOTEDBL = SDL::K_QUOTEDBL
76
+ K_HASH = SDL::K_HASH
77
+ K_DOLLAR = SDL::K_DOLLAR
78
+ K_AMPERSAND = SDL::K_AMPERSAND
79
+ K_QUOTE = SDL::K_QUOTE
80
+ K_LEFTPAREN = SDL::K_LEFTPAREN
81
+ K_RIGHTPAREN = SDL::K_RIGHTPAREN
82
+ K_ASTERISK = SDL::K_ASTERISK
83
+ K_PLUS = SDL::K_PLUS
84
+ K_COMMA = SDL::K_COMMA
85
+ K_MINUS = SDL::K_MINUS
86
+ K_PERIOD = SDL::K_PERIOD
87
+ K_SLASH = SDL::K_SLASH
88
+ K_0 = SDL::K_0
89
+ K_1 = SDL::K_1
90
+ K_2 = SDL::K_2
91
+ K_3 = SDL::K_3
92
+ K_4 = SDL::K_4
93
+ K_5 = SDL::K_5
94
+ K_6 = SDL::K_6
95
+ K_7 = SDL::K_7
96
+ K_8 = SDL::K_8
97
+ K_9 = SDL::K_9
98
+ K_COLON = SDL::K_COLON
99
+ K_SEMICOLON = SDL::K_SEMICOLON
100
+ K_LESS = SDL::K_LESS
101
+ K_EQUALS = SDL::K_EQUALS
102
+ K_GREATER = SDL::K_GREATER
103
+ K_QUESTION = SDL::K_QUESTION
104
+ K_AT = SDL::K_AT
105
+ K_LEFTBRACKET = SDL::K_LEFTBRACKET
106
+ K_BACKSLASH = SDL::K_BACKSLASH
107
+ K_RIGHTBRACKET = SDL::K_RIGHTBRACKET
108
+ K_CARET = SDL::K_CARET
109
+ K_UNDERSCORE = SDL::K_UNDERSCORE
110
+ K_BACKQUOTE = SDL::K_BACKQUOTE
111
+ K_A = SDL::K_a
112
+ K_B = SDL::K_b
113
+ K_C = SDL::K_c
114
+ K_D = SDL::K_d
115
+ K_E = SDL::K_e
116
+ K_F = SDL::K_f
117
+ K_G = SDL::K_g
118
+ K_H = SDL::K_h
119
+ K_I = SDL::K_i
120
+ K_J = SDL::K_j
121
+ K_K = SDL::K_k
122
+ K_L = SDL::K_l
123
+ K_M = SDL::K_m
124
+ K_N = SDL::K_n
125
+ K_O = SDL::K_o
126
+ K_P = SDL::K_p
127
+ K_Q = SDL::K_q
128
+ K_R = SDL::K_r
129
+ K_S = SDL::K_s
130
+ K_T = SDL::K_t
131
+ K_U = SDL::K_u
132
+ K_V = SDL::K_v
133
+ K_W = SDL::K_w
134
+ K_X = SDL::K_x
135
+ K_Y = SDL::K_y
136
+ K_Z = SDL::K_z
137
+ K_DELETE = SDL::K_DELETE
138
+
139
+
140
+ # International keyboard symbols
141
+ K_WORLD_0 = SDL::K_WORLD_0
142
+ K_WORLD_1 = SDL::K_WORLD_1
143
+ K_WORLD_2 = SDL::K_WORLD_2
144
+ K_WORLD_3 = SDL::K_WORLD_3
145
+ K_WORLD_4 = SDL::K_WORLD_4
146
+ K_WORLD_5 = SDL::K_WORLD_5
147
+ K_WORLD_6 = SDL::K_WORLD_6
148
+ K_WORLD_7 = SDL::K_WORLD_7
149
+ K_WORLD_8 = SDL::K_WORLD_8
150
+ K_WORLD_9 = SDL::K_WORLD_9
151
+ K_WORLD_10 = SDL::K_WORLD_10
152
+ K_WORLD_11 = SDL::K_WORLD_11
153
+ K_WORLD_12 = SDL::K_WORLD_12
154
+ K_WORLD_13 = SDL::K_WORLD_13
155
+ K_WORLD_14 = SDL::K_WORLD_14
156
+ K_WORLD_15 = SDL::K_WORLD_15
157
+ K_WORLD_16 = SDL::K_WORLD_16
158
+ K_WORLD_17 = SDL::K_WORLD_17
159
+ K_WORLD_18 = SDL::K_WORLD_18
160
+ K_WORLD_19 = SDL::K_WORLD_19
161
+ K_WORLD_20 = SDL::K_WORLD_20
162
+ K_WORLD_21 = SDL::K_WORLD_21
163
+ K_WORLD_22 = SDL::K_WORLD_22
164
+ K_WORLD_23 = SDL::K_WORLD_23
165
+ K_WORLD_24 = SDL::K_WORLD_24
166
+ K_WORLD_25 = SDL::K_WORLD_25
167
+ K_WORLD_26 = SDL::K_WORLD_26
168
+ K_WORLD_27 = SDL::K_WORLD_27
169
+ K_WORLD_28 = SDL::K_WORLD_28
170
+ K_WORLD_29 = SDL::K_WORLD_29
171
+ K_WORLD_30 = SDL::K_WORLD_30
172
+ K_WORLD_31 = SDL::K_WORLD_31
173
+ K_WORLD_32 = SDL::K_WORLD_32
174
+ K_WORLD_33 = SDL::K_WORLD_33
175
+ K_WORLD_34 = SDL::K_WORLD_34
176
+ K_WORLD_35 = SDL::K_WORLD_35
177
+ K_WORLD_36 = SDL::K_WORLD_36
178
+ K_WORLD_37 = SDL::K_WORLD_37
179
+ K_WORLD_38 = SDL::K_WORLD_38
180
+ K_WORLD_39 = SDL::K_WORLD_39
181
+ K_WORLD_40 = SDL::K_WORLD_40
182
+ K_WORLD_41 = SDL::K_WORLD_41
183
+ K_WORLD_42 = SDL::K_WORLD_42
184
+ K_WORLD_43 = SDL::K_WORLD_43
185
+ K_WORLD_44 = SDL::K_WORLD_44
186
+ K_WORLD_45 = SDL::K_WORLD_45
187
+ K_WORLD_46 = SDL::K_WORLD_46
188
+ K_WORLD_47 = SDL::K_WORLD_47
189
+ K_WORLD_48 = SDL::K_WORLD_48
190
+ K_WORLD_49 = SDL::K_WORLD_49
191
+ K_WORLD_50 = SDL::K_WORLD_50
192
+ K_WORLD_51 = SDL::K_WORLD_51
193
+ K_WORLD_52 = SDL::K_WORLD_52
194
+ K_WORLD_53 = SDL::K_WORLD_53
195
+ K_WORLD_54 = SDL::K_WORLD_54
196
+ K_WORLD_55 = SDL::K_WORLD_55
197
+ K_WORLD_56 = SDL::K_WORLD_56
198
+ K_WORLD_57 = SDL::K_WORLD_57
199
+ K_WORLD_58 = SDL::K_WORLD_58
200
+ K_WORLD_59 = SDL::K_WORLD_59
201
+ K_WORLD_60 = SDL::K_WORLD_60
202
+ K_WORLD_61 = SDL::K_WORLD_61
203
+ K_WORLD_62 = SDL::K_WORLD_62
204
+ K_WORLD_63 = SDL::K_WORLD_63
205
+ K_WORLD_64 = SDL::K_WORLD_64
206
+ K_WORLD_65 = SDL::K_WORLD_65
207
+ K_WORLD_66 = SDL::K_WORLD_66
208
+ K_WORLD_67 = SDL::K_WORLD_67
209
+ K_WORLD_68 = SDL::K_WORLD_68
210
+ K_WORLD_69 = SDL::K_WORLD_69
211
+ K_WORLD_70 = SDL::K_WORLD_70
212
+ K_WORLD_71 = SDL::K_WORLD_71
213
+ K_WORLD_72 = SDL::K_WORLD_72
214
+ K_WORLD_73 = SDL::K_WORLD_73
215
+ K_WORLD_74 = SDL::K_WORLD_74
216
+ K_WORLD_75 = SDL::K_WORLD_75
217
+ K_WORLD_76 = SDL::K_WORLD_76
218
+ K_WORLD_77 = SDL::K_WORLD_77
219
+ K_WORLD_78 = SDL::K_WORLD_78
220
+ K_WORLD_79 = SDL::K_WORLD_79
221
+ K_WORLD_80 = SDL::K_WORLD_80
222
+ K_WORLD_81 = SDL::K_WORLD_81
223
+ K_WORLD_82 = SDL::K_WORLD_82
224
+ K_WORLD_83 = SDL::K_WORLD_83
225
+ K_WORLD_84 = SDL::K_WORLD_84
226
+ K_WORLD_85 = SDL::K_WORLD_85
227
+ K_WORLD_86 = SDL::K_WORLD_86
228
+ K_WORLD_87 = SDL::K_WORLD_87
229
+ K_WORLD_88 = SDL::K_WORLD_88
230
+ K_WORLD_89 = SDL::K_WORLD_89
231
+ K_WORLD_90 = SDL::K_WORLD_90
232
+ K_WORLD_91 = SDL::K_WORLD_91
233
+ K_WORLD_92 = SDL::K_WORLD_92
234
+ K_WORLD_93 = SDL::K_WORLD_93
235
+ K_WORLD_94 = SDL::K_WORLD_94
236
+ K_WORLD_95 = SDL::K_WORLD_95
237
+
238
+
239
+ # Numeric keypad symbols
240
+ K_KP0 = SDL::K_KP0
241
+ K_KP1 = SDL::K_KP1
242
+ K_KP2 = SDL::K_KP2
243
+ K_KP3 = SDL::K_KP3
244
+ K_KP4 = SDL::K_KP4
245
+ K_KP5 = SDL::K_KP5
246
+ K_KP6 = SDL::K_KP6
247
+ K_KP7 = SDL::K_KP7
248
+ K_KP8 = SDL::K_KP8
249
+ K_KP9 = SDL::K_KP9
250
+ K_KP_PERIOD = SDL::K_KP_PERIOD
251
+ K_KP_DIVIDE = SDL::K_KP_DIVIDE
252
+ K_KP_MULTIPLY = SDL::K_KP_MULTIPLY
253
+ K_KP_MINUS = SDL::K_KP_MINUS
254
+ K_KP_PLUS = SDL::K_KP_PLUS
255
+ K_KP_ENTER = SDL::K_KP_ENTER
256
+ K_KP_EQUALS = SDL::K_KP_EQUALS
257
+
258
+
259
+ # Arrows + Home/End pad
260
+ K_UP = SDL::K_UP
261
+ K_DOWN = SDL::K_DOWN
262
+ K_RIGHT = SDL::K_RIGHT
263
+ K_LEFT = SDL::K_LEFT
264
+ K_INSERT = SDL::K_INSERT
265
+ K_HOME = SDL::K_HOME
266
+ K_END = SDL::K_END
267
+ K_PAGEUP = SDL::K_PAGEUP
268
+ K_PAGEDOWN = SDL::K_PAGEDOWN
269
+
270
+
271
+ # Function keys
272
+ K_F1 = SDL::K_F1
273
+ K_F2 = SDL::K_F2
274
+ K_F3 = SDL::K_F3
275
+ K_F4 = SDL::K_F4
276
+ K_F5 = SDL::K_F5
277
+ K_F6 = SDL::K_F6
278
+ K_F7 = SDL::K_F7
279
+ K_F8 = SDL::K_F8
280
+ K_F9 = SDL::K_F9
281
+ K_F10 = SDL::K_F10
282
+ K_F11 = SDL::K_F11
283
+ K_F12 = SDL::K_F12
284
+ K_F13 = SDL::K_F13
285
+ K_F14 = SDL::K_F14
286
+ K_F15 = SDL::K_F15
287
+
288
+
289
+ # Key state modifier keys
290
+ K_NUMLOCK = SDL::K_NUMLOCK
291
+ K_CAPSLOCK = SDL::K_CAPSLOCK
292
+ K_SCROLLOCK = SDL::K_SCROLLOCK
293
+ K_RSHIFT = SDL::K_RSHIFT
294
+ K_LSHIFT = SDL::K_LSHIFT
295
+ K_RCTRL = SDL::K_RCTRL
296
+ K_LCTRL = SDL::K_LCTRL
297
+ K_RALT = SDL::K_RALT
298
+ K_LALT = SDL::K_LALT
299
+ K_RMETA = SDL::K_RMETA
300
+ K_LMETA = SDL::K_LMETA
301
+ K_LSUPER = SDL::K_LSUPER
302
+ K_RSUPER = SDL::K_RSUPER
303
+ K_MODE = SDL::K_MODE
304
+
305
+
306
+ # Miscellaneous keys
307
+ K_HELP = SDL::K_HELP
308
+ K_PRINT = SDL::K_PRINT
309
+ K_SYSREQ = SDL::K_SYSREQ
310
+ K_BREAK = SDL::K_BREAK
311
+ K_MENU = SDL::K_MENU
312
+ K_POWER = SDL::K_POWER
313
+ K_EURO = SDL::K_EURO
314
+ K_LAST = SDL::K_LAST
315
+
316
+
317
+
318
+
22
319
  module Mouse
23
320
  # Hash to translate mouse button sym to string
24
321
  MOUSE2STR = {
@@ -0,0 +1,555 @@
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
+ # **NOTE:** This module is DEPRECATED and will be removed in Rubygame 3.0.
22
+ # Please use Rubygame.open_audio, Rubygame.close_audio, Rubygame::Sound,
23
+ # and Rubygame::Music instead.
24
+ #
25
+ # The Mixer module provides access to the SDL_mixer library for audio
26
+ # playback and mixing. This module is still very basic, but it is
27
+ # good enough to load and play WAV files on multiple mix channels.
28
+ #
29
+ # See the Sample class for loading audio files.
30
+ # See the Music class for streaming music from a file.
31
+ #
32
+ module Rubygame::Mixer
33
+
34
+ AUDIO_U8 = SDL::AUDIO_U8
35
+ AUDIO_S8 = SDL::AUDIO_S8
36
+ AUDIO_U16SYS = SDL::AUDIO_U16SYS
37
+ AUDIO_S16SYS = SDL::AUDIO_S16SYS
38
+
39
+
40
+ # **NOTE:** This method is DEPRECATED and will be removed in
41
+ # Rubygame 3.0. Please use the Rubygame.open_audio instead.
42
+ #
43
+ # Initializes the audio device. You must call this before using the other
44
+ # mixer functions. See also #close_audio().
45
+ #
46
+ # Returns nil. May raise an SDLError if initialization fails.
47
+ #
48
+ # This method takes these arguments:
49
+ #
50
+ # frequency:: output sample rate in audio samples per second (Hz).
51
+ # Affects the quality of the sound output, at the
52
+ # expense of CPU usage. If nil, the default (22050) is
53
+ # used. 22050 is recommended for most games. For
54
+ # reference, 44100 is CD quality.
55
+ #
56
+ # The larger the value, the more processing required.
57
+ #
58
+ # format:: output sample format. If nil, the default recommended
59
+ # system format is used. It's _highly_ recommended you
60
+ # leave this nil!
61
+ #
62
+ # But if you're feeling reckless, you can use one of these
63
+ # constants located in the Rubygame::Mixer module:
64
+ #
65
+ # AUDIO_U16SYS:: unsigned 16-bit samples.
66
+ # AUDIO_S16SYS:: signed 16-bit samples.
67
+ # AUDIO_U8:: unsigned 8-bit samples.
68
+ # AUDIO_S8:: signed 8-bit samples.
69
+ #
70
+ # channels:: output sound channels. Use 2 for stereo, 1 for mono.
71
+ # If nil, the default (2) is used.
72
+ # This option is not related to mixing channels.
73
+ #
74
+ # buffer:: size of the sound buffer, in bytes. If nil, the default
75
+ # (1024) is used. Larger values have more delay before
76
+ # playing a sound, but require less CPU usage (and
77
+ # have less skipping on slow systems).
78
+ #
79
+ #
80
+ def self.open_audio( frequency=nil, format=nil, channels=nil, buffer=nil )
81
+
82
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
83
+
84
+ frequency = (frequency or 22050)
85
+ format = (format or AUDIO_U16SYS)
86
+ channels = (channels or 2)
87
+ buffer = (buffer or 1024)
88
+
89
+ result = SDL::Mixer.OpenAudio(frequency, format, channels, buffer)
90
+
91
+ if( result < 0 )
92
+ raise( Rubygame::SDLError,
93
+ "Error initializing SDL_mixer: #{SDL.GetError()}" )
94
+ end
95
+
96
+ return nil
97
+ end
98
+
99
+
100
+ # **NOTE:** This method is DEPRECATED and will be removed in
101
+ # Rubygame 3.0. Please use the Rubygame.close_audio instead.
102
+ #
103
+ # Close the audio device being used by the mixer. You should not use any
104
+ # mixer functions after this function, unless you use #open_audio() to
105
+ # re-open the audio device. See also #open_audio().
106
+ #
107
+ # Returns nil.
108
+ #
109
+ def self.close_audio()
110
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
111
+ SDL::Mixer.CloseAudio()
112
+ return nil
113
+ end
114
+
115
+
116
+ # **NOTE:** This method is DEPRECATED and will be removed in
117
+ # Rubygame 3.0. Please use the Rubygame::Sound class instead.
118
+ #
119
+ # Returns the number of mixing channels currently allocated.
120
+ # See also #mix_channels=
121
+ #
122
+ def self.mix_channels
123
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
124
+ return SDL::Mixer.AllocateChannels(-1)
125
+ end
126
+
127
+
128
+ # **NOTE:** This method is DEPRECATED and will be removed in
129
+ # Rubygame 3.0. Please use the Rubygame::Sound class instead.
130
+ #
131
+ # Set the number of mixer channels, allocating or deallocating channels as
132
+ # needed. This can be called many times, even during audio playback. If this
133
+ # call reduces the number of channels allocated, the excess channels will
134
+ # be stopped automatically. See also #mix_channels
135
+ #
136
+ # Returns the number of mixing channels allocated.
137
+ #
138
+ # Note that 8 mixing channels are allocated when #open_audio is called.
139
+ # This method only needs to be called if you want a different number (either
140
+ # greater or fewer) of mixing channels.
141
+ #
142
+ # This method takes this argument:
143
+ # num_channels:: desired number of mixing channels, an integer.
144
+ # Negative values will cause this method to behave as
145
+ # #mix_channels, returning the number of channels
146
+ # currently allocated, without changing it.
147
+ #
148
+ def self.mix_channels=( num_channels )
149
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
150
+ return SDL::Mixer.AllocateChannels( num_channels )
151
+ end
152
+
153
+
154
+ # **NOTE:** This method is DEPRECATED and will be removed in
155
+ # Rubygame 3.0. Please use the Rubygame.audio_driver instead.
156
+ #
157
+ # Returns the name of the audio driver that SDL is using.
158
+ #
159
+ # May raise SDLError if initialization fails.
160
+ #
161
+ def self.driver_name
162
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
163
+
164
+ driver = SDL.AudioDriverName()
165
+
166
+ if driver.nil?
167
+ raise( Rubygame::SDLError,
168
+ "Error fetching audio driver name: #{SDL.GetError()}" )
169
+ end
170
+
171
+ return driver
172
+ end
173
+
174
+
175
+ # **NOTE:** This method is DEPRECATED and will be removed in
176
+ # Rubygame 3.0. Please use the Rubygame::Sound class instead.
177
+ #
178
+ # Play an audio Sample on a mixing channel, repeating a certain number
179
+ # of extra times. Returns the number of the channel that the sample
180
+ # is being played on.
181
+ #
182
+ # Raises SDLError if something goes wrong.
183
+ #
184
+ # This method takes these arguments:
185
+ # sample:: what Sample to play
186
+ # channel_num:: which mixing channel to play the sample on.
187
+ # Use -1 to play on the first unreserved channel.
188
+ # repeats:: how many extra times to repeat the sample.
189
+ # Can be -1 to repeat forever until it is stopped.
190
+ #
191
+ def self.play( sample, channel_num, repeats )
192
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
193
+
194
+ result = SDL::Mixer.PlayChannel( channel_num, sample.struct, repeats )
195
+
196
+ if( result < 0 )
197
+ raise( Rubygame::SDLError,
198
+ "Error playing sample on channel %d: %s"%
199
+ [channel, SDL.GetError()] )
200
+ end
201
+
202
+ return result
203
+ end
204
+
205
+
206
+ # Stop playback of a playing or paused mixing channel.
207
+ # Unlike #pause, playback cannot be resumed from the current point.
208
+ # See also #play.
209
+ #
210
+ def self.stop( channel_num )
211
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
212
+ SDL::Mixer.HaltChannel( channel_num )
213
+ return nil
214
+ end
215
+
216
+
217
+ # Pause playback of a currently-playing mixing channel.
218
+ # Playback can be resumed from the current point with #resume.
219
+ # See also #stop.
220
+ #
221
+ def self.pause( channel_num )
222
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
223
+ SDL::Mixer.Pause( channel_num )
224
+ return nil
225
+ end
226
+
227
+
228
+ # Resume playback of a paused mixing channel. The channel must have
229
+ # been paused (via the #pause method) for this to have any effect.
230
+ # Playback will resume from the point where the channel was paused.
231
+ #
232
+ def self.resume( channel_num )
233
+ Rubygame.deprecated( "Rubygame::Mixer", "3.0" )
234
+ SDL::Mixer.Resume( channel_num )
235
+ return nil
236
+ end
237
+
238
+ end
239
+
240
+
241
+
242
+ # **NOTE:** This class is DEPRECATED and will be removed in Rubygame 3.0.
243
+ # Please use the Rubygame::Sound class instead.
244
+ #
245
+ # Stores audio data to play with Rubygame::Mixer.play
246
+ #
247
+ class Rubygame::Mixer::Sample
248
+
249
+ # **NOTE:** Rubygame::Mixer::Sample is DEPRECATED and will be removed in
250
+ # Rubygame 3.0. Please use the Rubygame::Sound class instead.
251
+ #
252
+ # Load an audio sample (a "chunk", to use SDL_mixer's term) from a file.
253
+ # Only WAV files are supported at this time.
254
+ #
255
+ # Raises SDLError if the sample could not be loaded.
256
+ #
257
+ def self.load_audio( filename )
258
+ Rubygame.deprecated( "Rubygame::Mixer::Sample", "3.0" )
259
+
260
+ chunk = SDL::Mixer.LoadWAV( filename )
261
+
262
+ if( chunk.pointer.null? )
263
+ raise( Rubygame::SDLError,
264
+ "Error loading audio Sample from file `%s': %s"%
265
+ [filename, SDL.GetError()] )
266
+ end
267
+
268
+ return new( chunk )
269
+ end
270
+
271
+
272
+ attr_reader :struct # :nodoc:
273
+ protected :struct
274
+
275
+
276
+ # call-seq: new
277
+ def initialize( struct=nil )
278
+ @struct = struct
279
+ end
280
+
281
+ end
282
+
283
+
284
+
285
+ # **NOTE:** This class is DEPRECATED and will be removed in Rubygame 3.0.
286
+ # Please use the Rubygame::Music class instead.
287
+ #
288
+ # The Music class is used for playing music from a file. It supports
289
+ # WAVE, MOD, MIDI, OGG, and MP3 files. There are two important differences
290
+ # between Music and Sample:
291
+ #
292
+ # 1. Music streams the music from disk, which means it can start faster and
293
+ # uses less memory than Sample, which loads the entire file into memory.
294
+ # This is especially important for music files, which are often several
295
+ # minutes long.
296
+ # 2. There can only be one Music instance playing at once, while there can
297
+ # be many Samples playing at once. If you play a second Music while one
298
+ # is already playing, the first one will be stopped. See #play.
299
+ #
300
+ class Rubygame::Mixer::Music
301
+
302
+ # # Sets the external command used to play music.
303
+ # #
304
+ # # Raises SDLError if something goes wrong.
305
+ # #
306
+ # # This method takes these arguments:
307
+ # # command:: what command to use to play the music.
308
+ # #
309
+ # def set_command( command )
310
+ # Rubygame.deprecated( "Rubygame::Mixer::Music", "3.0" )
311
+ #
312
+ # result = SDL::Mixer.SetMusicCMD( command )
313
+ #
314
+ # if( result < 0 )
315
+ # raise( Rubygame::SDLError,
316
+ # "Error setting music player command to `%s': %s"%
317
+ # [command, SDL.GetError()] )
318
+ # end
319
+ #
320
+ # return result
321
+ # end
322
+
323
+
324
+ # **NOTE:** Rubygame::Mixer::Music is DEPRECATED and will be removed
325
+ # in Rubygame 3.0. Please use the Rubygame::Music class instead.
326
+ #
327
+ # Load music from a file. Supports WAV, MOD, MIDI, OGG, and MP3 formats.
328
+ #
329
+ # Raises SDLError if the music could not be loaded.
330
+ #
331
+ def self.load_audio
332
+ Rubygame.deprecated( "Rubygame::Mixer::Music", "3.0" )
333
+
334
+ music = SDL::Mixer.LoadMUS( filename )
335
+
336
+ if( music.pointer.null? )
337
+ raise( Rubygame::SDLError,
338
+ "Error loading audio music from file `%s': %s"%
339
+ [filename, SDL.GetError()] )
340
+ end
341
+
342
+ return new( music )
343
+ end
344
+
345
+
346
+ attr_reader :struct # :nodoc:
347
+ protected :struct
348
+
349
+
350
+ # call-seq: new
351
+ def initialize( struct=nil )
352
+ @struct = struct
353
+ end
354
+
355
+
356
+ # Play music, repeating a certain number of extra times. If
357
+ # any music was already playing, that music will be stopped
358
+ # first, and this music will start.
359
+ #
360
+ # Raises SDLError if something goes wrong.
361
+ #
362
+ # This method takes these arguments:
363
+ # repeats:: how many extra times to play the music.
364
+ # Can be -1 to repeat forever until it is stopped.
365
+ #
366
+ def play( repeats=0 )
367
+ # Adjust so repeats means the same as it does for Samples
368
+ repeats += 1 if repeats > -1
369
+
370
+ result = SDL::Mixer.PlayMusic( @struct, repeats )
371
+
372
+ if( result < 0 )
373
+ raise Rubygame::SDLError, "Error playing music: #{SDL.GetError()}"
374
+ end
375
+
376
+ return self
377
+ end
378
+
379
+
380
+ # Stop playback of music.
381
+ # See also #play
382
+ #
383
+ def stop
384
+ SDL::Mixer::HaltMusic()
385
+ return self
386
+ end
387
+
388
+
389
+ # Pause playback of the playing music. You can later #resume
390
+ # playback from the point where you paused.
391
+ # Safe to use on already-paused music.
392
+ # See also #play_music.
393
+ #
394
+ def pause
395
+ SDL::Mixer::PauseMusic()
396
+ return self
397
+ end
398
+
399
+
400
+ # Resume playback of paused music from the point it was paused.
401
+ # Safe to use on already-playing music.
402
+ # See also #play.
403
+ #
404
+ def resume
405
+ SDL::Mixer::ResumeMusic()
406
+ return self
407
+ end
408
+
409
+
410
+ # Rewind the music to the start. This is safe to use on stopped,
411
+ # paused, and playing music. Only works for MOD, OGG, MP3, and
412
+ # MIDI (but not WAV).
413
+ #
414
+ def rewind
415
+ SDL::Mixer::RewindMusic()
416
+ return self
417
+ end
418
+
419
+
420
+ # Jump to a certain time in the music.
421
+ # Only works when music is playing or paused (but not stopped).
422
+ # Only works for OGG and MP3 files.
423
+ #
424
+ # Raises SDLError if something goes wrong, or if the music type does not
425
+ # support setting the position.
426
+ #
427
+ # time:: Time to jump to, in seconds from the beginning.
428
+ #
429
+ def jump( time )
430
+ case SDL::Mixer.GetMusicType(nil)
431
+ when SDL::Mixer::MUS_OGG, SDL::Mixer::MUS_MP3
432
+
433
+ SDL::Mixer::RewindMusic() # Needed for MP3, and OK with OGG
434
+
435
+ result = SDL::Mixer.SetmusicPosition( time )
436
+
437
+ if( result < 0 )
438
+ raise( Rubygame::SDLError,
439
+ "Error jumping to time in music: #{SDL.GetError()}" )
440
+ end
441
+
442
+ when SDL::Mixer::MUS_NONE
443
+ raise Rubygame::SDLError, "Cannot jump when no music is playing."
444
+ else
445
+ raise Rubygame::SDLError, "Music type does not support jumping."
446
+ end
447
+ end
448
+
449
+
450
+ # Returns true if the music is currently playing.
451
+ #
452
+ def playing?
453
+ return SDL::Mixer::PlayingMusic()
454
+ end
455
+
456
+
457
+ # Returns true if the music is currently paused.
458
+ #
459
+ def paused?
460
+ return SDL::Mixer::PausedMusic()
461
+ end
462
+
463
+
464
+ # Returns the current volume level of the music.
465
+ # 0.0 is total silence, 1.0 is maximum volume.
466
+ #
467
+ def volume
468
+ return (SDL::Mixer::VolumeMusic(-1).to_f / SDL::Mixer::MAX_VOLUME)
469
+ end
470
+
471
+
472
+ # Sets the volume level of the music.
473
+ # 0.0 is total silence, 1.0 is maximum volume.
474
+ #
475
+ def volume=( new_volume )
476
+ SDL::Mixer.VolumeMusic( (volume * SDL::Mixer::MAX_VOLUME).to_i )
477
+ return new_volume
478
+ end
479
+
480
+
481
+ # Play the music, fading in and repeating a certain number of times.
482
+ # See also #play.
483
+ #
484
+ # Raises SDLError if something goes wrong.
485
+ #
486
+ # fade_time:: Time in seconds for the fade-in effect to complete.
487
+ # repeats:: Number of extra times to play through the music.
488
+ # -1 plays the music forever until it is stopped.
489
+ # Defaults to 0, play only once (no repeats).
490
+ # start:: Time to start from, in seconds since the beginning.
491
+ # Defaults to 0, the beginning of the song.
492
+ # Non-zero values only work for OGG and MP3; other
493
+ # music types will raise SDLError.
494
+ #
495
+ def fade_in( fade_time, repeats=0, start=0 )
496
+ fade_time *= 1000 # convert to milliseconds
497
+ repeats = (repeats or 0)
498
+ start = (start or 0)
499
+
500
+ # Adjust so repeats means the same as it does for Samples
501
+ repeats += 1 if repeats > -1
502
+
503
+ result =
504
+ if( start == 0 )
505
+ SDL::Mixer.FadeInMusic( @struct, repeats, fade_time )
506
+ else
507
+ SDL::Mixer.FadeInMusicPos( @struct, repeats, fade_time, start )
508
+ end
509
+
510
+ if( result < 0 )
511
+ raise Rubygame::SDLError, "Error fading in music: #{SDL.GetError()}"
512
+ end
513
+
514
+ return self
515
+ end
516
+
517
+
518
+ # Gradually fade the music to silence over +fade_length+ seconds.
519
+ # After the fade is complete, the music will be automatically stopped.
520
+ #
521
+ # Raises SDLError if something goes wrong.
522
+ #
523
+ # fade_time:: Time until the music is totally silent, in seconds.
524
+ #
525
+ def fade_out( fade_time )
526
+ fade_time *= 1000 # convert to milliseconds
527
+
528
+ result = SDL::Mixer.FadeOutMusic( fade_time )
529
+
530
+ if( result < 0 )
531
+ raise Rubygame::SDLError, "Error fading out music: #{SDL.GetError()}"
532
+ end
533
+ end
534
+
535
+
536
+ # True if the music is fading in or out (or either). You can
537
+ # specify +direction+ as :in/:out to check only fading in/out;
538
+ # otherwise, it will return true if it's fading either way.
539
+ #
540
+ # direction:: :in, :out, or nil if you don't care which.
541
+ # Returns:: true if the music is fading in the given direction.
542
+ #
543
+ def fading?( direction=nil )
544
+ case direction
545
+ when :in
546
+ return (SDL::Mixer.FadingMusic() == SDL::Mixer::FADING_IN)
547
+ when :out
548
+ return (SDL::Mixer.FadingMusic() == SDL::Mixer::FADING_OUT)
549
+ else
550
+ return (SDL::Mixer.FadingMusic() != SDL::Mixer::NO_FADING)
551
+ end
552
+ end
553
+ end
554
+
555
+