Опрацювання подій у Ruby2d

Ruby 2D забезпечує спосіб захоплення та реагування на події, породжені за допомогою миші, клавіатури або контролера гри.

Натискання клавіші миш породжує подію mouse_down,
Відпускання клавіші миші породжує подію mouse_up — див. приклад.

require 'ruby2d'
on :mouse_down do |e|
  puts "Перехоплено подію натискання клавіші миші!"
end
on :mouse_up do |e|
  puts "Перехоплено подію відпускання клавіші миші!"
end
show

Тут об'єкт е — об'єкт класу MouseEvent з такими властивостями (значення вказано після тире):

Рух миші породжує подію mouse_move. Просте використання цієї події має такий вигляд:

require 'ruby2d'
on :mouse_move do |e|
  puts "Перехоплено рух миші!"
end
show

Тут об'єкт е — об'єкт класу MouseEvent з такими властивостями (значення вказано після тире):

Прокручування коліщатка породжує подію mouse_scroll, яку можна використати, наприклад, таким чином:

require 'ruby2d'
on :mouse_scroll do |e|
  puts "Перехоплено подію прокручування коліщатка!"
end
show

Об'єкт e класу MouseEvent цієї події матиме такі властивості (значення вказано після тире):

Події, породжені діями з клавіатурою:

— див. приклад.

require 'ruby2d'

on :key_down do |e|
  puts "#{e.key} було натиснуто!"
end

on :key_held do |e|
  puts "#{e.key} утримано!"
end

on :key_up do |e|
  puts "#{e.key} відпущено!"
end

show

У цьому випадку е — об'єкт KeyEvent — матиме лише такі 2 властивості (значення вказано після тире):

Налаштування кількох обробників подій проілюструємо таким прикладом:

require 'ruby2d'

on :mouse_down do
  puts "Перше повідомлення!"
end

on :mouse_down do
  puts "Друге повідомлення!"
end

on :mouse_down do
  puts "Третє повідомлення!"
end

show

Кожного разу, коли буде натиснуто кнопку миші, повідомлення надходитимуть у тому порядку, в якому їх описано. При цьому кількість обробників подій не обмежено.

Видалення подій здійснюють тоді, коли використовувати ця подію вже не потрібно. Визначення on обробника події повертає об'єкт класу EventDescriptor. Щоб видалити подію, потрібно передати цей опис методу off — див. приклад:

require 'ruby2d'

event_descriptor = on :mouse_down do
  puts "Трапилася подія mouse_down!"
end

off(event_descriptor)# виконати незакоментованим і закоментованим
show

Динамічне налаштування обробників подій зсередини методів і класів за допомогою розширення класу доменно-специфічною мовою DSL (англійською domain-specific language) полягає у використанні extend Ruby2D::DSL у методі initialize класу. У поданому далі прикладі кожне клацання лівою кнопкою миші призведе до створення квадрату зеленого кольору. При наведенні на такий квадрат вказівника миші квадрат змінює колір із зеленого на червоний і зникає при натисканні правої кнопки миші.

require 'ruby2d'

interactive_squares = []

class InteractiveSquare
  def initialize(x, y)
    extend Ruby2D::DSL
    @square = Square.new(x: x, y: y, color: "green")
    @hover_event = on :mouse_move do |e|
      if @square.contains?(e.x, e.y)
        @square.color = "red"
      else
        @square.color = "green"
      end
    end

    @remove_event = on :mouse_up do |e|
      if e.button == :right
        if @square.contains?(e.x, e.y)
          self.remove
        end
      end
    end
  end

  def remove
    @square.remove
    off(@hover_event)
    off(@remove_event)
  end
end

on :mouse_down do |e|
  if e.button == :left
    interactive_squares << InteractiveSquare.new(e.x, e.y)
  end
end

show