Шукати в цьому блозі

Події



Події (Events) є головним механізмом реагування гри на все, що відбувається в грі і на дію користувача, вони дозволяють створювати інтерактивні додатки.
Всі події оголошуються командою EventDispatcher ([подія], [функція]) з 2-ма параметрами 1-сама подія і 2 функція яка буде виконуватися при подію.
У Gideros, події розділені на дві категорії:
-вбудовані події, які генеруються системою (наприклад ENTER_FRAME, подія сенсора, події таймера і т.д.)
-Користувальницькі події, які можуть бути створені користувачем.

ENTER_FRAME подія

Це вбудоване подія ENTER_FRAME виникає кожен кадр (фрейм) в грі в Gideros можна вибрати 2 режими 30фреймів в секунду або 60 командою Application:setFps (fps)

Приклад показує переміщення спрайту на піксель право кожен фрейм, тобто спрайт буде летіти вправо зі швидкістю 1піксель / 1фрейм

local sprite = Sprite.new() --Створюємо спрайт

sprite:addEventListener(Event.ENTER_FRAME, onEnterFrame) --Створюємо подія

--Функція виконується при подію ENTER_FRAME
local function onEnterFrame(event)
sprite:setX(sprite:getX() + 1) --Додаємо до координати X спрайту +1
end

Цей приклад перемістить 3 спрайти на 1 піксель за фрейм. Щоб не створювати функцію переміщення для кожного спрайту окремо і спрайти переміщалися не залежно один від одного - ми при створенні події додаємо 3й параметр вказуючий об'єкт для якого відбулася подія.

local sprite1 = Sprite.new()
local sprite2 = Sprite.new()
local sprite3 = Sprite.new()

sprite1:addEventListener(Event.ENTER_FRAME, onEnterFrame, sprite1) -- 3й параметр sprite1
sprite2:addEventListener(Event.ENTER_FRAME, onEnterFrame, sprite2)
sprite3:addEventListener(Event.ENTER_FRAME, onEnterFrame, sprite3)

local function onEnterFrame(self, event) -- В self в залежності від події передасться 3й параметр sprite1 або sprite2 або sprite3
self:setX(self:getX() + 1)
end

наступний приклад покаже як одним махом повісити події на всі екземпляри одного типу (класу)

MySprite = Core.class(Sprite) --Створюємо свій клас

--Функція ініціалізації буде виконуватися при створенні об'єкта і відразу навішувати події на об'єкти
function MySprite:init()
self:addEventListener(Event.ENTER_FRAME, self.onEnterFrame, self)
end


function MySprite:onEnterFrame(event)
self:setX(self:getX() + 1)
end

Порядок подій введення мишки і сенсора


Допустимо у вас в рівні 3 спрайту з встановленим подією на тач (натискання) по спрайту Event.TOUCHES_BEGIN
Http://docs.giderosmobile.com/reference/gideros/Sprite/Event.TOUCHES_BEGIN

Якщо в зону натискання потрапило кілька спрайтів (наприклад 2 спрайти один на одному) -то першим подія спрацює на самому верхньому спрайті, а самим верхнім спрайтом буде останній доданий в сцену.

Зупинити подію (розповсюдження)
Якщо нам потрібно щоб при натисканні подія спрацювало тільки на верхній спрайт і далі не спрацювало (поширюється) для нижніх використовуємо stopPropagation ()

-- Якщо потрібно зупинити подію мишки для MySprite пишемо:
MySprite:addEventListener(Event.MOUSE_DOWN, function(event) event:stopPropagation() end)


Події за таймером

Таймер використовується для створення події через інтервали часу. Кожен таймер створює подію Event.TIMER з певною періодичністю.

--Створюємо таймер на 1000мс=1секунда 5-раз
local timer = Timer.new(1000, 5)
--Створюємо подія таймера
timer:addEventListener(Event.TIMER, onTimer)
--запускаем таймер
timer:start()

local function onTimer(event)
-- Ця функція виконається 5 разів з інтервалом 1000мс
end

Зупинити таймер можна командою:

timer:stop()

Після закінчення зазначеної кількості подій таймера виникне вбудована подія TIMER_COMPLETE:

timer:addEventListener(Event.TIMER_COMPLETE, onTimerComplete)

local function onTimerComplete(event)
-- Запуститься після того як все 5раз таймер спрацюють
end

Можна ставити на паузу все таймери в вашому додатку. Це дуже корисно, коли вам потрібно призупинити гру.

Timer.pauseAllTimers() -- Призупинити всі таймери.
Timer.resumeAllTimers() -- Відновити всі таймери.


Події додавання і видалення об'єкта в ігровий рівень


Якщо спрайт додається в гру, виникає подія ADDED_TO_STAGE, якщо спрайт видаляється виникає подія REMOVED_FROM_STAGE. Ці події використовуються для виявлення, коли екземпляри спрайтів додається або видаляється з, ігрового рівня. За допомогою цього можна змусити подію. ENTER_FRAME спрацьовувати тільки для спрайтів, які знаходяться в грі:

MySprite = Core.class(Sprite)

function MySprite:init()
self:addEventListener(Event.ADDED_TO_STAGE, self.onAddedToStage, self)
self:addEventListener(Event.REMOVED_FROM_STAGE, self.onRemovedFromStage, self)
end

--Додаємо подію
function MySprite:onAddedToStage(event)
self:addEventListener(Event.ENTER_FRAME, self.onEnterFrame, self)
end

--Видаляємо подію при видаленні об'єкта з гри
function MySprite:onRemovedFromStage(event)
self:removeEventListener(Event.ENTER_FRAME, self.onEnterFrame, self)
end

function MySprite:onEnterFrame(event)
--Виконується кожен фрейм
end

Користувацькі події

ClassA = Core.class(EventDispatcher)
ClassB = Core.class(EventDispatcher)

local a = ClassA.new()
local b = ClassB.new()

b:addEventListener("myevent", a.funcA, a) -- Створюємо своє подію myevent

b:dispatchEvent(Event.new("myevent")) -- Викликаємо подію myevent

function ClassA:funcA(event)
print("funcA", self, event:getType(), event:getTarget())
end













3

Немає коментарів:

Дописати коментар