module DXOpal::Input
Constants
- ON_KEYDOWN_
(private) JS keydown event handler
- ON_KEYUP_
(private) JS keyup event handler
Public Class Methods
Internal setup for Input
class
# File lib/dxopal/input.rb, line 15 def self._init(canvas) @@tick = 0 @@pressing_keys = `new Object()` @@mouse_info = `{x: 0, y: 0}` @@pressing_mouse_buttons = `new Object()` @@touch_info = `{x: 0, y: 0}` @@pressing_touch = `new Object()` @@canvas = canvas rect = `canvas.getBoundingClientRect()` @@canvas_x = `rect.left + window.pageXOffset` @@canvas_y = `rect.top + window.pageYOffset` self._init_mouse_events self._init_touch_events self.keyevent_target = `window` unless Input.keyevent_target end
(internal) initialize mouse events
# File lib/dxopal/input.rb, line 120 def self._init_mouse_events %x{ document.addEventListener('mousemove', function(ev){ #{@@mouse_info}.x = ev.pageX - #{@@canvas_x}; #{@@mouse_info}.y = ev.pageY - #{@@canvas_y}; }); document.addEventListener('mousedown', function(ev){ #{@@mouse_info}.x = ev.pageX - #{@@canvas_x}; #{@@mouse_info}.y = ev.pageY - #{@@canvas_y}; for (var k=1; k<=16; k<<=1) { if (ev.buttons & k) { #{@@pressing_mouse_buttons}[k] = #{@@tick}; } } }); document.addEventListener('mouseup', function(ev){ #{@@mouse_info}.x = ev.pageX - #{@@canvas_x}; #{@@mouse_info}.y = ev.pageY - #{@@canvas_y}; // ev.button => ev.buttons table = { 0: 1, 1: 4, 2: 2, 3: 8, 4: 16 }; for (var k=1; k<=16; k<<=1) { if (#{@@pressing_mouse_buttons}[k]) { #{@@pressing_mouse_buttons}[table[ev.button]] = -#{@@tick}; } } }); } end
(internal) initialize touch events
# File lib/dxopal/input.rb, line 185 def self._init_touch_events @@touches = {} @@new_touches = [] %x{ #{@@canvas}.addEventListener('touchmove', function(ev){ ev.preventDefault(); ev.stopPropagation(); #{@@touch_info}.x = ev.changedTouches[0].pageX - #{@@canvas_x}; #{@@touch_info}.y = ev.changedTouches[0].pageY - #{@@canvas_y}; for (var touch of ev.changedTouches) { const id = touch.identifier; const x = touch.pageX - #{@@canvas_x}; const y = touch.pageY - #{@@canvas_y}; #{@@touches[`id`]&._move(`x`, `y`)} } }); #{@@canvas}.addEventListener('touchstart', function(ev){ ev.preventDefault(); ev.stopPropagation(); #{@@touch_info}.x = ev.changedTouches[0].pageX - #{@@canvas_x}; #{@@touch_info}.y = ev.changedTouches[0].pageY - #{@@canvas_y}; #{@@pressing_touch}[0] = #{@@tick}; for (var touch of ev.changedTouches) { const id = touch.identifier; const x = touch.pageX - #{@@canvas_x}; const y = touch.pageY - #{@@canvas_y}; #{ new_touch = Touch.new(`id`, `x`, `y`) @@touches[`id`] = new_touch @@new_touches.push(new_touch) } } }); #{@@canvas}.addEventListener('touchend', function(ev){ ev.preventDefault(); ev.stopPropagation(); #{@@touch_info}.x = ev.changedTouches[0].pageX - #{@@canvas_x}; #{@@touch_info}.y = ev.changedTouches[0].pageY - #{@@canvas_y}; #{@@pressing_touch}[0] = -#{@@tick}; for (var touch of ev.changedTouches) { const id = touch.identifier; #{@@touches[`id`]&._released(@@tick)} } }); } end
Called on every frame from Window
# File lib/dxopal/input.rb, line 34 def self._on_tick @@tick += 1 self._update_touch_info end
# File lib/dxopal/input.rb, line 12 def self._pressing_keys; @@pressing_keys; end
# File lib/dxopal/input.rb, line 232 def self._update_touch_info # Clear old data @@touches.delete_if{|id, t| t.released? && t._released_at < @@tick-1} end
Return true if the key is being pressed
# File lib/dxopal/input.rb, line 60 def self.key_down?(code) return `#{@@pressing_keys}[code] > 0` end
Return true if the key is just pressed
# File lib/dxopal/input.rb, line 65 def self.key_push?(code) return `#{@@pressing_keys}[code] == #{@@tick}-1` end
Return true if the key is just released
# File lib/dxopal/input.rb, line 70 def self.key_release?(code) return `#{@@pressing_keys}[code] == -(#{@@tick}-1)` end
Return DOM element set by `keyevent_target=`
# File lib/dxopal/input.rb, line 113 def self.keyevent_target; @@keyevent_target; end
Set DOM element to receive keydown/keyup event
By default, `window` is set to this (i.e. all key events are stolen by DXOpal
.) If canvas element is set to this, only key events happend on canvas are processed by DXOpal
.
# File lib/dxopal/input.rb, line 95 def self.keyevent_target=(target) if @@keyevent_target %x{ #{@@keyevent_target}.removeEventListener('keydown', #{ON_KEYDOWN_}); #{@@keyevent_target}.removeEventListener('keyup', #{ON_KEYUP_}); } end @@keyevent_target = target %x{ if (#{@@keyevent_target}.tagName == "CANVAS") { #{@@keyevent_target}.setAttribute('tabindex', 0); } #{@@keyevent_target}.addEventListener('keydown', #{ON_KEYDOWN_}); #{@@keyevent_target}.addEventListener('keyup', #{ON_KEYUP_}); } end
Return true if the mouse button is being pressed
# File lib/dxopal/input.rb, line 163 def self.mouse_down?(mouse_code) raise "missing argument of `mouse_down?'" unless mouse_code return `#{@@pressing_mouse_buttons}[mouse_code] > 0` end
Return true if the mouse button is pressed in the last tick
# File lib/dxopal/input.rb, line 169 def self.mouse_push?(mouse_code) raise "missing argument of `mouse_push?'" unless mouse_code return `#{@@pressing_mouse_buttons}[mouse_code] == -(#{@@tick}-1)` end
Return true if the mouse button is released in the last tick
# File lib/dxopal/input.rb, line 175 def self.mouse_release?(mouse_code) raise "missing argument of `mouse_release?'" unless mouse_code return `#{@@pressing_mouse_buttons}[mouse_code] == -(#{@@tick}-1)` end
Return position of mouse cursor (0, 0) is the top-left corner of the canvas
# File lib/dxopal/input.rb, line 151 def self.mouse_x return `#{@@mouse_info}.x` end
# File lib/dxopal/input.rb, line 154 def self.mouse_y return `#{@@mouse_info}.y` end
Returns newly created touches
# File lib/dxopal/input.rb, line 309 def self.new_touches ret = @@new_touches @@new_touches = [] ret end
Return true if the touch is being pressed
# File lib/dxopal/input.rb, line 255 def self.touch_down? return `#{@@pressing_touch}[0] > 0` end
Return true if the touch is pressed in the last tick
# File lib/dxopal/input.rb, line 260 def self.touch_push? return `#{@@pressing_touch}[0] == -(#{@@tick}-1)` end
Return true if the touch is released in the last tick
# File lib/dxopal/input.rb, line 265 def self.touch_release? return `#{@@pressing_touch}[0] == -(#{@@tick}-1)` end
Return position of touch (0, 0) is the top-left corner of the canvas
# File lib/dxopal/input.rb, line 243 def self.touch_x return `#{@@touch_info}.x` end
# File lib/dxopal/input.rb, line 246 def self.touch_y return `#{@@touch_info}.y` end
Returns current touches as an array of Input::Touch
# File lib/dxopal/input.rb, line 304 def self.touches @@touches.values end
Return 1 if 'right', -1 if 'left'
# File lib/dxopal/input.rb, line 40 def self.x(pad_number=0) ret = 0 ret += 1 if key_down?(K_RIGHT) ret -= 1 if key_down?(K_LEFT) ret end
Return 1 if 'down', -1 if 'up'
# File lib/dxopal/input.rb, line 48 def self.y(pad_number=0) ret = 0 ret += 1 if key_down?(K_DOWN) ret -= 1 if key_down?(K_UP) ret end