Войти
K5EngineСтатьи

Система событий движка (K5Engine 1)

Автор:

Система событий движка

Система событий состоит из двух компонентов: очередь и структура-событие. Устройство генерирует в указанную очередь описания того или иного события, произошедшего в системе. Это может быть событие тика таймера, движения или клика мышки, нажатие на клавишу клавиатуры, потеря фокуса окна.

Как работать с системой событий

Для начала надо создать событийную очередь — TEventDeque и передать устройству указатель на неё:

TEventDeque EventDeque;
Device.SetEventDeque(&EventDeque);

Далее в процессе работы приложения надо у устройства вызвать метод ProcessEvent(). Оно обработает события, произошедшие в системе за время рисования кадра и добавит в очередь на каждое событие структуру TEvent.
Далее в цикле выполняем извлечение событий и их обработку:

while(EventDeque.IsNotEmpty()){
  TEvent Event(EventDeque.Pop());
  ...
}

Типы и подтипы событий описаны в enum-типе enEventTypes, который находится в заголовочном файле enum_EventTypes.
По поводу организации описаний типов событий в  enEventTypes: в задании подтипов событий используется запись такого вида: например EN_SYSTEM в перечислении равна 1, тогда события, которые относятся к системным, в своём значении будут начинаться с единицы: EN_QUIT  = 100, EN_ACTIVATE = 102, EN_DEACTIVATE = 103 и так далее.

Для того, что бы узнать, какой тип события произошёл, надо проверить значение переменной Type у  TEvent:
EN_NONE — нет события, данный параметр не должен появляться у события, извлечённого из очереди, но он по умолчанию присваивается новому экземпляру  TEvent
EN_SYSTEM  — системное событие, такое как потеря фокуса, изменения размера окна, закрытие окна.
EN_KEYBOARD — события клавиатуры: нажатия на клавиши
EN_MOUSE — события мыши: движение, клики
EN_TIMER — событие тика таймера, время указывается в миллисекундах 
EN_USER — события пользователя, в данный момент не используется

Код событий может выглядеть так:

while(EventDeque.IsNotEmpty()){

  TEvent Event(EventDeque.Pop());

  switch(Event.Type){
    case EN_TIMER:{}break;
    case EN_SYSTEM:{}break;
    case EN_KEYBOARD:{}break;
    case EN_MOUSE:{}break;
    default:break;
  }
}

Далее в зависимости от типа произошедшего события нужно выполнить те или иные действия.
TEvent имеет вложенные структуры для каждого типа события:
TSystemEvent System — параметры системного события
TKeyboardEvent Keyboard — параметры события клавиатуры
TMouseEvent Mouse — параметры события мыши
TTimerEvent Timer — таймер

TSystemEvent

Структура имеет такие параметры:

enEventTypes Type — тип системного события, принимает значения:
  EN_QUIT — закрытие окна
  EN_WINDOWRESIZE — изменение размера окна
  EN_ACTIVATE — окно стало активно
  EN_DEACTIVATE — окно стало не активно
  EN_PAINT — перерисовка окна, выполняется при не активном окне
  EN_MINIMIZE — событие сворачивания окна
  EN_RESTORE — событие восстановления окна

int  WindowWidth — новая ширина окна, приходит при изменении размера окна
int  WindowHeight — новая высота окна, приходит при изменении размера окна

TKeyboardEvent

Структура имеет такие параметры:

enEventTypes Type — тип клавиатурного события. Может принимать такие значения:
  EN_KEYDOWN — кнопка нажата
  EN_KEYUP — кнопка отжата

enEventTypes Key — вируальный код клавиши, которая нажата. Список большой и него нет смысла здесь приводить. Коды начинаются с префикса EN_KEY_ и буквы, цифры или сокращения  клавиши на английском языке, например: EN_KEY_A, EN_KEY_K, EN_KEY_9,  EN_KEY_MINUS

wchar_t Symbol — реальный символ, который был введён с клавиатуры. Символ приходит толко при событиии  EN_KEYDOWN

TMouseEvent

enEventTypes Type — тип события мыши. Может принимать такие значения:
  EN_MOUSEMOTION — движение мыши
  EN_MOUSEBUTTONDOWN — кнопка мыши нажата
  EN_MOUSEBUTTONUP — кнопка мыши отпущена

enEventTypes Button — кнопка мыши, которая была нажата, значение задаётся при  EN_MOUSEBUTTONUP и EN_MOUSEBUTTONDOWN и принимает такие значения:
  EN_MOUSEBUTTONLEFT — левая кнопка
  EN_MOUSEBUTTONMIDDLE — кнопка по середние
  EN_MOUSEBUTTONRIGHT — правая кнопка

int X — координата курсора по оси X экрана
int Y — координата курсора по оси Y экрана

TTimerEvent

Событие таймера, имеет два параметра: Sec, Ms. Sec — сколько прошло секунд с последнего тика таймера,  Ms — сколько прошло миллисекунд. Можно использовать любой по своему усмотрению. Введено два параметра, так как например в физике удобнее оперировать секундами.
Так же в базовом устройстве (TBaseDevice) есть метод для установки минимального времени генерации события таймера — SetTimerEventDelay(const float &Val), принимает количество миллисекунд, по прошествии которых будет создано событие таймера. Наиболее оптимальные значения — 20, 25, 30 миллисекунд. Что бы отключить данную возможность, достаточно передать 0 в данную функцию. По умолчанию метод не используется.

Пример к статье

Пример к данной статье — урок номер восемь, в котором демонстрируется реакция на нажатия на стрелки клавиатуры: «вверх», «вниз», «вправо» и «влево». При нажатии на «вверх» броневик разгоняется, на «вниз» тормозит, «вправо» и «влево» разворачивают машину в соответствующую сторону.

Уроки можно скачать по ссылке:
Исходный код: Tutorials
Бинарные сборки: Tutorials

30 июля 2010 (Обновление: 2 янв. 2011)