Я планирую игровой движок, управляемый событиями. Основная идея состоит в том, что вместо того, чтобы все говорить со всем, все будет говорить с системой событий, которая будет передавать сообщения получателям, не связывая получателей с уведомителями или наоборот.C++: реализация системы событий для игрового движка
- Объекты регистрируются в системе событий. Идентификатор уведомления и указатель на функцию обратного вызова передаются в качестве параметров каждой команды регистрации.
- Объекты добавляют уведомления в систему событий. Идентификатор уведомления передается как параметр каждого уведомления. Уведомления добавляются в очередь, содержащую все ожидающие уведомления.
- Кроме того, система событий поддерживает запланированные уведомления. Идентификатор уведомления и будущее время исполнения передаются в качестве параметров каждого уведомления. Затем запланированные уведомления сохраняются в структуре данных («расписание»), содержащей запланированные уведомления в порядке будущего времени исполнения.
- Объект invoker обязывает систему событий обрабатывать все оповещения в очереди. Система событий извлекает уведомления в порядке и вызывает функцию обратного вызова для каждого объекта, который зарегистрировал себя с тем же идентификатором, что и текущее уведомление.
- Объект invoker обязывает системе событий обрабатывать одно запланированное уведомление. Самое старое уведомление выдается из расписания, и вызываются обратные вызовы всех объектов, зарегистрированных с тем же идентификатором уведомления.
.
class Registration
{
public:
void callback(void){ callback_(); }
void setCallback((*callback)(void));
void addToEventSystem(int ID, EventSystem &eventSystem);
private:
void (*callback_)(void);
};
class EventSystem
{
public:
void register(int ID, Registration* registration);
void unRegister(int ID, Registration* registration);
void addNotificationToQueue(int ID);
void addNotificationToSchedule(int ID, int notificationTime);
void processQueuedNotifications(void);
void processNextScheduled(void);
int getCurrentTime(void);
private:
//placeholder types
<list> notificationQueue;
<binaryheap> notificationSchedule;
};
//------------Use:------------------
class ReceiverObject
{
public:
void doStuff(void);
void initialize(void){
keyPressRegistration.setCallback(doStuff);
//multiple registrations with different ID:s to same eventsystem possible
keyPressRegistration.addToEventSystem(1234,eventSystem);
keyPressRegistration.addToEventSystem(42,eventSystem);};
private:
Registration keyPressRegistration;
};
int main()
{
ReceiverObject receiverObject;
EventSystem eventSystem;
receiverObject.initialize();
eventSystem.addNotificationToQueue(1234);
eventSystem.processQueuedNotifications();
}
Однако я не совсем удовлетворен этим решением, в основном потому, что система не позволяет легко передачи параметров получателям, и я скептически отношусь к обратным вызовам функциев-членов, это хорошая практика дизайна? Как насчет названий методов/классов/переменных? Мы приветствуем конструктивную критику, руководство и альтернативные подходы к проблеме.
Как насчет передачи 'std :: function' вместо простого указателя функции для ваших обратных вызовов? –
Действительно, эти люди выглядят многообещающими. У меня просто нет опыта или знаний о C++ 11, но я дам новый стандарт взгляду – jms