我正在计划一个事件驱动的游戏引擎。基本思想是,不是让一切都与一切对话,而是一切都与事件系统对话,事件系统会将消息转发给他们的接收者,而不会将接收者耦合到通知者或其他方式。
- 对象将自己注册到事件系统。通知 ID 和指向回调函数的指针作为每个注册命令的参数传递。
- 对象将通知添加到事件系统。通知的 ID 作为每个通知的参数传递。通知被添加到包含所有待处理通知的队列中。
- 此外,事件系统支持预定通知。通知 ID 和未来执行时间作为每个通知的参数传递。然后将调度的通知存储在按未来执行时间的顺序保存调度通知的数据结构(“调度”)中。
- 调用者对象命令事件系统处理所有排队的通知。事件系统按顺序获取通知,并调用每个已注册自己的对象的回调函数,其 ID 与当前通知相同。
- 调用者对象命令事件系统处理一个预定通知。从调度中获取最旧的通知,并调用使用相同通知 ID 注册的所有对象的回调。
.
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();
}
但是我对这个解决方案并不完全满意,主要是因为系统不允许将参数轻松传递给接收者,而且我对成员函数的回调持怀疑态度,这是一个好的设计实践吗?我想出的方法/类/变量名呢?欢迎对问题提出建设性的批评、指导和替代方法。