rubygame 2.5.3 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CREDITS +6 -4
- data/NEWS +79 -0
- data/README +55 -72
- data/ROADMAP +20 -13
- data/doc/custom_sdl_load_paths.rdoc +79 -0
- data/doc/getting_started.rdoc +65 -36
- data/doc/keyboard_symbols.rdoc +243 -0
- data/doc/macosx_install.rdoc +49 -35
- data/doc/windows_install.rdoc +36 -108
- data/lib/rubygame.rb +62 -24
- data/lib/rubygame/audio.rb +147 -0
- data/lib/rubygame/clock.rb +164 -1
- data/lib/rubygame/color.rb +40 -7
- data/lib/rubygame/color/models/hsl.rb +1 -1
- data/lib/rubygame/color/models/hsv.rb +1 -1
- data/lib/rubygame/color/models/rgb.rb +1 -1
- data/lib/rubygame/color/palettes/css.rb +1 -3
- data/lib/rubygame/color/palettes/x11.rb +1 -2
- data/lib/rubygame/constants.rb +297 -0
- data/lib/rubygame/deprecated_mixer.rb +555 -0
- data/lib/rubygame/event.rb +122 -6
- data/lib/rubygame/event_handler.rb +3 -1
- data/lib/rubygame/event_hook.rb +6 -2
- data/lib/rubygame/event_triggers.rb +1 -1
- data/lib/rubygame/events.rb +416 -1
- data/lib/rubygame/ftor.rb +1 -7
- data/lib/rubygame/gfx.rb +583 -0
- data/lib/rubygame/gl.rb +107 -0
- data/lib/rubygame/image.rb +140 -0
- data/lib/rubygame/joystick.rb +184 -0
- data/lib/rubygame/main.rb +82 -0
- data/lib/rubygame/mediabag.rb +1 -1
- data/lib/rubygame/mixer.rb +30 -0
- data/lib/rubygame/music.rb +493 -0
- data/lib/rubygame/queue.rb +3 -1
- data/lib/rubygame/rect.rb +9 -9
- data/lib/rubygame/screen.rb +357 -0
- data/lib/rubygame/shared.rb +40 -4
- data/lib/rubygame/sound.rb +428 -0
- data/lib/rubygame/surface.rb +626 -0
- data/lib/rubygame/ttf.rb +311 -0
- data/samples/FreeSans.ttf +0 -0
- data/samples/README +6 -5
- data/samples/demo_draw.rb +1 -1
- data/samples/demo_gl.rb +3 -1
- data/samples/demo_gl_tex.rb +4 -2
- data/samples/demo_rubygame.rb +114 -105
- data/samples/demo_sfont.rb +1 -1
- data/samples/demo_ttf.rb +3 -1
- data/samples/demo_utf8.rb +1 -1
- data/samples/image_viewer.rb +118 -0
- data/samples/load_and_blit.rb +1 -1
- data/samples/rubygame.png +0 -0
- metadata +34 -40
- data/Rakefile +0 -537
- data/doc/extended_readme.rdoc +0 -49
- data/ext/body/rubygame_body.so +0 -0
- data/ext/rubygame/rubygame_clock.c +0 -301
- data/ext/rubygame/rubygame_clock.h +0 -32
- data/ext/rubygame/rubygame_event.c +0 -760
- data/ext/rubygame/rubygame_event.h +0 -48
- data/ext/rubygame/rubygame_event2.c +0 -661
- data/ext/rubygame/rubygame_event2.h +0 -29
- data/ext/rubygame/rubygame_gfx.c +0 -942
- data/ext/rubygame/rubygame_gfx.h +0 -101
- data/ext/rubygame/rubygame_gl.c +0 -154
- data/ext/rubygame/rubygame_gl.h +0 -32
- data/ext/rubygame/rubygame_image.c +0 -252
- data/ext/rubygame/rubygame_image.h +0 -41
- data/ext/rubygame/rubygame_joystick.c +0 -336
- data/ext/rubygame/rubygame_joystick.h +0 -41
- data/ext/rubygame/rubygame_main.c +0 -158
- data/ext/rubygame/rubygame_main.h +0 -36
- data/ext/rubygame/rubygame_mixer.c +0 -1024
- data/ext/rubygame/rubygame_mixer.h +0 -36
- data/ext/rubygame/rubygame_music.c +0 -1017
- data/ext/rubygame/rubygame_music.h +0 -29
- data/ext/rubygame/rubygame_screen.c +0 -572
- data/ext/rubygame/rubygame_screen.h +0 -45
- data/ext/rubygame/rubygame_shared.c +0 -269
- data/ext/rubygame/rubygame_shared.h +0 -69
- data/ext/rubygame/rubygame_sound.c +0 -863
- data/ext/rubygame/rubygame_sound.h +0 -29
- data/ext/rubygame/rubygame_surface.c +0 -1153
- data/ext/rubygame/rubygame_surface.h +0 -62
- data/ext/rubygame/rubygame_ttf.c +0 -599
- data/ext/rubygame/rubygame_ttf.h +0 -69
- data/samples/keys.rb +0 -52
data/lib/rubygame/event.rb
CHANGED
@@ -19,12 +19,120 @@
|
|
19
19
|
|
20
20
|
module Rubygame
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
class << self
|
23
|
+
|
24
|
+
# Retrieves all pending events from SDL's event stack and converts them
|
25
|
+
# into Rubygame Event objects. Returns an Array of all the events, in
|
26
|
+
# the order they were read.
|
27
|
+
#
|
28
|
+
# This method is used by the EventQueue class, so don't call it if you are
|
29
|
+
# using EventQueue for event management! If you do, the EventQueue will not
|
30
|
+
# receive all the events, because they will have been removed from SDL's
|
31
|
+
# event stack by this method.
|
32
|
+
#
|
33
|
+
# However, if you aren't using EventQueue, you can safely use this method
|
34
|
+
# to make your own event management system.
|
35
|
+
#
|
36
|
+
def fetch_sdl_events
|
37
|
+
deprecated("Rubygame.fetch_sdl_events", "3.0")
|
38
|
+
events = []
|
39
|
+
until( ( event = SDL::PollEvent() ).nil? )
|
40
|
+
events << _convert_sdlevent(event)
|
41
|
+
end
|
42
|
+
return events
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
|
49
|
+
def _convert_active( state ) # :nodoc:
|
50
|
+
states = []
|
51
|
+
states << "mouse" if (state & SDL::APPMOUSEFOCUS)
|
52
|
+
states << "keyboard" if (state & SDL::APPINPUTFOCUS)
|
53
|
+
states << "active" if (state & SDL::APPACTIVE)
|
54
|
+
return states
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def _convert_keymod( mods ) # :nodoc:
|
59
|
+
array = []
|
60
|
+
array << SDL::K_LSHIFT if( mods & SDL::KMOD_LSHIFT )
|
61
|
+
array << SDL::K_RSHIFT if( mods & SDL::KMOD_RSHIFT )
|
62
|
+
array << SDL::K_LCTRL if( mods & SDL::KMOD_LCTRL )
|
63
|
+
array << SDL::K_RCTRL if( mods & SDL::KMOD_RCTRL )
|
64
|
+
array << SDL::K_LALT if( mods & SDL::KMOD_LALT )
|
65
|
+
array << SDL::K_RALT if( mods & SDL::KMOD_RALT )
|
66
|
+
array << SDL::K_LMETA if( mods & SDL::KMOD_LMETA )
|
67
|
+
array << SDL::K_RMETA if( mods & SDL::KMOD_RMETA )
|
68
|
+
array << SDL::K_NUMLOCK if( mods & SDL::KMOD_NUM )
|
69
|
+
array << SDL::K_CAPSLOCK if( mods & SDL::KMOD_CAPS )
|
70
|
+
array << SDL::K_MODE if( mods & SDL::KMOD_MODE )
|
71
|
+
return array
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
def _convert_mousebuttons( state ) # :nodoc:
|
76
|
+
states = []
|
77
|
+
states << SDL::BUTTON_LEFT if (state & SDL::BUTTON_LMASK)
|
78
|
+
states << SDL::BUTTON_MIDDLE if (state & SDL::BUTTON_MMASK)
|
79
|
+
states << SDL::BUTTON_RIGHT if (state & SDL::BUTTON_RMASK)
|
80
|
+
return states
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def _convert_sdlevent( ev ) # :nodoc:
|
85
|
+
case ev.type
|
86
|
+
|
87
|
+
when SDL::ACTIVEEVENT
|
88
|
+
return ActiveEvent.new( (ev.gain == 1), _convert_active(ev.state) )
|
89
|
+
|
90
|
+
when SDL::VIDEOEXPOSE
|
91
|
+
return ExposeEvent.new()
|
92
|
+
|
93
|
+
when SDL::JOYAXISMOTION
|
94
|
+
return JoyAxisEvent.new( ev.which, ev.axis, ev.value )
|
95
|
+
|
96
|
+
when SDL::JOYBALLMOTION
|
97
|
+
return JoyBallEvent.new( ev.which, ev.ball, [ev.xrel, ev.yrel] )
|
98
|
+
|
99
|
+
when SDL::JOYBUTTONDOWN
|
100
|
+
return JoyDownEvent.new( ev.which, ev.button )
|
101
|
+
|
102
|
+
when SDL::JOYBUTTONUP
|
103
|
+
return JoyUpEvent.new( ev.which, ev.button )
|
104
|
+
|
105
|
+
when SDL::JOYHATMOTION
|
106
|
+
return JoyHatEvent.new( ev.which, ev.hat, ev.value )
|
107
|
+
|
108
|
+
when SDL::KEYDOWN
|
109
|
+
return KeyDownEvent.new(ev.keysym.sym, _convert_keymod(ev.keysym.mod))
|
110
|
+
|
111
|
+
when SDL::KEYUP
|
112
|
+
return KeyUpEvent.new(ev.keysym.sym, _convert_keymod(ev.keysym.mod))
|
113
|
+
|
114
|
+
when SDL::MOUSEBUTTONDOWN
|
115
|
+
return MouseDownEvent.new( [ev.x, ev.y], ev.button )
|
116
|
+
|
117
|
+
when SDL::MOUSEBUTTONUP
|
118
|
+
return MouseUpEvent.new( [ev.x, ev.y], ev.button )
|
119
|
+
|
120
|
+
when SDL::MOUSEMOTION
|
121
|
+
return MouseMotionEvent.new( [ev.x, ev.y], [ev.xrel, ev.yrel],
|
122
|
+
_convert_mousebuttons(ev.state) )
|
123
|
+
|
124
|
+
when SDL::VIDEORESIZE
|
125
|
+
return ResizeEvent.new( [ev.w, ev.h] )
|
126
|
+
|
127
|
+
when SDL::QUIT
|
128
|
+
return QuitEvent.new()
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
|
28
136
|
# Converts a keyboard symbol (keysym) into a human-readable text string.
|
29
137
|
# If either Shift key was being pressed, alphanumeric or punctuation keys
|
30
138
|
# will be made uppercase or alternate, based on U.S. keyboard layout.
|
@@ -310,4 +418,12 @@ module Rubygame
|
|
310
418
|
# pressed the close button.)
|
311
419
|
class QuitEvent < Event
|
312
420
|
end
|
421
|
+
|
422
|
+
|
423
|
+
# List of all Rubygame hardware event classes. *Do not modify!*
|
424
|
+
SDL_EVENTS = [ActiveEvent, KeyDownEvent, KeyUpEvent,\
|
425
|
+
MouseMotionEvent,MouseDownEvent,MouseUpEvent,JoyAxisEvent,\
|
426
|
+
JoyBallEvent, JoyHatEvent,JoyDownEvent, JoyUpEvent,\
|
427
|
+
ResizeEvent, QuitEvent]
|
428
|
+
|
313
429
|
end # module Rubygame
|
data/lib/rubygame/event_hook.rb
CHANGED
@@ -17,8 +17,12 @@
|
|
17
17
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
18
18
|
#++
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
|
21
|
+
|
22
|
+
%w{ event_triggers event_actions }.each do |f|
|
23
|
+
require( File.join( File.dirname(__FILE__), f ) )
|
24
|
+
end
|
25
|
+
|
22
26
|
|
23
27
|
module Rubygame
|
24
28
|
|
data/lib/rubygame/events.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# This file is one part of:
|
3
3
|
# Rubygame -- Ruby code and bindings to SDL to facilitate game creation
|
4
4
|
#
|
5
|
-
# Copyright (C) 2008 John Croisant
|
5
|
+
# Copyright (C) 2008-2009 John Croisant
|
6
6
|
#
|
7
7
|
# This library is free software; you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -22,6 +22,68 @@
|
|
22
22
|
|
23
23
|
module Rubygame
|
24
24
|
|
25
|
+
|
26
|
+
# Enable key repeat, so that additional keyboard release and press
|
27
|
+
# events are automatically generated for as long as the key is held
|
28
|
+
# down. See also #disable_key_repeat.
|
29
|
+
#
|
30
|
+
# delay:: how many seconds to wait before starting to repeat.
|
31
|
+
# Default is 0.5 seconds. (Numeric or :default, optional)
|
32
|
+
#
|
33
|
+
# interval:: how many seconds to wait in between repetitions after
|
34
|
+
# the first one. Default is 0.03 seconds.
|
35
|
+
# (Numeric or :default, optional)
|
36
|
+
#
|
37
|
+
def self.enable_key_repeat( delay=:default, interval=:default )
|
38
|
+
|
39
|
+
delay = if delay == :default
|
40
|
+
SDL::DEFAULT_REPEAT_DELAY
|
41
|
+
else
|
42
|
+
delay.to_f
|
43
|
+
end
|
44
|
+
|
45
|
+
interval = if interval == :default
|
46
|
+
SDL::DEFAULT_REPEAT_INTERVAL
|
47
|
+
else
|
48
|
+
interval.to_f
|
49
|
+
end
|
50
|
+
|
51
|
+
if delay < 0.001
|
52
|
+
raise( ArgumentError,
|
53
|
+
"delay must be at least 0.001 sec (got #{delay})" )
|
54
|
+
end
|
55
|
+
|
56
|
+
if interval < 0.001
|
57
|
+
raise( ArgumentError,
|
58
|
+
"interval must be at least 0.001 sec (got #{interval})" )
|
59
|
+
end
|
60
|
+
|
61
|
+
result = SDL.EnableKeyRepeat( (delay * 1000).to_i, (interval * 1000).to_i )
|
62
|
+
|
63
|
+
if result != 0
|
64
|
+
raise( Rubygame::SDLError,
|
65
|
+
"Could not enable key repeat: #{SDL.GetError()}" )
|
66
|
+
end
|
67
|
+
|
68
|
+
return nil
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
# Disable key repeat, undoing the effect of #enable_key_repeat.
|
73
|
+
#
|
74
|
+
def self.disable_key_repeat
|
75
|
+
result = SDL.EnableKeyRepeat( 0, 0 )
|
76
|
+
|
77
|
+
if result != 0
|
78
|
+
raise( Rubygame::SDLError,
|
79
|
+
"Could not disable key repeat: #{SDL.GetError()}" )
|
80
|
+
end
|
81
|
+
|
82
|
+
return nil
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
|
25
87
|
# The Events module contains classes representing various
|
26
88
|
# hardware events (e.g. keyboard presses, mouse clicks)
|
27
89
|
# and software events (e.g. clock tick, window becomes active)
|
@@ -32,6 +94,359 @@ module Rubygame
|
|
32
94
|
# deprecated and should not be used anymore.
|
33
95
|
#
|
34
96
|
module Events
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
# NOTE: This method converts the SDL events into the new-style event
|
101
|
+
# classes, located in the Rubygame::Events module. For converting to
|
102
|
+
# the older (deprecated) events, see Rubygame.fetch_sdl_events.
|
103
|
+
#
|
104
|
+
# Retrieves all pending events from SDL's event stack and converts them
|
105
|
+
# into Rubygame event objects. Returns an Array of all the events, in
|
106
|
+
# the order they were read.
|
107
|
+
#
|
108
|
+
# This method is used by the EventQueue class (among others), so
|
109
|
+
# don't call it if you are using any of Rubygame's event management
|
110
|
+
# classes (e.g. EventQueue)! If you do, they will not receive all
|
111
|
+
# the events, because some events will have been removed from SDL's
|
112
|
+
# event stack by this method.
|
113
|
+
#
|
114
|
+
# However, if you aren't using EventQueue, you can safely use this
|
115
|
+
# method to make your own event management system.
|
116
|
+
#
|
117
|
+
def self.fetch_sdl_events
|
118
|
+
events = []
|
119
|
+
until( ( event = SDL::PollEvent() ).nil? )
|
120
|
+
case ( event = _convert_sdlevent(event) )
|
121
|
+
when Array; events += event
|
122
|
+
else; events << event
|
123
|
+
end
|
124
|
+
end
|
125
|
+
return events
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
|
133
|
+
# Convert SDL's ACTIVEEVENT into zero or more of:
|
134
|
+
#
|
135
|
+
# InputFocusGained or InputFocusLost
|
136
|
+
# MouseFocusGained or MouseFocusLost
|
137
|
+
# WindowUnminimized or WindowMinimized
|
138
|
+
#
|
139
|
+
# Returns a ruby Array of the events it generated.
|
140
|
+
#
|
141
|
+
def self._convert_activeevent( ev )
|
142
|
+
|
143
|
+
state = ev.state
|
144
|
+
gain = ev.gain
|
145
|
+
|
146
|
+
# any_state = SDL::APPACTIVE | SDL::APPINPUTFOCUS | SDL::APPMOUSEFOCUS
|
147
|
+
# if( state & any_state == 0 )
|
148
|
+
# raise( Rubygame::SDLError, "Unknown ACTIVEEVENT state #{state}. "+
|
149
|
+
# "This is a bug in Rubygame." )
|
150
|
+
# end
|
151
|
+
|
152
|
+
events = []
|
153
|
+
|
154
|
+
if( SDL::APPACTIVE & state )
|
155
|
+
if( gain == 1 )
|
156
|
+
events << WindowUnminimized.new
|
157
|
+
else
|
158
|
+
events << WindowMinimized.new
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
if( SDL::APPINPUTFOCUS & state )
|
163
|
+
if( gain == 1 )
|
164
|
+
events << InputFocusGained.new
|
165
|
+
else
|
166
|
+
events << InputFocusLost.new
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
if( SDL::APPMOUSEFOCUS & state )
|
171
|
+
if( gain == 1 )
|
172
|
+
events << MouseFocusGained.new
|
173
|
+
else
|
174
|
+
events << MouseFocusLost.new
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
return events
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
# Convert SDL's joystick axis events into JoystickAxisMoved.
|
185
|
+
#
|
186
|
+
def self._convert_joyaxisevent( ev )
|
187
|
+
joy_id = ev.which
|
188
|
+
axis = ev.axis
|
189
|
+
value = ev.value
|
190
|
+
|
191
|
+
# Convert value to the -1.0 .. 1.0 range
|
192
|
+
value = if( value > 0 )
|
193
|
+
value / 32767.0
|
194
|
+
else
|
195
|
+
value / 32768.0
|
196
|
+
end
|
197
|
+
|
198
|
+
return JoystickAxisMoved.new( joy_id, axis, value )
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
# Convert SDL's joystick ball events into JoystickBallMoved.
|
204
|
+
#
|
205
|
+
def self._convert_joyballevent( ev )
|
206
|
+
return JoystickBallMoved.new( ev.which, ev.ball, [ev.xrel, ev.xrel] )
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
# Convert SDL's joystick button events into JoystickButtonPressed or
|
212
|
+
# JoystickButtonReleased.
|
213
|
+
#
|
214
|
+
def self._convert_joybuttonevent( ev )
|
215
|
+
case ev.state
|
216
|
+
when SDL::PRESSED
|
217
|
+
JoystickButtonPressed.new( ev.which, ev.button )
|
218
|
+
when SDL::RELEASED
|
219
|
+
JoystickButtonReleased.new( ev.which, ev.button )
|
220
|
+
else
|
221
|
+
raise( Rubygame::SDLError, "Unknown joystick button state "+
|
222
|
+
"#{ev.jbutton.state}. This is a bug in Rubygame." )
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
|
227
|
+
|
228
|
+
# Convert SDL's joystick hat events into JoystickHatMoved.
|
229
|
+
#
|
230
|
+
def self._convert_joyhatevent( ev )
|
231
|
+
dir = case ev.value
|
232
|
+
when SDL::HAT_RIGHTUP; :up_right
|
233
|
+
when SDL::HAT_RIGHTDOWN; :down_right
|
234
|
+
when SDL::HAT_LEFTUP; :up_left
|
235
|
+
when SDL::HAT_LEFTDOWN; :down_left
|
236
|
+
when SDL::HAT_UP; :up
|
237
|
+
when SDL::HAT_RIGHT; :right
|
238
|
+
when SDL::HAT_DOWN; :down
|
239
|
+
when SDL::HAT_LEFT; :left
|
240
|
+
else; nil
|
241
|
+
end
|
242
|
+
|
243
|
+
return JoystickHatMoved.new( ev.which, ev.hat, dir )
|
244
|
+
end
|
245
|
+
|
246
|
+
|
247
|
+
|
248
|
+
# Returns a sanitized symbol for the given key.
|
249
|
+
#
|
250
|
+
def self._convert_key_symbol( key )
|
251
|
+
Rubygame.init_video_system
|
252
|
+
|
253
|
+
name = case key
|
254
|
+
when SDL::K_1; "number 1"
|
255
|
+
when SDL::K_2; "number 2"
|
256
|
+
when SDL::K_3; "number 3"
|
257
|
+
when SDL::K_4; "number 4"
|
258
|
+
when SDL::K_5; "number 5"
|
259
|
+
when SDL::K_6; "number 6"
|
260
|
+
when SDL::K_7; "number 7"
|
261
|
+
when SDL::K_8; "number 8"
|
262
|
+
when SDL::K_9; "number 9"
|
263
|
+
when SDL::K_0; "number 0"
|
264
|
+
when SDL::K_EXCLAIM; "exclamation mark"
|
265
|
+
when SDL::K_QUOTEDBL; "double quote"
|
266
|
+
when SDL::K_HASH; "hash"
|
267
|
+
when SDL::K_DOLLAR; "dollar"
|
268
|
+
when SDL::K_AMPERSAND; "ampersand"
|
269
|
+
when SDL::K_QUOTE; "quote"
|
270
|
+
when SDL::K_LEFTPAREN; "left parenthesis"
|
271
|
+
when SDL::K_RIGHTPAREN; "right parenthesis"
|
272
|
+
when SDL::K_ASTERISK; "asterisk"
|
273
|
+
when SDL::K_PLUS; "plus"
|
274
|
+
when SDL::K_MINUS; "minus"
|
275
|
+
when SDL::K_PERIOD; "period"
|
276
|
+
when SDL::K_COMMA; "comma"
|
277
|
+
when SDL::K_SLASH; "slash"
|
278
|
+
when SDL::K_SEMICOLON; "semicolon"
|
279
|
+
when SDL::K_LESS; "less than"
|
280
|
+
when SDL::K_EQUALS; "equals"
|
281
|
+
when SDL::K_GREATER; "greater than"
|
282
|
+
when SDL::K_QUESTION; "question mark"
|
283
|
+
when SDL::K_AT; "at"
|
284
|
+
when SDL::K_LEFTBRACKET; "left bracket"
|
285
|
+
when SDL::K_BACKSLASH; "backslash"
|
286
|
+
when SDL::K_RIGHTBRACKET; "right bracket"
|
287
|
+
when SDL::K_CARET; "caret"
|
288
|
+
when SDL::K_UNDERSCORE; "underscore"
|
289
|
+
when SDL::K_BACKQUOTE; "backquote"
|
290
|
+
when SDL::K_KP1; "keypad 1"
|
291
|
+
when SDL::K_KP2; "keypad 2"
|
292
|
+
when SDL::K_KP3; "keypad 3"
|
293
|
+
when SDL::K_KP4; "keypad 4"
|
294
|
+
when SDL::K_KP5; "keypad 5"
|
295
|
+
when SDL::K_KP6; "keypad 6"
|
296
|
+
when SDL::K_KP7; "keypad 7"
|
297
|
+
when SDL::K_KP8; "keypad 8"
|
298
|
+
when SDL::K_KP9; "keypad 9"
|
299
|
+
when SDL::K_KP0; "keypad 0"
|
300
|
+
when SDL::K_KP_PERIOD; "keypad period"
|
301
|
+
when SDL::K_KP_DIVIDE; "keypad divide"
|
302
|
+
when SDL::K_KP_MULTIPLY; "keypad multiply"
|
303
|
+
when SDL::K_KP_MINUS; "keypad minus"
|
304
|
+
when SDL::K_KP_PLUS; "keypad plus"
|
305
|
+
when SDL::K_KP_EQUALS; "keypad equals"
|
306
|
+
when SDL::K_KP_ENTER; "keypad enter"
|
307
|
+
else; SDL::GetKeyName( key )
|
308
|
+
end
|
309
|
+
|
310
|
+
name.downcase!
|
311
|
+
name.gsub!(/[- ]/, "_")
|
312
|
+
return name.to_sym
|
313
|
+
end
|
314
|
+
|
315
|
+
|
316
|
+
|
317
|
+
# Convert an OR'd list of KMODs into an Array of symbols.
|
318
|
+
#
|
319
|
+
def self._convert_keymods( mods )
|
320
|
+
return [] if mods == 0
|
321
|
+
|
322
|
+
array = []
|
323
|
+
array << :left_shift if( mods & SDL::KMOD_LSHIFT )
|
324
|
+
array << :right_shift if( mods & SDL::KMOD_RSHIFT )
|
325
|
+
array << :left_ctrl if( mods & SDL::KMOD_LCTRL )
|
326
|
+
array << :right_ctrl if( mods & SDL::KMOD_RCTRL )
|
327
|
+
array << :left_alt if( mods & SDL::KMOD_LALT )
|
328
|
+
array << :right_alt if( mods & SDL::KMOD_RALT )
|
329
|
+
array << :left_meta if( mods & SDL::KMOD_LMETA )
|
330
|
+
array << :right_meta if( mods & SDL::KMOD_RMETA )
|
331
|
+
array << :numlock if( mods & SDL::KMOD_NUM )
|
332
|
+
array << :capslock if( mods & SDL::KMOD_CAPS )
|
333
|
+
array << :mode if( mods & SDL::KMOD_MODE )
|
334
|
+
|
335
|
+
return array
|
336
|
+
end
|
337
|
+
|
338
|
+
|
339
|
+
|
340
|
+
# Convert a Unicode char into a UTF8 ruby byte-string.
|
341
|
+
#
|
342
|
+
def self._convert_unicode( int )
|
343
|
+
if( int > 0 )
|
344
|
+
[int].pack('U')
|
345
|
+
else
|
346
|
+
""
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
|
351
|
+
|
352
|
+
# Convert SDL's keyboard events into KeyPressed / KeyReleased.
|
353
|
+
#
|
354
|
+
def self._convert_keyboardevent( ev )
|
355
|
+
key = _convert_key_symbol( ev.keysym.sym );
|
356
|
+
mods = _convert_keymods( ev.keysym.mod );
|
357
|
+
|
358
|
+
case ev.state
|
359
|
+
when SDL::PRESSED
|
360
|
+
unicode = _convert_unicode( ev.keysym.unicode )
|
361
|
+
KeyPressed.new( key, mods, unicode )
|
362
|
+
when SDL::RELEASED
|
363
|
+
KeyReleased.new( key, mods )
|
364
|
+
else
|
365
|
+
raise( Rubygame::SDLError, "Unknown keyboard event state "+
|
366
|
+
"#{ev.key.state}. This is a bug in Rubygame." )
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
|
371
|
+
|
372
|
+
# Convert SDL's mouse click events into MousePressed / MouseReleased.
|
373
|
+
#
|
374
|
+
def self._convert_mouseclickevent( ev )
|
375
|
+
button = case ev.button
|
376
|
+
when SDL::BUTTON_LEFT; :mouse_left
|
377
|
+
when SDL::BUTTON_MIDDLE; :mouse_middle
|
378
|
+
when SDL::BUTTON_RIGHT; :mouse_right
|
379
|
+
when SDL::BUTTON_WHEELUP; :mouse_wheel_up
|
380
|
+
when SDL::BUTTON_WHEELDOWN; :mouse_wheel_down
|
381
|
+
else; ("mouse_%d"%button).to_sym
|
382
|
+
end
|
383
|
+
|
384
|
+
pos = [ev.x, ev.y]
|
385
|
+
|
386
|
+
case ev.state
|
387
|
+
when SDL::PRESSED
|
388
|
+
MousePressed.new( pos, button )
|
389
|
+
when SDL::RELEASED
|
390
|
+
MouseReleased.new( pos, button )
|
391
|
+
else
|
392
|
+
raise( Rubygame::SDLError, "Unknown mouse event state "+
|
393
|
+
"#{ev.button.state}. This is a bug in Rubygame." )
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
|
398
|
+
|
399
|
+
# Convert SDL's mouse motion events into MouseMoved
|
400
|
+
#
|
401
|
+
def self._convert_mousemotionevent( ev )
|
402
|
+
mods = ev.state
|
403
|
+
|
404
|
+
btns = []
|
405
|
+
btns << :mouse_left if( mods & SDL::BUTTON_LMASK )
|
406
|
+
btns << :mouse_middle if( mods & SDL::BUTTON_MMASK )
|
407
|
+
btns << :mouse_right if( mods & SDL::BUTTON_RMASK )
|
408
|
+
btns << :mouse_wheel_up if( mods & (1<<(SDL::BUTTON_WHEELUP - 1)) )
|
409
|
+
btns << :mouse_wheel_down if( mods & (1<<(SDL::BUTTON_WHEELDOWN - 1)) )
|
410
|
+
|
411
|
+
pos = [ev.x, ev.y]
|
412
|
+
rel = [ev.xrel, ev.yrel]
|
413
|
+
|
414
|
+
return MouseMoved.new( pos, rel, btns )
|
415
|
+
end
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
# Converts an SDL_Event (C type) into a Rubygame event of the
|
420
|
+
# corresponding class.
|
421
|
+
#
|
422
|
+
def self._convert_sdlevent( ev )
|
423
|
+
case ev
|
424
|
+
when SDL::ActiveEvent
|
425
|
+
return _convert_activeevent(ev)
|
426
|
+
when SDL::ExposeEvent
|
427
|
+
return WindowExposed.new()
|
428
|
+
when SDL::JoyAxisEvent
|
429
|
+
return _convert_joyaxisevent(ev)
|
430
|
+
when SDL::JoyBallEvent
|
431
|
+
return _convert_joyballevent(ev)
|
432
|
+
when SDL::JoyButtonEvent
|
433
|
+
return _convert_joybuttonevent(ev)
|
434
|
+
when SDL::JoyHatEvent
|
435
|
+
return _convert_joyhatevent(ev)
|
436
|
+
when SDL::KeyboardEvent
|
437
|
+
return _convert_keyboardevent(ev)
|
438
|
+
when SDL::MouseButtonEvent
|
439
|
+
return _convert_mouseclickevent(ev)
|
440
|
+
when SDL::MouseMotionEvent
|
441
|
+
return _convert_mousemotionevent(ev)
|
442
|
+
when SDL::ResizeEvent
|
443
|
+
return WindowResized.new( [ev.w, ev.h] )
|
444
|
+
when SDL::QuitEvent
|
445
|
+
return QuitRequested.new()
|
446
|
+
end
|
447
|
+
end
|
448
|
+
|
449
|
+
|
35
450
|
end
|
36
451
|
|
37
452
|
end
|