module DXOpal::Input

Constants

ON_KEYDOWN_

(private) JS keydown event handler

ON_KEYUP_

(private) JS keyup event handler

Public Class Methods

_init(canvas) click to toggle source

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
_init_mouse_events() click to toggle source

(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
_init_touch_events() click to toggle source

(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
_on_tick() click to toggle source

Called on every frame from Window

# File lib/dxopal/input.rb, line 34
def self._on_tick
  @@tick += 1
  self._update_touch_info
end
_pressing_keys() click to toggle source
# File lib/dxopal/input.rb, line 12
def self._pressing_keys; @@pressing_keys; end
_update_touch_info() click to toggle source
# 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
key_down?(code) click to toggle source

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
key_push?(code) click to toggle source

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
key_release?(code) click to toggle source

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
keyevent_target() click to toggle source

Return DOM element set by `keyevent_target=`

# File lib/dxopal/input.rb, line 113
def self.keyevent_target; @@keyevent_target; end
keyevent_target=(target) click to toggle source

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
mouse_down?(mouse_code) click to toggle source

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
mouse_pos_x()
Alias for: mouse_x
mouse_pos_y()
Alias for: mouse_y
mouse_push?(mouse_code) click to toggle source

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
mouse_release?(mouse_code) click to toggle source

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
mouse_x() click to toggle source

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
Also aliased as: mouse_pos_x
mouse_y() click to toggle source
# File lib/dxopal/input.rb, line 154
def self.mouse_y
  return `#{@@mouse_info}.y`
end
Also aliased as: mouse_pos_y
new_touches() click to toggle source

Returns newly created touches

# File lib/dxopal/input.rb, line 309
def self.new_touches
  ret = @@new_touches
  @@new_touches = []
  ret
end
touch_down?() click to toggle source

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
touch_pos_x()
Alias for: touch_x
touch_pos_y()
Alias for: touch_y
touch_push?() click to toggle source

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
touch_release?() click to toggle source

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
touch_x() click to toggle source

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
Also aliased as: touch_pos_x
touch_y() click to toggle source
# File lib/dxopal/input.rb, line 246
def self.touch_y
  return `#{@@touch_info}.y`
end
Also aliased as: touch_pos_y
touches() click to toggle source

Returns current touches as an array of Input::Touch

# File lib/dxopal/input.rb, line 304
def self.touches
  @@touches.values
end
x(pad_number=0) click to toggle source

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
y(pad_number=0) click to toggle source

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