Опрацювання подій у 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