ruby2d 0.9.3 → 0.11.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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/assets/README.md +7 -9
  3. data/assets/Rakefile +85 -0
  4. data/assets/include/SDL2/SDL.h +4 -1
  5. data/assets/include/SDL2/SDL_assert.h +3 -1
  6. data/assets/include/SDL2/SDL_atomic.h +20 -2
  7. data/assets/include/SDL2/SDL_audio.h +47 -14
  8. data/assets/include/SDL2/SDL_bits.h +10 -1
  9. data/assets/include/SDL2/SDL_blendmode.h +10 -7
  10. data/assets/include/SDL2/SDL_clipboard.h +1 -1
  11. data/assets/include/SDL2/SDL_config.h +24 -390
  12. data/assets/include/SDL2/SDL_config_android.h +182 -0
  13. data/assets/include/SDL2/SDL_config_iphoneos.h +207 -0
  14. data/assets/include/SDL2/SDL_config_macosx.h +266 -0
  15. data/assets/include/SDL2/SDL_config_minimal.h +85 -0
  16. data/assets/include/SDL2/SDL_config_os2.h +188 -0
  17. data/assets/include/SDL2/SDL_config_pandora.h +135 -0
  18. data/assets/include/SDL2/SDL_config_psp.h +165 -0
  19. data/assets/include/SDL2/SDL_config_windows.h +288 -0
  20. data/assets/include/SDL2/SDL_config_winrt.h +243 -0
  21. data/assets/include/SDL2/SDL_config_wiz.h +149 -0
  22. data/assets/include/SDL2/SDL_copying.h +20 -0
  23. data/assets/include/SDL2/SDL_cpuinfo.h +119 -8
  24. data/assets/include/SDL2/SDL_egl.h +4 -1
  25. data/assets/include/SDL2/SDL_endian.h +6 -3
  26. data/assets/include/SDL2/SDL_error.h +38 -2
  27. data/assets/include/SDL2/SDL_events.h +67 -28
  28. data/assets/include/SDL2/SDL_filesystem.h +1 -1
  29. data/assets/include/SDL2/SDL_gamecontroller.h +160 -9
  30. data/assets/include/SDL2/SDL_gesture.h +1 -1
  31. data/assets/include/SDL2/SDL_haptic.h +10 -1
  32. data/assets/include/SDL2/SDL_hints.h +460 -17
  33. data/assets/include/SDL2/SDL_image.h +2 -2
  34. data/assets/include/SDL2/SDL_joystick.h +115 -24
  35. data/assets/include/SDL2/SDL_keyboard.h +1 -1
  36. data/assets/include/SDL2/SDL_keycode.h +11 -9
  37. data/assets/include/SDL2/SDL_loadso.h +1 -1
  38. data/assets/include/SDL2/SDL_locale.h +101 -0
  39. data/assets/include/SDL2/SDL_log.h +3 -3
  40. data/assets/include/SDL2/SDL_main.h +28 -16
  41. data/assets/include/SDL2/SDL_messagebox.h +6 -4
  42. data/assets/include/SDL2/SDL_metal.h +117 -0
  43. data/assets/include/SDL2/SDL_misc.h +75 -0
  44. data/assets/include/SDL2/SDL_mouse.h +1 -1
  45. data/assets/include/SDL2/SDL_mutex.h +1 -1
  46. data/assets/include/SDL2/SDL_name.h +1 -1
  47. data/assets/include/SDL2/SDL_opengl.h +1 -1
  48. data/assets/include/SDL2/SDL_opengl_glext.h +3 -0
  49. data/assets/include/SDL2/SDL_opengles.h +1 -1
  50. data/assets/include/SDL2/SDL_opengles2.h +1 -1
  51. data/assets/include/SDL2/SDL_pixels.h +27 -18
  52. data/assets/include/SDL2/SDL_platform.h +1 -1
  53. data/assets/include/SDL2/SDL_power.h +1 -1
  54. data/assets/include/SDL2/SDL_quit.h +1 -1
  55. data/assets/include/SDL2/SDL_rect.h +29 -3
  56. data/assets/include/SDL2/SDL_render.h +230 -3
  57. data/assets/include/SDL2/SDL_revision.h +2 -2
  58. data/assets/include/SDL2/SDL_rwops.h +51 -22
  59. data/assets/include/SDL2/SDL_scancode.h +2 -2
  60. data/assets/include/SDL2/SDL_sensor.h +28 -12
  61. data/assets/include/SDL2/SDL_shape.h +1 -1
  62. data/assets/include/SDL2/SDL_stdinc.h +44 -4
  63. data/assets/include/SDL2/SDL_surface.h +12 -2
  64. data/assets/include/SDL2/SDL_system.h +50 -4
  65. data/assets/include/SDL2/SDL_syswm.h +39 -9
  66. data/assets/include/SDL2/SDL_test.h +1 -1
  67. data/assets/include/SDL2/SDL_test_assert.h +1 -1
  68. data/assets/include/SDL2/SDL_test_common.h +32 -2
  69. data/assets/include/SDL2/SDL_test_compare.h +1 -1
  70. data/assets/include/SDL2/SDL_test_crc32.h +1 -1
  71. data/assets/include/SDL2/SDL_test_font.h +1 -1
  72. data/assets/include/SDL2/SDL_test_fuzzer.h +1 -1
  73. data/assets/include/SDL2/SDL_test_harness.h +1 -1
  74. data/assets/include/SDL2/SDL_test_images.h +1 -1
  75. data/assets/include/SDL2/SDL_test_log.h +1 -1
  76. data/assets/include/SDL2/SDL_test_md5.h +1 -1
  77. data/assets/include/SDL2/SDL_test_memory.h +3 -3
  78. data/assets/include/SDL2/SDL_test_random.h +1 -1
  79. data/assets/include/SDL2/SDL_thread.h +34 -11
  80. data/assets/include/SDL2/SDL_timer.h +1 -1
  81. data/assets/include/SDL2/SDL_touch.h +17 -1
  82. data/assets/include/SDL2/SDL_types.h +1 -1
  83. data/assets/include/SDL2/SDL_version.h +2 -2
  84. data/assets/include/SDL2/SDL_video.h +11 -5
  85. data/assets/include/SDL2/SDL_vulkan.h +9 -11
  86. data/assets/include/SDL2/begin_code.h +8 -9
  87. data/assets/include/SDL2/close_code.h +4 -1
  88. data/assets/macos/lib/libFLAC.a +0 -0
  89. data/assets/macos/lib/libSDL2.a +0 -0
  90. data/assets/macos/lib/libSDL2_image.a +0 -0
  91. data/assets/macos/lib/libSDL2_mixer.a +0 -0
  92. data/assets/macos/lib/libSDL2_ttf.a +0 -0
  93. data/assets/macos/lib/libfreetype.a +0 -0
  94. data/assets/macos/lib/libjpeg.a +0 -0
  95. data/assets/macos/lib/libmpg123.a +0 -0
  96. data/assets/macos/lib/libogg.a +0 -0
  97. data/assets/macos/lib/libpng16.a +0 -0
  98. data/assets/macos/lib/libtiff.a +0 -0
  99. data/assets/macos/lib/libvorbis.a +0 -0
  100. data/assets/macos/lib/libvorbisfile.a +0 -0
  101. data/assets/macos/lib/libwebp.a +0 -0
  102. data/assets/mingw/bin/SDL2.dll +0 -0
  103. data/assets/mingw/bin/SDL2_image.dll +0 -0
  104. data/assets/mingw/bin/libpng16-16.dll +0 -0
  105. data/assets/mingw/bin/libtiff-5.dll +0 -0
  106. data/assets/mingw/bin/libwebp-7.dll +0 -0
  107. data/assets/mingw/lib/libSDL2.a +0 -0
  108. data/assets/mingw/lib/libSDL2.dll.a +0 -0
  109. data/assets/mingw/lib/libSDL2_image.a +0 -0
  110. data/assets/mingw/lib/libSDL2_image.dll.a +0 -0
  111. data/assets/mingw/lib/libSDL2_test.a +0 -0
  112. data/assets/mingw/lib/libSDL2main.a +0 -0
  113. data/bin/ruby2d +1 -0
  114. data/{assets/linux/simple2d/src/simple2d.c → ext/ruby2d/common.c} +32 -32
  115. data/{assets/linux/simple2d/src → ext/ruby2d}/controllers.c +17 -17
  116. data/ext/ruby2d/extconf.rb +36 -58
  117. data/ext/ruby2d/font.c +35 -0
  118. data/{assets/linux/simple2d/src → ext/ruby2d}/gl.c +72 -100
  119. data/ext/ruby2d/gl2.c +86 -0
  120. data/ext/ruby2d/gl3.c +305 -0
  121. data/{assets/linux/simple2d/src → ext/ruby2d}/gles.c +22 -81
  122. data/ext/ruby2d/image.c +58 -0
  123. data/{assets/linux/simple2d/src → ext/ruby2d}/input.c +8 -8
  124. data/{assets/linux/simple2d/src → ext/ruby2d}/music.c +30 -17
  125. data/ext/ruby2d/ruby2d.c +449 -439
  126. data/ext/ruby2d/ruby2d.h +652 -0
  127. data/{assets/linux/simple2d/src → ext/ruby2d}/shapes.c +18 -18
  128. data/ext/ruby2d/sound.c +118 -0
  129. data/ext/ruby2d/text.c +22 -0
  130. data/{assets/linux/simple2d/src → ext/ruby2d}/window.c +73 -62
  131. data/lib/ruby2d/circle.rb +21 -3
  132. data/lib/ruby2d/cli/build.rb +4 -7
  133. data/lib/ruby2d/dsl.rb +16 -9
  134. data/lib/ruby2d/entity.rb +17 -0
  135. data/lib/ruby2d/font.rb +23 -3
  136. data/lib/ruby2d/image.rb +35 -7
  137. data/lib/ruby2d/line.rb +23 -1
  138. data/lib/ruby2d/music.rb +5 -0
  139. data/lib/ruby2d/pixel.rb +17 -0
  140. data/lib/ruby2d/quad.rb +21 -1
  141. data/lib/ruby2d/rectangle.rb +12 -3
  142. data/lib/ruby2d/renderable.rb +4 -20
  143. data/lib/ruby2d/sound.rb +30 -0
  144. data/lib/ruby2d/sprite.rb +57 -75
  145. data/lib/ruby2d/square.rb +10 -1
  146. data/lib/ruby2d/text.rb +55 -12
  147. data/lib/ruby2d/texture.rb +28 -0
  148. data/lib/ruby2d/tileset.rb +87 -0
  149. data/lib/ruby2d/triangle.rb +19 -1
  150. data/lib/ruby2d/version.rb +1 -1
  151. data/lib/ruby2d/vertices.rb +84 -0
  152. data/lib/ruby2d/window.rb +259 -22
  153. data/lib/ruby2d.rb +6 -1
  154. metadata +41 -26
  155. data/assets/include/simple2d.h +0 -735
  156. data/assets/linux/simple2d/Makefile +0 -257
  157. data/assets/linux/simple2d/bin/simple2d.sh +0 -1312
  158. data/assets/linux/simple2d/include/simple2d.h +0 -735
  159. data/assets/linux/simple2d/src/gl2.c +0 -146
  160. data/assets/linux/simple2d/src/gl3.c +0 -275
  161. data/assets/linux/simple2d/src/image.c +0 -138
  162. data/assets/linux/simple2d/src/sound.c +0 -56
  163. data/assets/linux/simple2d/src/sprite.c +0 -147
  164. data/assets/linux/simple2d/src/text.c +0 -129
  165. data/assets/macos/lib/libsimple2d.a +0 -0
  166. data/assets/mingw/lib/libsimple2d.a +0 -0
@@ -17,7 +17,7 @@ module Ruby2D
17
17
  @y3 = opts[:y3] || 100
18
18
  @z = opts[:z] || 0
19
19
  self.color = opts[:color] || 'white'
20
- self.opacity = opts[:opacity] if opts[:opacity]
20
+ self.color.opacity = opts[:opacity] if opts[:opacity]
21
21
  add
22
22
  end
23
23
 
@@ -38,8 +38,26 @@ module Ruby2D
38
38
  questioned_area <= self_area
39
39
  end
40
40
 
41
+ def self.draw(opts = {})
42
+ Window.render_ready_check
43
+
44
+ ext_draw([
45
+ opts[:x1], opts[:y1], opts[:color][0][0], opts[:color][0][1], opts[:color][0][2], opts[:color][0][3],
46
+ opts[:x2], opts[:y2], opts[:color][1][0], opts[:color][1][1], opts[:color][1][2], opts[:color][1][3],
47
+ opts[:x3], opts[:y3], opts[:color][2][0], opts[:color][2][1], opts[:color][2][2], opts[:color][2][3]
48
+ ])
49
+ end
50
+
41
51
  private
42
52
 
53
+ def render
54
+ self.class.ext_draw([
55
+ @x1, @y1, @c1.r, @c1.g, @c1.b, @c1.a,
56
+ @x2, @y2, @c2.r, @c2.g, @c2.b, @c2.a,
57
+ @x3, @y3, @c3.r, @c3.g, @c3.b, @c3.a
58
+ ])
59
+ end
60
+
43
61
  def triangle_area(x1, y1, x2, y2, x3, y3)
44
62
  (x1*y2 + x2*y3 + x3*y1 - x3*y2 - x1*y3 - x2*y1).abs / 2
45
63
  end
@@ -1,5 +1,5 @@
1
1
  # Ruby2D::VERSION
2
2
 
3
3
  module Ruby2D
4
- VERSION = '0.9.3'
4
+ VERSION = '0.11.0'
5
5
  end
@@ -0,0 +1,84 @@
1
+ # Ruby2D::Vertices
2
+
3
+ # This class generates a vertices array which are passed to the openGL rendering code.
4
+ # The vertices array is split up into 4 groups (1 - top left, 2 - top right, 3 - bottom right, 4 - bottom left)
5
+ # This class is responsible for transforming textures, it can scale / crop / rotate and flip textures
6
+
7
+ module Ruby2D
8
+ class Vertices
9
+ def initialize(x, y, width, height, rotate, crop: nil, flip: nil)
10
+ @flip = flip
11
+ @x = x
12
+ @y = y
13
+ @width = width.to_f
14
+ @height = height.to_f
15
+
16
+ if @flip == :horizontal || @flip == :both
17
+ @x = @x + @width
18
+ @width = -@width
19
+ end
20
+
21
+ if @flip == :vertical || @flip == :both
22
+ @y = y + @height
23
+ @height = -@height
24
+ end
25
+
26
+ @rotate = rotate
27
+ @rx = @x + (@width / 2.0)
28
+ @ry = @y + (@height / 2.0)
29
+ @crop = crop
30
+ end
31
+
32
+ def coordinates
33
+ x1, y1 = rotate(@x, @y); # Top left
34
+ x2, y2 = rotate(@x + @width, @y); # Top right
35
+ x3, y3 = rotate(@x + @width, @y + @height); # Bottom right
36
+ x4, y4 = rotate(@x, @y + @height); # Bottom left
37
+
38
+ [ x1, y1, x2, y2, x3, y3, x4, y4 ]
39
+ end
40
+
41
+ def texture_coordinates
42
+ if @crop.nil?
43
+ tx1 = 0.0; ty1 = 0.0 # Top left
44
+ tx2 = 1.0; ty2 = 0.0 # Top right
45
+ tx3 = 1.0; ty3 = 1.0 # Bottom right
46
+ tx4 = 0.0; ty4 = 1.0 # Bottom left
47
+ else
48
+ tx1 = @crop[:x] / @crop[:image_width].to_f; ty1 = @crop[:y] / @crop[:image_height].to_f # Top left
49
+ tx2 = tx1 + (@crop[:width] / @crop[:image_width].to_f); ty2 = ty1 # Top right
50
+ tx3 = tx2; ty3 = ty1 + (@crop[:height] / @crop[:image_height].to_f) # Botttom right
51
+ tx4 = tx1; ty4 = ty3 # Bottom left
52
+ end
53
+
54
+ [ tx1, ty1, tx2, ty2, tx3, ty3, tx4, ty4 ]
55
+ end
56
+
57
+ private
58
+
59
+ def rotate(x, y)
60
+ return [x, y] if @rotate == 0
61
+
62
+ # Convert from degrees to radians
63
+ angle = @rotate * Math::PI / 180.0
64
+
65
+ # Get the sine and cosine of the angle
66
+ sa = Math.sin(angle)
67
+ ca = Math.cos(angle)
68
+
69
+ # Translate point to origin
70
+ x -= @rx
71
+ y -= @ry
72
+
73
+ # Rotate point
74
+ xnew = x * ca - y * sa;
75
+ ynew = x * sa + y * ca;
76
+
77
+ # Translate point back
78
+ x = xnew + @rx;
79
+ y = ynew + @ry;
80
+
81
+ [x, y]
82
+ end
83
+ end
84
+ end
data/lib/ruby2d/window.rb CHANGED
@@ -4,22 +4,20 @@
4
4
 
5
5
  module Ruby2D
6
6
  class Window
7
+ @@open_window = false
7
8
 
8
9
  # Event structures
9
- EventDescriptor = Struct.new(:type, :id)
10
- MouseEvent = Struct.new(:type, :button, :direction, :x, :y, :delta_x, :delta_y)
11
- KeyEvent = Struct.new(:type, :key)
10
+ EventDescriptor = Struct.new(:type, :id)
11
+ MouseEvent = Struct.new(:type, :button, :direction, :x, :y, :delta_x, :delta_y)
12
+ KeyEvent = Struct.new(:type, :key)
12
13
  ControllerEvent = Struct.new(:which, :type, :axis, :value, :button)
13
14
  ControllerAxisEvent = Struct.new(:which, :axis, :value)
14
15
  ControllerButtonEvent = Struct.new(:which, :button)
15
16
 
16
17
  def initialize(args = {})
17
18
 
18
- # This window instance, stored so it can be called by the class methods
19
- @@window = self
20
-
21
19
  # Title of the window
22
- @title = args[:title] || "Ruby 2D"
20
+ @title = args[:title] || "Ruby 2D"
23
21
 
24
22
  # Window background color
25
23
  @background = Color.new([0.0, 0.0, 0.0, 1.0])
@@ -51,14 +49,39 @@ module Ruby2D
51
49
  # Vertical synchronization, set to prevent screen tearing (recommended)
52
50
  @vsync = args[:vsync] || true
53
51
 
52
+ # Renderable objects currently in the window, like a linear scene graph
53
+ @objects = []
54
+
55
+ # Entities currently in the window
56
+ @entities = []
57
+
54
58
  # Mouse X and Y position in the window
55
59
  @mouse_x, @mouse_y = 0, 0
56
60
 
57
61
  # Controller axis and button mappings file
58
62
  @controller_mappings = File.expand_path('~') + "/.ruby2d/controllers.txt"
59
63
 
60
- # Renderable objects currently in the window, like a linear scene graph
61
- @objects = []
64
+ # Event stores for class pattern
65
+ @keys_down = []
66
+ @keys_held = []
67
+ @keys_up = []
68
+ @mouse_buttons_down = []
69
+ @mouse_buttons_up = []
70
+ @mouse_scroll_event = false
71
+ @mouse_scroll_direction = nil
72
+ @mouse_scroll_delta_x = 0
73
+ @mouse_scroll_delta_y = 0
74
+ @mouse_move_event = false
75
+ @mouse_move_delta_x = 0
76
+ @mouse_move_delta_y = 0
77
+ @controller_id = nil
78
+ @controller_axes_moved = []
79
+ @controller_axis_left_x = 0
80
+ @controller_axis_left_y = 0
81
+ @controller_axis_right_x = 0
82
+ @controller_axis_right_y = 0
83
+ @controller_buttons_down = []
84
+ @controller_buttons_up = []
62
85
 
63
86
  # Unique ID for the input event being registered
64
87
  @event_key = 0
@@ -83,6 +106,12 @@ module Ruby2D
83
106
  # The window update block
84
107
  @update_proc = Proc.new {}
85
108
 
109
+ # The window render block
110
+ @render_proc = Proc.new {}
111
+
112
+ # Detect if window is being used through the DSL or as a class instance
113
+ @using_dsl = !(method(:update).parameters.empty? || method(:render).parameters.empty?)
114
+
86
115
  # Whether diagnostic messages should be printed
87
116
  @diagnostics = false
88
117
 
@@ -118,43 +147,53 @@ module Ruby2D
118
147
  def screenshot(opts = nil); get(:screenshot, opts) end
119
148
 
120
149
  def get(sym, opts = nil)
121
- @@window.get(sym, opts)
150
+ DSL.window.get(sym, opts)
122
151
  end
123
152
 
124
153
  def set(opts)
125
- @@window.set(opts)
154
+ DSL.window.set(opts)
126
155
  end
127
156
 
128
157
  def on(event, &proc)
129
- @@window.on(event, &proc)
158
+ DSL.window.on(event, &proc)
130
159
  end
131
160
 
132
161
  def off(event_descriptor)
133
- @@window.off(event_descriptor)
162
+ DSL.window.off(event_descriptor)
134
163
  end
135
164
 
136
165
  def add(o)
137
- @@window.add(o)
166
+ DSL.window.add(o)
138
167
  end
139
168
 
140
169
  def remove(o)
141
- @@window.remove(o)
170
+ DSL.window.remove(o)
142
171
  end
143
172
 
144
173
  def clear
145
- @@window.clear
174
+ DSL.window.clear
146
175
  end
147
176
 
148
177
  def update(&proc)
149
- @@window.update(&proc)
178
+ DSL.window.update(&proc)
179
+ end
180
+
181
+ def render(&proc)
182
+ DSL.window.render(&proc)
150
183
  end
151
184
 
152
185
  def show
153
- @@window.show
186
+ DSL.window.show
154
187
  end
155
188
 
156
189
  def close
157
- @@window.close
190
+ DSL.window.close
191
+ end
192
+
193
+ def render_ready_check
194
+ unless @@open_window
195
+ raise Error, "Attempting to draw before the window is ready. Please put calls to draw() inside of a render block."
196
+ end
158
197
  end
159
198
  end
160
199
 
@@ -219,6 +258,8 @@ module Ruby2D
219
258
  case o
220
259
  when nil
221
260
  raise Error, "Cannot add '#{o.class}' to window!"
261
+ when Entity
262
+ @entities.push(o)
222
263
  when Array
223
264
  o.each { |x| add_object(x) }
224
265
  else
@@ -232,8 +273,9 @@ module Ruby2D
232
273
  raise Error, "Cannot remove '#{o.class}' from window!"
233
274
  end
234
275
 
235
- if i = @objects.index(o)
236
- @objects.delete_at(i)
276
+ collection = o.class.ancestors.include?(Ruby2D::Entity) ? @entities : @objects
277
+ if i = collection.index(o)
278
+ collection.delete_at(i)
237
279
  true
238
280
  else
239
281
  false
@@ -243,14 +285,21 @@ module Ruby2D
243
285
  # Clear all objects from the window
244
286
  def clear
245
287
  @objects.clear
288
+ @entities.clear
246
289
  end
247
290
 
248
- # Set an update callback
291
+ # Set the update callback
249
292
  def update(&proc)
250
293
  @update_proc = proc
251
294
  true
252
295
  end
253
296
 
297
+ # Set the render callback
298
+ def render(&proc)
299
+ @render_proc = proc
300
+ true
301
+ end
302
+
254
303
  # Generate a new event key (ID)
255
304
  def new_event_key
256
305
  @event_key = @event_key.next
@@ -271,6 +320,21 @@ module Ruby2D
271
320
  @events[event_descriptor.type].delete(event_descriptor.id)
272
321
  end
273
322
 
323
+ # Key down event method for class pattern
324
+ def key_down(key)
325
+ @keys_down.include? key
326
+ end
327
+
328
+ # Key held event method for class pattern
329
+ def key_held(key)
330
+ @keys_held.include? key
331
+ end
332
+
333
+ # Key up event method for class pattern
334
+ def key_up(key)
335
+ @keys_up.include? key
336
+ end
337
+
274
338
  # Key callback method, called by the native and web extentions
275
339
  def key_callback(type, key)
276
340
  key = key.downcase
@@ -283,22 +347,66 @@ module Ruby2D
283
347
  case type
284
348
  # When key is pressed, fired once
285
349
  when :down
350
+ # For class pattern
351
+ unless @using_dsl
352
+ unless @keys_down.include? key
353
+ @keys_down << key
354
+ end
355
+ end
356
+
357
+ # Call event handler
286
358
  @events[:key_down].each do |id, e|
287
359
  e.call(KeyEvent.new(type, key))
288
360
  end
289
361
  # When key is being held down, fired every frame
290
362
  when :held
363
+ # For class pattern
364
+ unless @using_dsl
365
+ unless @keys_held.include? key
366
+ @keys_held << key
367
+ end
368
+ end
369
+
370
+ # Call event handler
291
371
  @events[:key_held].each do |id, e|
292
372
  e.call(KeyEvent.new(type, key))
293
373
  end
294
374
  # When key released, fired once
295
375
  when :up
376
+ # For class pattern
377
+ unless @using_dsl
378
+ unless @keys_up.include? key
379
+ @keys_up << key
380
+ end
381
+ end
382
+
383
+ # Call event handler
296
384
  @events[:key_up].each do |id, e|
297
385
  e.call(KeyEvent.new(type, key))
298
386
  end
299
387
  end
300
388
  end
301
389
 
390
+ # Mouse down event method for class pattern
391
+ def mouse_down(btn)
392
+ @mouse_buttons_down.include? btn
393
+ end
394
+
395
+ # Mouse up event method for class pattern
396
+ def mouse_up(btn)
397
+ @mouse_buttons_up.include? btn
398
+ end
399
+
400
+ # Mouse scroll event method for class pattern
401
+ def mouse_scroll
402
+ @mouse_scroll_event
403
+ end
404
+
405
+ # Mouse move event method for class pattern
406
+ def mouse_move
407
+ @mouse_move_event
408
+ end
409
+
302
410
  # Mouse callback method, called by the native and web extentions
303
411
  def mouse_callback(type, button, direction, x, y, delta_x, delta_y)
304
412
  # All mouse events
@@ -309,21 +417,54 @@ module Ruby2D
309
417
  case type
310
418
  # When mouse button pressed
311
419
  when :down
420
+ # For class pattern
421
+ unless @using_dsl
422
+ unless @mouse_buttons_down.include? button
423
+ @mouse_buttons_down << button
424
+ end
425
+ end
426
+
427
+ # Call event handler
312
428
  @events[:mouse_down].each do |id, e|
313
429
  e.call(MouseEvent.new(type, button, nil, x, y, nil, nil))
314
430
  end
315
431
  # When mouse button released
316
432
  when :up
433
+ # For class pattern
434
+ unless @using_dsl
435
+ unless @mouse_buttons_up.include? button
436
+ @mouse_buttons_up << button
437
+ end
438
+ end
439
+
440
+ # Call event handler
317
441
  @events[:mouse_up].each do |id, e|
318
442
  e.call(MouseEvent.new(type, button, nil, x, y, nil, nil))
319
443
  end
320
444
  # When mouse motion / movement
321
445
  when :scroll
446
+ # For class pattern
447
+ unless @using_dsl
448
+ @mouse_scroll_event = true
449
+ @mouse_scroll_direction = direction
450
+ @mouse_scroll_delta_x = delta_x
451
+ @mouse_scroll_delta_y = delta_y
452
+ end
453
+
454
+ # Call event handler
322
455
  @events[:mouse_scroll].each do |id, e|
323
456
  e.call(MouseEvent.new(type, nil, direction, nil, nil, delta_x, delta_y))
324
457
  end
325
458
  # When mouse scrolling, wheel or trackpad
326
459
  when :move
460
+ # For class pattern
461
+ unless @using_dsl
462
+ @mouse_move_event = true
463
+ @mouse_move_delta_x = delta_x
464
+ @mouse_move_delta_y = delta_y
465
+ end
466
+
467
+ # Call event handler
327
468
  @events[:mouse_move].each do |id, e|
328
469
  e.call(MouseEvent.new(type, nil, nil, x, y, delta_x, delta_y))
329
470
  end
@@ -337,6 +478,21 @@ module Ruby2D
337
478
  end
338
479
  end
339
480
 
481
+ # Controller axis event method for class pattern
482
+ def controller_axis(axis)
483
+ @controller_axes_moved.include? axis
484
+ end
485
+
486
+ # Controller button down event method for class pattern
487
+ def controller_button_down(btn)
488
+ @controller_buttons_down.include? btn
489
+ end
490
+
491
+ # Controller button up event method for class pattern
492
+ def controller_button_up(btn)
493
+ @controller_buttons_up.include? btn
494
+ end
495
+
340
496
  # Controller callback method, called by the native and web extentions
341
497
  def controller_callback(which, type, axis, value, button)
342
498
  # All controller events
@@ -347,16 +503,56 @@ module Ruby2D
347
503
  case type
348
504
  # When controller axis motion, like analog sticks
349
505
  when :axis
506
+
507
+ # For class pattern
508
+ unless @using_dsl
509
+ @controller_id = which
510
+
511
+ unless @controller_axes_moved.include? axis
512
+ @controller_axes_moved << axis
513
+ end
514
+
515
+ case axis
516
+ when :left_x
517
+ @controller_axis_left_x = value
518
+ when :left_y
519
+ @controller_axis_left_y = value
520
+ when :right_x
521
+ @controller_axis_right_x = value
522
+ when :right_y
523
+ @controller_axis_right_y = value
524
+ end
525
+ end
526
+
527
+ # Call event handler
350
528
  @events[:controller_axis].each do |id, e|
351
529
  e.call(ControllerAxisEvent.new(which, axis, value))
352
530
  end
353
531
  # When controller button is pressed
354
532
  when :button_down
533
+ # For class pattern
534
+ unless @using_dsl
535
+ @controller_id = which
536
+ unless @controller_buttons_down.include? button
537
+ @controller_buttons_down << button
538
+ end
539
+ end
540
+
541
+ # Call event handler
355
542
  @events[:controller_button_down].each do |id, e|
356
543
  e.call(ControllerButtonEvent.new(which, button))
357
544
  end
358
545
  # When controller button is released
359
546
  when :button_up
547
+ # For class pattern
548
+ unless @using_dsl
549
+ @controller_id = which
550
+ unless @controller_buttons_up.include? button
551
+ @controller_buttons_up << button
552
+ end
553
+ end
554
+
555
+ # Call event handler
360
556
  @events[:controller_button_up].each do |id, e|
361
557
  e.call(ControllerButtonEvent.new(which, button))
362
558
  end
@@ -365,8 +561,17 @@ module Ruby2D
365
561
 
366
562
  # Update callback method, called by the native and web extentions
367
563
  def update_callback
564
+ unless @using_dsl
565
+ update
566
+ end
567
+
368
568
  @update_proc.call
369
569
 
570
+ # Run update method on all entities
571
+ @entities.each do |e|
572
+ e.update
573
+ end
574
+
370
575
  # Accept and eval commands if in console mode
371
576
  if @console
372
577
  if STDIN.ready?
@@ -385,10 +590,42 @@ module Ruby2D
385
590
  end
386
591
  end
387
592
 
593
+ # Clear inputs if using class pattern
594
+ unless @using_dsl
595
+ @keys_down.clear
596
+ @keys_held.clear
597
+ @keys_up.clear
598
+ @mouse_buttons_down.clear
599
+ @mouse_buttons_up.clear
600
+ @mouse_scroll_event = false
601
+ @mouse_move_event = false
602
+ @controller_axes_moved.clear
603
+ @controller_buttons_down.clear
604
+ @controller_buttons_up.clear
605
+ end
606
+ end
607
+
608
+ # Render callback method, called by the native and web extentions
609
+ def render_callback
610
+ unless @using_dsl
611
+ render
612
+ end
613
+
614
+ @render_proc.call
615
+
616
+ # Run render method on all entities
617
+ @entities.each do |e|
618
+ e.render
619
+ end
388
620
  end
389
621
 
390
622
  # Show the window
391
623
  def show
624
+ if @@open_window
625
+ raise Error, "Window#show called multiple times, Ruby2D only supports a single open window"
626
+ end
627
+
628
+ @@open_window = true
392
629
  ext_show
393
630
  end
394
631