Если вы хотите, чтобы конечные пользователи писали функции для обработки событий, я бы предложил использовать callbacks . Идея состоит в том, что конечный пользователь будет диктовать , какой обработчик события вызывать для каждого типа события, тогда как игровой движок будет диктовать , когда вызвать соответствующий обработчик события.
Пользователю предоставляется структура обратных вызовов, чтобы пользовательский код мог определять пользовательские обработчики событий и настраивать эти обратные вызовы для обращения к этим пользовательским функциям. Затем l oop для обработки событий игрового движка вызывает эти функции с помощью обратных вызовов, установленных пользователем.
Пример
Вы можете определить разные типы функций для разных events:
typedef void (*quit_handler_t)(void);
typedef void (*keydown_handler_t)(SDL_Keycode);
typedef void (*keyup_handler_t)(SDL_Keycode);
То есть обработчик для выхода не принимает аргументов, тогда как для ключа, идущего вверх и вниз, принимает аргумент, представляющий соответствующий ключ.
Затем вы предоставляете клиент со структурой event_handlers
, которая содержит указатели на обработчики событий, и конечный пользователь должен заполнить:
struct {
quit_handler_t quit;
keydown_handler_t keydown;
keyup_handler_t keyup;
} event_handlers;
Наконец, игровой движок l oop для обработки вызова событий те функции через обратные вызовы, которые были установлены пользователем:
SDL_Event e;
while (!quit && SDL_PollEvent(&e)) {
switch(e.type) {
case SDL_QUIT:
event_handlers.quit();
break;
case SDL_KEYDOWN:
event_handlers.keydown(e.key.keysym.sym);
break;
case SDL_KEYUP:
event_handlers.keyup(e.key.keysum.sym);
break;
}
}
Обратите внимание, что игровой движок может также инициализировать структуру event_handler
с обработчиками событий по умолчанию . Конечный пользователь сможет переопределить это поведение по умолчанию, изменив элементы event_handler
.