gamebox 0.2.1 → 0.3.2

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 (95) hide show
  1. data/Gemfile +1 -8
  2. data/Rakefile +13 -37
  3. data/TODO.txt +27 -27
  4. data/docs/getting_started.rdoc +2 -2
  5. data/gamebox.gemspec +33 -191
  6. data/lib/gamebox.rb +18 -14
  7. data/lib/gamebox/actor.rb +37 -27
  8. data/lib/gamebox/actor_factory.rb +4 -5
  9. data/lib/gamebox/actor_view.rb +8 -0
  10. data/lib/gamebox/actors/collidable_debugger.rb +2 -2
  11. data/lib/gamebox/actors/curtain.rb +3 -3
  12. data/lib/gamebox/actors/emitter.rb +51 -0
  13. data/lib/gamebox/actors/label.rb +27 -7
  14. data/lib/gamebox/actors/logo.rb +1 -1
  15. data/lib/gamebox/actors/spatial_debugger.rb +25 -10
  16. data/lib/gamebox/arbiter.rb +61 -34
  17. data/lib/gamebox/behavior.rb +3 -3
  18. data/lib/gamebox/behaviors/animated.rb +1 -1
  19. data/lib/gamebox/behaviors/audible.rb +1 -1
  20. data/lib/gamebox/behaviors/collidable.rb +9 -4
  21. data/lib/gamebox/behaviors/collidable/aabb_collidable.rb +26 -1
  22. data/lib/gamebox/behaviors/collidable/circle_collidable.rb +3 -3
  23. data/lib/gamebox/behaviors/collidable/polygon_collidable.rb +1 -1
  24. data/lib/gamebox/behaviors/graphical.rb +30 -4
  25. data/lib/gamebox/behaviors/layered.rb +1 -1
  26. data/lib/gamebox/behaviors/physical.rb +113 -30
  27. data/lib/gamebox/behaviors/timed.rb +33 -0
  28. data/lib/gamebox/behaviors/updatable.rb +1 -1
  29. data/lib/gamebox/class_finder.rb +1 -21
  30. data/lib/gamebox/console_app.rb +33 -31
  31. data/lib/gamebox/constants.rb +481 -0
  32. data/lib/gamebox/data/config/objects.yml +7 -0
  33. data/lib/gamebox/gamebox_application.rb +10 -33
  34. data/lib/gamebox/gamebox_generator.rb +32 -32
  35. data/lib/gamebox/input_manager.rb +73 -32
  36. data/lib/gamebox/lib/inflector.rb +1 -1
  37. data/lib/gamebox/lib/range_ext.rb +5 -0
  38. data/lib/gamebox/lib/rect.rb +548 -548
  39. data/lib/gamebox/lib/sorted_list.rb +1 -1
  40. data/lib/gamebox/lib/symbol_ext.rb +8 -0
  41. data/lib/gamebox/physical_director.rb +1 -1
  42. data/lib/gamebox/physical_stage.rb +3 -3
  43. data/lib/gamebox/physics.rb +0 -3
  44. data/lib/gamebox/resource_manager.rb +22 -17
  45. data/lib/gamebox/sound_manager.rb +3 -2
  46. data/lib/gamebox/spatial_hash.rb +60 -31
  47. data/lib/gamebox/spatial_stagehand.rb +30 -6
  48. data/lib/gamebox/spec/helper.rb +7 -7
  49. data/lib/gamebox/stage.rb +18 -19
  50. data/lib/gamebox/stage_manager.rb +33 -23
  51. data/lib/gamebox/stagehand.rb +3 -0
  52. data/lib/gamebox/svg_document.rb +1 -1
  53. data/lib/gamebox/tasks/gamebox_tasks.rake +133 -0
  54. data/lib/gamebox/templates/actor.erb +0 -2
  55. data/lib/gamebox/templates/actor_view.erb +1 -3
  56. data/lib/gamebox/templates/template_app/Gemfile +3 -2
  57. data/lib/gamebox/templates/template_app/Rakefile +3 -8
  58. data/lib/gamebox/templates/template_app/config/environment.rb +7 -39
  59. data/lib/gamebox/templates/template_app/src/demo_stage.rb +1 -2
  60. data/lib/gamebox/templates/template_app/src/my_actor.rb +0 -3
  61. data/lib/gamebox/version.rb +2 -2
  62. data/lib/gamebox/viewport.rb +44 -8
  63. data/lib/gamebox/views/graphical_actor_view.rb +22 -16
  64. data/lib/gamebox/wrapped_screen.rb +9 -1
  65. data/script/perf_spatial_hash.rb +49 -58
  66. data/script/perf_struct_vs_array.rb +32 -0
  67. data/spec/actor_factory_spec.rb +61 -0
  68. data/spec/actor_spec.rb +24 -18
  69. data/spec/actor_view_spec.rb +51 -6
  70. data/spec/animated_spec.rb +27 -6
  71. data/spec/arbiter_spec.rb +12 -24
  72. data/spec/backstage_spec.rb +1 -1
  73. data/spec/behavior_spec.rb +3 -3
  74. data/spec/class_finder_spec.rb +13 -0
  75. data/spec/collidable_spec.rb +30 -10
  76. data/spec/emitter_spec.rb +20 -0
  77. data/spec/helper.rb +5 -21
  78. data/spec/input_manager_spec.rb +134 -0
  79. data/spec/label_spec.rb +0 -1
  80. data/spec/physical_spec.rb +114 -5
  81. data/spec/resource_manager_spec.rb +1 -2
  82. data/spec/spatial_hash_spec.rb +23 -7
  83. data/spec/spatial_stagehand_spec.rb +97 -0
  84. data/spec/stage_manager_spec.rb +0 -1
  85. data/spec/stage_spec.rb +2 -2
  86. data/spec/viewport_spec.rb +92 -48
  87. metadata +223 -119
  88. data/.gitignore +0 -11
  89. data/History.txt +0 -80
  90. data/VERSION +0 -1
  91. data/lib/gamebox/event_compat.rb +0 -285
  92. data/lib/gamebox/lib/diy.rb +0 -371
  93. data/lib/gamebox/lib/numbers_ext.rb +0 -3
  94. data/lib/gamebox/tasks/gamebox_tasks.rb +0 -61
  95. data/load_paths.rb +0 -20
@@ -1,4 +1,4 @@
1
- require 'collidable/collidable_shape'
1
+
2
2
 
3
3
  class CircleCollidable < CollidableShape
4
4
 
@@ -7,11 +7,11 @@ class CircleCollidable < CollidableShape
7
7
  end
8
8
 
9
9
  def center_x
10
- actor_x + radius
10
+ actor_x
11
11
  end
12
12
 
13
13
  def center_y
14
- actor_y + radius
14
+ actor_y
15
15
  end
16
16
 
17
17
  end
@@ -1,4 +1,4 @@
1
- require 'collidable/collidable_shape'
1
+
2
2
 
3
3
  class PolygonCollidable < CollidableShape
4
4
  attr_accessor :cw_local_points
@@ -1,10 +1,10 @@
1
- require 'behavior'
1
+
2
2
  # keeps track of an image for you based on the actor's class
3
3
  # by default it expects images to be:
4
4
  # data/graphics/classname.png
5
5
  class Graphical < Behavior
6
6
 
7
- attr_accessor :image, :num_x_tiles, :num_y_tiles
7
+ attr_accessor :image, :num_x_tiles, :num_y_tiles, :rotation
8
8
  def setup
9
9
 
10
10
  @image = @actor.resource_manager.load_actor_image @actor
@@ -13,9 +13,10 @@ class Graphical < Behavior
13
13
  @num_y_tiles = @opts[:num_y_tiles]
14
14
  @num_x_tiles ||= 1
15
15
  @num_y_tiles ||= 1
16
+ @rotation = 0.0
16
17
 
17
- graphical_obj = self
18
- relegates :image, :graphical, :width, :height
18
+ relegates :image, :graphical, :width, :height, :rotation, :rotation=,
19
+ :scale, :scale=, :x_scale, :y_scale, :x_scale=, :y_scale=
19
20
  end
20
21
 
21
22
  def graphical
@@ -34,4 +35,29 @@ class Graphical < Behavior
34
35
  @tiled
35
36
  end
36
37
 
38
+ def scale
39
+ @scale || 1
40
+ end
41
+
42
+ def scale=(s)
43
+ @scale = s
44
+ end
45
+
46
+ def x_scale
47
+ @x_scale || scale
48
+ end
49
+
50
+ def x_scale=(xs)
51
+ @x_scale = xs
52
+ end
53
+
54
+
55
+ def y_scale
56
+ @y_scale || scale
57
+ end
58
+
59
+ def y_scale=(ys)
60
+ @y_scale = ys
61
+ end
62
+
37
63
  end
@@ -1,4 +1,4 @@
1
- require 'behavior'
1
+
2
2
  # Keeps track of the layer that something is to be drawn on.
3
3
  # By default it sets everything to layer 0 and parallax layer of
4
4
  # 1.
@@ -1,8 +1,3 @@
1
- require 'physics'
2
- require 'behavior'
3
- require 'inflector'
4
- require 'publisher'
5
-
6
1
  # Physical behavior will place your Actor in a physical world.
7
2
  # example:
8
3
  # :physical => {
@@ -29,6 +24,7 @@ class Physical < Behavior
29
24
  def setup
30
25
  @parts = {}
31
26
  @shapes = []
27
+ @constraints = []
32
28
  @segments_groups = []
33
29
 
34
30
  @moment_of_inertia = @opts[:moment]
@@ -41,11 +37,16 @@ class Physical < Behavior
41
37
 
42
38
  build_secondary_shapes
43
39
 
40
+
44
41
  register
42
+ warp(vec2(@actor.x,@actor.y))
45
43
 
46
44
  # write code here to keep physics and x,y of actor in sync
47
45
  relegates :x, :y, :x=, :y=, :shape, :body, :parts,
48
- :rotation, :warp, :segment_groups, :physical
46
+ :rotation, :warp, :segment_groups, :physical,
47
+ :pivot, :pin, :spring, :slide, :groove,
48
+ :rotary_spring, :rotary_limit, :ratchet,
49
+ :gear, :motor
49
50
  end
50
51
 
51
52
  def setup_friction
@@ -101,6 +102,8 @@ class Physical < Behavior
101
102
  end
102
103
 
103
104
  @shapes << @shape
105
+
106
+ @body.p = vec2(actor.x,actor.y)
104
107
  end
105
108
 
106
109
  def build_secondary_shapes
@@ -108,22 +111,37 @@ class Physical < Behavior
108
111
  if @opts[:shapes]
109
112
  for obj in @opts[:shapes]
110
113
  for part_name, part_def in obj
111
- # add another shape here
112
- part_shape_array = part_def[:verts].collect{|v| vec2(v[0],v[1])}
113
- part_shape = CP::Shape::Poly.new(@body, part_shape_array, part_def[:offset])
114
+ # TODO merge this with build main shape
115
+ part_shape = nil
116
+ case part_def[:shape]
117
+ when :poly
118
+ part_shape_array = part_def[:verts].collect{|v| vec2(v[0],v[1])}
119
+ part_shape = CP::Shape::Poly.new(@body, part_shape_array, part_def[:offset])
120
+ part_shape.collision_type = part_name.to_sym
121
+
122
+ # TODO pass all physics params to parts (ie u and e)
123
+ part_shape.u = @friction
124
+ verts = part_def[:verts].dup
125
+ verts << part_def[:verts][0]
126
+ @segments_groups << verts
127
+ when :circle
128
+ part_shape = CP::Shape::Circle.new(@body, part_def[:radius], part_def[:offset])
129
+ else
130
+ raise "unsupported sub shape type"
131
+ end
114
132
  part_shape.collision_type = part_name.to_sym
115
- # TODO pass all physics params to parts (ie u and e)
116
- part_shape.u = @friction
117
133
  @shapes << part_shape
118
- verts = part_def[:verts].dup
119
- verts << part_def[:verts][0]
120
- @segments_groups << verts
134
+ # puts @shapes.inspect
121
135
  end
122
136
  end
123
137
  end
124
138
  end
125
139
 
126
140
  def register
141
+ @actor.when :remove_me do
142
+ cleanup_constraints
143
+ end
144
+
127
145
  physical_obj = self
128
146
  if @actor.stage.respond_to? :register_physical_object
129
147
  if @opts[:fixed]
@@ -159,7 +177,6 @@ class Physical < Behavior
159
177
  else
160
178
  ((body.a) * 180.0 / Math::PI + 90) % 360
161
179
  end
162
- # rot_deg = rotation.round % 360
163
180
  end
164
181
 
165
182
  def warp(new_p)
@@ -171,19 +188,85 @@ class Physical < Behavior
171
188
  self
172
189
  end
173
190
 
174
- # def image
175
- # old_image = nil
176
- # rot_deg = rotation.round % 360
177
- #
178
- # if @actor.is? :animated
179
- # old_image = @actor.animated.image
180
- # elsif @actor.is? :graphical
181
- # old_image = @actor.graphical.image
182
- # end
183
- #
184
- # if old_image
185
- # # XXX rotate when drawing, not when getting image
186
- # old_image.rotozoom(rot_deg,1,true)
187
- # end
188
- # end
191
+ def pivot(my_anchor, other_physical, other_anchor)
192
+ pivot = CP::Constraint::PivotJoint.new(physical.body, other_physical.body, my_anchor, other_anchor)
193
+ @actor.stage.register_physical_constraint pivot
194
+ @constraints << pivot
195
+ pivot
196
+ end
197
+
198
+ def pin(my_anchor, other_physical, other_anchor)
199
+ pin = CP::Constraint::PinJoint.new(physical.body, other_physical.physical.body, my_anchor, other_anchor)
200
+ @actor.stage.register_physical_constraint pin
201
+ @constraints << pin
202
+ pin
203
+ end
204
+
205
+ def spring(my_anchor, other_physical, other_anchor, rest_length, stiffness, damping)
206
+ spring = CP::Constraint::DampedSpring.new(physical.body,other_physical.body,
207
+ my_anchor,other_anchor, rest_length, stiffness, damping)
208
+ @actor.stage.register_physical_constraint spring
209
+ @constraints << spring
210
+ spring
211
+ end
212
+
213
+ def slide(my_anchor, other_physical, other_anchor, min_distance, max_distance)
214
+ slide = CP::Constraint::SlideJoint.new(physical.body, other_physical.body, my_anchor, other_anchor, min_distance, max_distance)
215
+ @actor.stage.register_physical_constraint slide
216
+ @constraints << slide
217
+ slide
218
+ end
219
+
220
+ def groove(groove_start, groove_end, other_physical, other_anchor)
221
+ groove = CP::Constraint::GrooveJoint.new(physical.body, other_physical.body, groove_start, groove_end, other_anchor)
222
+ @actor.stage.register_physical_constraint groove
223
+ @constraints << groove
224
+ groove
225
+ end
226
+
227
+ #
228
+ # All of these rotary joint types expect angles in radians.
229
+ #
230
+
231
+ def rotary_spring(other_physical, rest_angle, stiffness, damping)
232
+ rotary_spring = CP::Constraint::DampedRotarySpring.new(physical.body, other_physical.body, rest_angle, stiffness, damping)
233
+ @actor.stage.register_physical_constraint rotary_spring
234
+ @constraints << rotary_spring
235
+ rotary_spring
236
+ end
237
+
238
+ def rotary_limit(other_physical, min_angle, max_angle)
239
+ rotary_limit = CP::Constraint::RotaryLimitJoint.new(physical.body, other_physical.body, min_angle, max_angle)
240
+ @actor.stage.register_physical_constraint rotary_limit
241
+ @constraints << rotary_limit
242
+ rotary_limit
243
+ end
244
+
245
+ def ratchet(other_physical, phase, ratchet)
246
+ ratchet_joint = CP::Constraint::RatchetJoint.new(physical.body, other_physical.body, phase, ratchet)
247
+ @actor.stage.register_physical_constraint ratchet_joint
248
+ @constraints << ratchet_joint
249
+ ratchet_joint
250
+ end
251
+
252
+ def gear(other_physical, phase, ratio)
253
+ gear = CP::Constraint::GearJoint.new(physical.body, other_physical.body, phase, ratio)
254
+ @actor.stage.register_physical_constraint gear
255
+ @constraints << gear
256
+ gear
257
+ end
258
+
259
+ def motor(other_physical, rate)
260
+ motor = CP::Constraint::SimpleMotor.new(physical.body, other_physical.body, rate)
261
+ @actor.stage.register_physical_constraint motor
262
+ @constraints << motor
263
+ motor
264
+ end
265
+
266
+ def cleanup_constraints
267
+ @constraints.each do |c|
268
+ @actor.stage.unregister_physical_constraint c
269
+ end
270
+ end
271
+
189
272
  end
@@ -0,0 +1,33 @@
1
+ class Timed < Behavior
2
+
3
+ def setup
4
+ actor.when :remove_me do |actor|
5
+ clear_timers
6
+ end
7
+
8
+ @timers = []
9
+ relegates :add_timer, :remove_timer
10
+ end
11
+
12
+ def add_timer(name, ms, recurring = true, &block)
13
+ timer_name = "#{actor.object_id} #{name}"
14
+ @timers << timer_name
15
+ actor.stage.add_timer timer_name, ms do
16
+ block.call
17
+ actor.stage.remove_timer timer_name unless recurring
18
+ end
19
+ end
20
+
21
+ def remove_timer(name)
22
+ timer_name = "#{actor.object_id} #{name}"
23
+ @timers.delete timer_name
24
+ actor.stage.remove_timer timer_name
25
+ end
26
+
27
+ def clear_timers
28
+ @timers.each do |timer_name|
29
+ actor.stage.remove_timer timer_name
30
+ end
31
+ end
32
+
33
+ end
@@ -1,4 +1,4 @@
1
- require 'behavior'
1
+
2
2
 
3
3
  class Updatable < Behavior
4
4
 
@@ -4,27 +4,7 @@ module ClassFinder
4
4
  def find(name)
5
5
  klass = nil
6
6
  klass_name = Inflector.camelize(name)
7
-
8
- begin
9
- klass = Object.const_get(klass_name)
10
- rescue NameError => ex
11
- # not there yet
12
- log(:warn, ex)
13
- begin
14
- require "#{name}"
15
- rescue LoadError => ex
16
- # maybe its included somewhere else
17
- log(:warn, ex)
18
- ensure
19
- begin
20
- klass = Object.const_get(klass_name)
21
- rescue Exception => ex
22
- # leave this alone.. maybe there isnt a NameView
23
- log(:warn, ex)
24
-
25
- end
26
- end
27
- end
7
+ klass = Object.const_get(klass_name) rescue
28
8
 
29
9
  klass
30
10
  end
@@ -1,39 +1,41 @@
1
- puts "Connecting to game..."
2
- require 'irb'
3
- require 'irb/completion'
4
- module IRB
5
- def IRB.start_session(obj)
6
- unless $irb
7
- IRB.setup nil
8
- ## maybe set some opts here, as in parse_opts in irb/init.rb?
9
- IRB.load_modules
10
- end
1
+ if $0 == __FILE__
2
+ puts "Connecting to game..."
3
+ require 'irb'
4
+ require 'irb/completion'
5
+ module IRB
6
+ def IRB.start_session(obj)
7
+ unless $irb
8
+ IRB.setup nil
9
+ ## maybe set some opts here, as in parse_opts in irb/init.rb?
10
+ IRB.load_modules
11
+ end
11
12
 
12
- workspace = WorkSpace.new(obj)
13
+ workspace = WorkSpace.new(obj)
13
14
 
14
- if @CONF[:SCRIPT] ## normally, set by parse_opts
15
- $irb = Irb.new(workspace, @CONF[:SCRIPT])
16
- else
17
- $irb = Irb.new(workspace)
18
- end
15
+ if @CONF[:SCRIPT] ## normally, set by parse_opts
16
+ $irb = Irb.new(workspace, @CONF[:SCRIPT])
17
+ else
18
+ $irb = Irb.new(workspace)
19
+ end
19
20
 
20
- @CONF[:IRB_RC].call($irb.context) if @CONF[:IRB_RC]
21
- @CONF[:MAIN_CONTEXT] = $irb.context
21
+ @CONF[:IRB_RC].call($irb.context) if @CONF[:IRB_RC]
22
+ @CONF[:MAIN_CONTEXT] = $irb.context
22
23
 
23
- trap("INT") do
24
- $irb.signal_handle
25
- end
24
+ trap("INT") do
25
+ $irb.signal_handle
26
+ end
26
27
 
27
- catch(:IRB_EXIT) do
28
- $irb.eval_input
29
- end
30
- print "\n"
28
+ catch(:IRB_EXIT) do
29
+ $irb.eval_input
30
+ end
31
+ print "\n"
31
32
 
32
- ## might want to reset your app's interrupt handler here
33
+ ## might want to reset your app's interrupt handler here
34
+ end
33
35
  end
34
- end
35
36
 
36
- require 'drb'
37
- DRb.start_service
38
- game = DRbObject.new nil, "druby://localhost:7373"
39
- IRB.start_session game
37
+ require 'drb'
38
+ DRb.start_service
39
+ game = DRbObject.new nil, "druby://localhost:7373"
40
+ IRB.start_session game
41
+ end
@@ -0,0 +1,481 @@
1
+ enum = 0
2
+ MOUSE_LEFT = enum += 1
3
+ MOUSE_MIDDLE = enum += 1
4
+ MOUSE_RIGHT = enum += 1
5
+ MOUSE_LMASK = enum += 1
6
+ MOUSE_MMASK = enum += 1
7
+ MOUSE_RMASK = enum += 1
8
+
9
+ K_UNKNOWN = enum += 1
10
+ K_FIRST = enum += 1
11
+ K_BACKSPACE = KbBackspace
12
+ K_TAB = KbTab
13
+ K_CLEAR = enum += 1
14
+ K_RETURN = KbReturn
15
+ K_PAUSE = enum += 1
16
+ K_ESCAPE = KbEscape
17
+ K_SPACE = KbSpace
18
+ K_EXCLAIM = enum += 1
19
+ K_QUOTEDBL = enum += 1
20
+ K_HASH = enum += 1
21
+ K_DOLLAR = enum += 1
22
+ K_AMPERSAND = enum += 1
23
+ K_QUOTE = enum += 1
24
+ K_LEFTPAREN = enum += 1
25
+ K_RIGHTPAREN = enum += 1
26
+ K_ASTERISK = enum += 1
27
+ K_PLUS = enum += 1
28
+ K_COMMA = enum += 1
29
+ K_MINUS = enum += 1
30
+ K_PERIOD = enum += 1
31
+ K_SLASH = enum += 1
32
+ K_0 = Kb0
33
+ K_1 = Kb1
34
+ K_2 = Kb2
35
+ K_3 = Kb3
36
+ K_4 = Kb4
37
+ K_5 = Kb5
38
+ K_6 = Kb6
39
+ K_7 = Kb7
40
+ K_8 = Kb8
41
+ K_9 = Kb9
42
+ K_COLON = enum += 1
43
+ K_SEMICOLON = enum += 1
44
+ K_LESS = enum += 1
45
+ K_EQUALS = enum += 1
46
+ K_GREATER = enum += 1
47
+ K_QUESTION = enum += 1
48
+ K_AT = enum += 1
49
+ K_LEFTBRACKET = enum += 1
50
+ K_BACKSLASH = enum += 1
51
+ K_RIGHTBRACKET = enum += 1
52
+ K_CARET = enum += 1
53
+ K_UNDERSCORE = enum += 1
54
+ K_BACKQUOTE = enum += 1
55
+ K_A = KbA
56
+ K_B = KbB
57
+ K_C = KbC
58
+ K_D = KbD
59
+ K_E = KbE
60
+ K_F = KbF
61
+ K_G = KbG
62
+ K_H = KbH
63
+ K_I = KbI
64
+ K_J = KbJ
65
+ K_K = KbK
66
+ K_L = KbL
67
+ K_M = KbM
68
+ K_N = KbN
69
+ K_O = KbO
70
+ K_P = KbP
71
+ K_Q = KbQ
72
+ K_R = KbR
73
+ K_S = KbS
74
+ K_T = KbT
75
+ K_U = KbU
76
+ K_V = KbV
77
+ K_W = KbW
78
+ K_X = KbX
79
+ K_Y = KbY
80
+ K_Z = KbZ
81
+ K_DELETE = KbDelete
82
+
83
+ K_WORLD_0 = enum += 1
84
+ K_WORLD_1 = enum += 1
85
+ K_WORLD_2 = enum += 1
86
+ K_WORLD_3 = enum += 1
87
+ K_WORLD_4 = enum += 1
88
+ K_WORLD_5 = enum += 1
89
+ K_WORLD_6 = enum += 1
90
+ K_WORLD_7 = enum += 1
91
+ K_WORLD_8 = enum += 1
92
+ K_WORLD_9 = enum += 1
93
+ K_WORLD_10 = enum += 1
94
+ K_WORLD_11 = enum += 1
95
+ K_WORLD_12 = enum += 1
96
+ K_WORLD_13 = enum += 1
97
+ K_WORLD_14 = enum += 1
98
+ K_WORLD_15 = enum += 1
99
+ K_WORLD_16 = enum += 1
100
+ K_WORLD_17 = enum += 1
101
+ K_WORLD_18 = enum += 1
102
+ K_WORLD_19 = enum += 1
103
+ K_WORLD_20 = enum += 1
104
+ K_WORLD_21 = enum += 1
105
+ K_WORLD_22 = enum += 1
106
+ K_WORLD_23 = enum += 1
107
+ K_WORLD_24 = enum += 1
108
+ K_WORLD_25 = enum += 1
109
+ K_WORLD_26 = enum += 1
110
+ K_WORLD_27 = enum += 1
111
+ K_WORLD_28 = enum += 1
112
+ K_WORLD_29 = enum += 1
113
+ K_WORLD_30 = enum += 1
114
+ K_WORLD_31 = enum += 1
115
+ K_WORLD_32 = enum += 1
116
+ K_WORLD_33 = enum += 1
117
+ K_WORLD_34 = enum += 1
118
+ K_WORLD_35 = enum += 1
119
+ K_WORLD_36 = enum += 1
120
+ K_WORLD_37 = enum += 1
121
+ K_WORLD_38 = enum += 1
122
+ K_WORLD_39 = enum += 1
123
+ K_WORLD_40 = enum += 1
124
+ K_WORLD_41 = enum += 1
125
+ K_WORLD_42 = enum += 1
126
+ K_WORLD_43 = enum += 1
127
+ K_WORLD_44 = enum += 1
128
+ K_WORLD_45 = enum += 1
129
+ K_WORLD_46 = enum += 1
130
+ K_WORLD_47 = enum += 1
131
+ K_WORLD_48 = enum += 1
132
+ K_WORLD_49 = enum += 1
133
+ K_WORLD_50 = enum += 1
134
+ K_WORLD_51 = enum += 1
135
+ K_WORLD_52 = enum += 1
136
+ K_WORLD_53 = enum += 1
137
+ K_WORLD_54 = enum += 1
138
+ K_WORLD_55 = enum += 1
139
+ K_WORLD_56 = enum += 1
140
+ K_WORLD_57 = enum += 1
141
+ K_WORLD_58 = enum += 1
142
+ K_WORLD_59 = enum += 1
143
+ K_WORLD_60 = enum += 1
144
+ K_WORLD_61 = enum += 1
145
+ K_WORLD_62 = enum += 1
146
+ K_WORLD_63 = enum += 1
147
+ K_WORLD_64 = enum += 1
148
+ K_WORLD_65 = enum += 1
149
+ K_WORLD_66 = enum += 1
150
+ K_WORLD_67 = enum += 1
151
+ K_WORLD_68 = enum += 1
152
+ K_WORLD_69 = enum += 1
153
+ K_WORLD_70 = enum += 1
154
+ K_WORLD_71 = enum += 1
155
+ K_WORLD_72 = enum += 1
156
+ K_WORLD_73 = enum += 1
157
+ K_WORLD_74 = enum += 1
158
+ K_WORLD_75 = enum += 1
159
+ K_WORLD_76 = enum += 1
160
+ K_WORLD_77 = enum += 1
161
+ K_WORLD_78 = enum += 1
162
+ K_WORLD_79 = enum += 1
163
+ K_WORLD_80 = enum += 1
164
+ K_WORLD_81 = enum += 1
165
+ K_WORLD_82 = enum += 1
166
+ K_WORLD_83 = enum += 1
167
+ K_WORLD_84 = enum += 1
168
+ K_WORLD_85 = enum += 1
169
+ K_WORLD_86 = enum += 1
170
+ K_WORLD_87 = enum += 1
171
+ K_WORLD_88 = enum += 1
172
+ K_WORLD_89 = enum += 1
173
+ K_WORLD_90 = enum += 1
174
+ K_WORLD_91 = enum += 1
175
+ K_WORLD_92 = enum += 1
176
+ K_WORLD_93 = enum += 1
177
+ K_WORLD_94 = enum += 1
178
+ K_WORLD_95 = enum += 1
179
+
180
+ K_KP0 = enum += 1
181
+ K_KP1 = enum += 1
182
+ K_KP2 = enum += 1
183
+ K_KP3 = enum += 1
184
+ K_KP4 = enum += 1
185
+ K_KP5 = enum += 1
186
+ K_KP6 = enum += 1
187
+ K_KP7 = enum += 1
188
+ K_KP8 = enum += 1
189
+ K_KP9 = enum += 1
190
+ K_KP_PERIOD = enum += 1
191
+ K_KP_DIVIDE = enum += 1
192
+ K_KP_MULTIPLY = enum += 1
193
+ K_KP_MINUS = enum += 1
194
+ K_KP_PLUS = enum += 1
195
+ K_KP_ENTER = enum += 1
196
+ K_KP_EQUALS = enum += 1
197
+
198
+ K_UP = KbUp
199
+ K_DOWN = KbDown
200
+ K_RIGHT = KbRight
201
+ K_LEFT = KbLeft
202
+ K_INSERT = enum += 1
203
+ K_HOME = KbHome
204
+ K_END = KbEnd
205
+ K_PAGEUP = enum += 1
206
+ K_PAGEDOWN = enum += 1
207
+
208
+ K_F1 = enum += 1
209
+ K_F2 = enum += 1
210
+ K_F3 = enum += 1
211
+ K_F4 = enum += 1
212
+ K_F5 = enum += 1
213
+ K_F6 = enum += 1
214
+ K_F7 = enum += 1
215
+ K_F8 = enum += 1
216
+ K_F9 = enum += 1
217
+ K_F10 = enum += 1
218
+ K_F11 = enum += 1
219
+ K_F12 = enum += 1
220
+ K_F13 = enum += 1
221
+ K_F14 = enum += 1
222
+ K_F15 = enum += 1
223
+
224
+ K_NUMLOCK = enum += 1
225
+ K_CAPSLOCK = enum += 1
226
+ K_SCROLLOCK = enum += 1
227
+ K_RSHIFT = enum += 1
228
+ K_LSHIFT = enum += 1
229
+ K_RCTRL = enum += 1
230
+ K_LCTRL = enum += 1
231
+ K_RALT = enum += 1
232
+ K_LALT = enum += 1
233
+ K_RMETA = enum += 1
234
+ K_LMETA = enum += 1
235
+ K_LSUPER = enum += 1
236
+ K_RSUPER = enum += 1
237
+ K_MODE = enum += 1
238
+
239
+ K_HELP = enum += 1
240
+ K_PRINT = enum += 1
241
+ K_SYSREQ = enum += 1
242
+ K_BREAK = enum += 1
243
+ K_MENU = enum += 1
244
+ K_POWER = enum += 1
245
+ K_EURO = enum += 1
246
+ K_LAST = enum += 1
247
+
248
+ K_MOD_NONE = enum += 1
249
+ K_MOD_LSHIFT = enum += 1
250
+ K_MOD_RSHIFT = enum += 1
251
+ K_MOD_LCTRL = enum += 1
252
+ K_MOD_RCTRL = enum += 1
253
+ K_MOD_LALT = enum += 1
254
+ K_MOD_RALT = enum += 1
255
+ K_MOD_LMETA = enum += 1
256
+ K_MOD_RMETA = enum += 1
257
+ K_MOD_NUM = enum += 1
258
+ K_MOD_CAPS = enum += 1
259
+ K_MOD_MODE = enum += 1
260
+ K_MOD_RESERVED = enum += 1
261
+
262
+ K_MOD_CTRL = enum += 1
263
+ K_MOD_SHIFT = enum += 1
264
+ K_MOD_ALT = enum += 1
265
+ K_MOD_META = enum += 1
266
+
267
+
268
+ # key/mouse event mappings
269
+ # Hash to translate mouse button sym to string
270
+ MOUSE2STR = {
271
+ MOUSE_LEFT => "left",
272
+ MOUSE_MIDDLE => "middle",
273
+ MOUSE_RIGHT => "right"
274
+ }
275
+ # And to translate the other way...
276
+ STR2MOUSE = MOUSE2STR.invert()
277
+ # And allow numbers too (1 = left, so on)...
278
+ STR2MOUSE[1] = MOUSE_LEFT
279
+ STR2MOUSE[2] = MOUSE_MIDDLE
280
+ STR2MOUSE[3] = MOUSE_RIGHT
281
+
282
+ # All the keys which have ASCII print values
283
+ # It is 87 lines from here to the closing }, if you want to skip it...
284
+ KEY2ASCII = {
285
+ K_BACKSPACE => "\b",
286
+ K_TAB => "\t",
287
+ K_RETURN => "\n", #SDL docs: "\r". Win vs *nix? What about Mac?
288
+ K_ESCAPE => "^[",
289
+ K_SPACE => " ",
290
+ K_EXCLAIM => "!",
291
+ K_QUOTEDBL => "\"",
292
+ K_HASH => "#",
293
+ K_DOLLAR => "$",
294
+ K_AMPERSAND => "&",
295
+ K_QUOTE => "\'",
296
+ K_LEFTPAREN => "(",
297
+ K_RIGHTPAREN => ")",
298
+ K_ASTERISK => "*",
299
+ K_PLUS => "+",
300
+ K_COMMA => ",",
301
+ K_MINUS => "-",
302
+ K_PERIOD => ".",
303
+ K_SLASH => "/",
304
+ K_0 => "0",
305
+ K_1 => "1",
306
+ K_2 => "2",
307
+ K_3 => "3",
308
+ K_4 => "4",
309
+ K_5 => "5",
310
+ K_6 => "6",
311
+ K_7 => "7",
312
+ K_8 => "8",
313
+ K_9 => "9",
314
+ K_COLON => ":",
315
+ K_SEMICOLON => ";",
316
+ K_LESS => "<",
317
+ K_EQUALS => "=",
318
+ K_GREATER => ">",
319
+ K_QUESTION => "?",
320
+ K_AT => "@",
321
+ K_LEFTBRACKET => "[",
322
+ K_BACKSLASH => "\\",
323
+ K_RIGHTBRACKET => "]",
324
+ K_CARET => "^",
325
+ K_UNDERSCORE => "_",
326
+ K_BACKQUOTE => "`",
327
+ K_A => "a",
328
+ K_B => "b",
329
+ K_C => "c",
330
+ K_D => "d",
331
+ K_E => "e",
332
+ K_F => "f",
333
+ K_G => "g",
334
+ K_H => "h",
335
+ K_I => "i",
336
+ K_J => "j",
337
+ K_K => "k",
338
+ K_L => "l",
339
+ K_M => "m",
340
+ K_N => "n",
341
+ K_O => "o",
342
+ K_P => "p",
343
+ K_Q => "q",
344
+ K_R => "r",
345
+ K_S => "s",
346
+ K_T => "t",
347
+ K_U => "u",
348
+ K_V => "v",
349
+ K_W => "w",
350
+ K_X => "x",
351
+ K_Y => "y",
352
+ K_Z => "z",
353
+ K_KP0 => "0",
354
+ K_KP1 => "1",
355
+ K_KP2 => "2",
356
+ K_KP3 => "3",
357
+ K_KP4 => "4",
358
+ K_KP5 => "5",
359
+ K_KP6 => "6",
360
+ K_KP7 => "7",
361
+ K_KP8 => "8",
362
+ K_KP9 => "9",
363
+ K_KP_PERIOD => ".",
364
+ K_KP_DIVIDE => "/",
365
+ K_KP_MULTIPLY => "*",
366
+ K_KP_MINUS => "-",
367
+ K_KP_PLUS => "+",
368
+ K_KP_ENTER => "\n", #again, SDL docs say "\r"
369
+ K_KP_EQUALS => "=",
370
+ }
371
+
372
+ # And to translate the other way...
373
+ ASCII2KEY = KEY2ASCII.invert()
374
+ # accept uppercase letters too, return same as lowercase version:
375
+ ("a".."z").each{ |letter| ASCII2KEY[letter.upcase] = ASCII2KEY[letter] }
376
+
377
+ # All the keys that are affected by the Shift key, in lower case
378
+ # 49 lines from here to the end of the hash
379
+ KEY2LOWER = {
380
+ K_QUOTE => "\'",
381
+ K_COMMA => ",",
382
+ K_MINUS => "-",
383
+ K_PERIOD => ".",
384
+ K_SLASH => "/",
385
+ K_0 => "0",
386
+ K_1 => "1",
387
+ K_2 => "2",
388
+ K_3 => "3",
389
+ K_4 => "4",
390
+ K_5 => "5",
391
+ K_6 => "6",
392
+ K_7 => "7",
393
+ K_8 => "8",
394
+ K_9 => "9",
395
+ K_SEMICOLON => ";",
396
+ K_EQUALS => "=",
397
+ K_LEFTBRACKET => "[",
398
+ K_BACKSLASH => "\\",
399
+ K_RIGHTBRACKET => "]",
400
+ K_BACKQUOTE => "`",
401
+ K_A => "a",
402
+ K_B => "b",
403
+ K_C => "c",
404
+ K_D => "d",
405
+ K_E => "e",
406
+ K_F => "f",
407
+ K_G => "g",
408
+ K_H => "h",
409
+ K_I => "i",
410
+ K_J => "j",
411
+ K_K => "k",
412
+ K_L => "l",
413
+ K_M => "m",
414
+ K_N => "n",
415
+ K_O => "o",
416
+ K_P => "p",
417
+ K_Q => "q",
418
+ K_R => "r",
419
+ K_S => "s",
420
+ K_T => "t",
421
+ K_U => "u",
422
+ K_V => "v",
423
+ K_W => "w",
424
+ K_X => "x",
425
+ K_Y => "y",
426
+ K_Z => "z",
427
+ }
428
+
429
+ # All the keys that are affected by the Shift key, in UPPER case
430
+ # 49 lines from here to the end of the hash
431
+ KEY2UPPER = {
432
+ K_QUOTE => "\"",
433
+ K_COMMA => "<",
434
+ K_MINUS => "_",
435
+ K_PERIOD => ">",
436
+ K_SLASH => "?",
437
+ K_0 => ")",
438
+ K_1 => "!",
439
+ K_2 => "@",
440
+ K_3 => "#",
441
+ K_4 => "$",
442
+ K_5 => "%",
443
+ K_6 => "^",
444
+ K_7 => "&",
445
+ K_8 => "*",
446
+ K_9 => "(",
447
+ K_SEMICOLON => ":",
448
+ K_EQUALS => "+",
449
+ K_LEFTBRACKET => "{",
450
+ K_BACKSLASH => "|",
451
+ K_RIGHTBRACKET => "}",
452
+ K_BACKQUOTE => "~",
453
+ K_A => "A",
454
+ K_B => "B",
455
+ K_C => "C",
456
+ K_D => "D",
457
+ K_E => "E",
458
+ K_F => "F",
459
+ K_G => "G",
460
+ K_H => "H",
461
+ K_I => "I",
462
+ K_J => "J",
463
+ K_K => "K",
464
+ K_L => "L",
465
+ K_M => "M",
466
+ K_N => "N",
467
+ K_O => "O",
468
+ K_P => "P",
469
+ K_Q => "Q",
470
+ K_R => "R",
471
+ K_S => "S",
472
+ K_T => "T",
473
+ K_U => "U",
474
+ K_V => "V",
475
+ K_W => "W",
476
+ K_X => "X",
477
+ K_Y => "Y",
478
+ K_Z => "Z",
479
+ }
480
+
481
+