class AdventureRL::EventHandlers::Buttons

Constants

BUTTON_EVENT_HANDLERS

This constant will be filled with EventHandlers::Buttons and EventHandlers::MouseButtons instances as they are created. It is used by the following class methods EventHandler::Buttons#button_down, EventHandler::Buttons#button_up, and EventHandler::Buttons#update.

DEFAULT_SETTINGS

Public Class Methods

button_down(btnid) click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 13
def self.button_down btnid
  BUTTON_EVENT_HANDLERS.each do |handler|
    handler.button_down btnid
  end
end
button_up(btnid) click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 18
def self.button_up btnid
  BUTTON_EVENT_HANDLERS.each do |handler|
    handler.button_up btnid
  end
end
new(settings = {}) click to toggle source
Calls superclass method
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 32
def initialize settings = {}
  @settings = DEFAULT_SETTINGS.merge settings
  super
  @pressable_buttons = []
  pressable_buttons = [@settings.get(:pressable_buttons)].flatten
  add_pressable_button pressable_buttons  if (pressable_buttons.any?)
  @events = get_events
  BUTTON_EVENT_HANDLERS << self  if (@settings.get(:auto_update))
end
update() click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 23
def self.update
  BUTTON_EVENT_HANDLERS.each &:update
end

Public Instance Methods

add_pressable_button(*btns) click to toggle source

Add one or multiple button character(s) btns, which will trigger the on_button_press methods on subscribed objects, when the given button is being pressed. Instead of passing single alphanumeric strings / symbols, you can pass hashes, whose keys will be passed to the on_button_press methods, when any of its values are pressed. Case-sensitive.

# File lib/AdventureRL/EventHandlers/Buttons.rb, line 49
def add_pressable_button *btns
  btns.flatten.each do |button|
    if (button.is_a?(Symbol) || button.is_a?(String))
      validate_button button
      btnids = [Gosu.char_to_button_id(button), get_button_constants(button)].flatten.compact
      pressable_button = {
        name: button,
        ids:  btnids
      }
      @pressable_buttons << pressable_button  unless (@pressable_buttons.include? pressable_button)
    elsif (button.is_a?(Hash))
      button.each do |btn_name, btn_buttons|
        pressable_button = {
          name: btn_name,
          ids:  [btn_buttons].flatten.map do |btn|
            validate_button btn
            next [Gosu.char_to_button_id(btn), get_button_constants(btn)].compact
          end .flatten
        }
        @pressable_buttons << pressable_button  unless (@pressable_buttons.include? pressable_button)
      end
    end
  end
end
Also aliased as: add_pressable_buttons
add_pressable_buttons(*btns)
button_down(btnid) click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 75
def button_down btnid
  trigger(
    :button_down,
    get_semantic_button_name(btnid),
    shift:   shift_button_pressed?,
    control: control_button_pressed?,
    alt:     alt_button_pressed?
  )
end
button_up(btnid) click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 85
def button_up btnid
  trigger(
    :button_up,
    get_semantic_button_name(btnid),
    shift:   shift_button_pressed?,
    control: control_button_pressed?,
    alt:     alt_button_pressed?
  )
end
get_pressable_buttons() click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 113
def get_pressable_buttons
  return @pressable_buttons
end
update() click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 95
def update
  return  unless (get_pressable_buttons.any?)
  pressed_btns = get_pressable_buttons.map do |btn|
    next btn[:name]  if (btn[:ids].any? { |id| Gosu.button_down?(id) })
    next nil
  end .compact.uniq
  return  unless (pressed_btns.any?)
  pressed_btns.each do |btn|
    trigger(
      :button_press,
      btn,
      shift:   shift_button_pressed?,
      control: control_button_pressed?,
      alt:     alt_button_pressed?
    )
  end
end

Private Instance Methods

alt_button_pressed?() click to toggle source

Returns true if either LEFT_ALT or RIGHT_ALT is pressed, returns false otherwise.

# File lib/AdventureRL/EventHandlers/Buttons.rb, line 222
def alt_button_pressed?
  return Gosu.button_down?(Gosu::KB_LEFT_ALT) || Gosu.button_down?(Gosu::KB_RIGHT_ALT)
end
control_button_pressed?() click to toggle source

Returns true if either LEFT_CONTROL or RIGHT_CONTROL is pressed, returns false otherwise.

# File lib/AdventureRL/EventHandlers/Buttons.rb, line 216
def control_button_pressed?
  return Gosu.button_down?(Gosu::KB_LEFT_CONTROL) || Gosu.button_down?(Gosu::KB_RIGHT_CONTROL)
end
get_button_constants(btn) click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 182
def get_button_constants btn
  return Gosu.constants.map do |constant_name|
    constant = Gosu.const_get constant_name
    next constant  if (constant_name.to_s.sub(/^(KB_|MS_|GP_)/,'').downcase == btn.downcase && constant_name.match?(/_/))
    next nil
  end .flatten.compact
end
get_event_button_down() click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 127
def get_event_button_down
  event = Events::Event.new(:button_down)
  event.on_trigger do |object, btn_name, mod_keys|
    next  unless (object.methods.include? :on_button_down)
    case object.method(:on_button_down).arity.abs
    when 0
      object.on_button_down
    when 1
      object.on_button_down btn_name
    when 2
      object.on_button_down btn_name, mod_keys
    end
  end
  return event
end
get_event_button_press() click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 159
def get_event_button_press
  event = Events::Event.new(:button_press)
  event.on_trigger do |object, btn_name, mod_keys|
    next  unless (object.methods.include? :on_button_press)
    case object.method(:on_button_press).arity.abs
    when 0
      object.on_button_press
    when 1
      object.on_button_press btn_name
    when 2
      object.on_button_press btn_name, mod_keys
    end
  end
  return event
end
get_event_button_up() click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 143
def get_event_button_up
  event = Events::Event.new(:button_up)
  event.on_trigger do |object, btn_name, mod_keys|
    next  unless (object.methods.include? :on_button_up)
    case object.method(:on_button_up).arity.abs
    when 0
      object.on_button_up
    when 1
      object.on_button_up btn_name
    when 2
      object.on_button_up btn_name, mod_keys
    end
  end
  return event
end
get_events() click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 119
def get_events
  return [
    get_event_button_down,
    get_event_button_up,
    get_event_button_press
  ]
end
get_semantic_button_name(btnid) click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 190
def get_semantic_button_name btnid
  pressable_button = get_pressable_buttons.detect do |pressable_button|
    next pressable_button[:ids].include?(btnid)
  end
  return pressable_button[:name]  if (pressable_button)
  btn_char = Gosu.button_id_to_char btnid
  return get_semantic_constant_button_name btnid  if (btn_char.empty?)
  return btn_char.to_sym
end
get_semantic_constant_button_name(btnid) click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 200
def get_semantic_constant_button_name btnid
  return Gosu.constants.map do |constant_name|
    constant = Gosu.const_get constant_name
    next constant_name.to_s.sub(/^(KB_|MS_|GP_)/,'').downcase.to_sym  if (constant == btnid && constant_name.match?(/_/))
    next nil
  end .compact.first
end
shift_button_pressed?() click to toggle source

Returns true if either LEFT_SHIFT or RIGHT_SHIFT is pressed, returns false otherwise.

# File lib/AdventureRL/EventHandlers/Buttons.rb, line 210
def shift_button_pressed?
  return Gosu.button_down?(Gosu::KB_LEFT_SHIFT) || Gosu.button_down?(Gosu::KB_RIGHT_SHIFT)
end
valid_object?(object) click to toggle source

Subscribing objects must be a Mask or have a Mask assigned to them.

# File lib/AdventureRL/EventHandlers/Buttons.rb, line 227
def valid_object? object
  ret = object.has_mask?  rescue false
  return ret
end
validate_button(btn) click to toggle source
# File lib/AdventureRL/EventHandlers/Buttons.rb, line 175
def validate_button btn
  Helpers::Error.error(
    "Passed invalid button character. Expected a printable alphanumeric, but got",
    "`#{btn.inspect}:#{btn.class.name}'."
  )  unless (Gosu.char_to_button_id(btn) || get_button_constants(btn))
end