我正在用Java编写一个小游戏引擎,想知道如何优化我的事件处理。
对于事件处理,我有一个类EventManager
,在这里你可以注册EventHandler
(EventHandler
只是一个标志接口)。 EventManager
会扫描EventHandler
的所有方法,当有@EventCallback
注释的方法时,它只有一个Paramter,其类型扩展为Event
,它将此方法添加到地图:Map<Class<? extends Event>, Set<Callback>>
(Callback
只需保存Method
及其Object
,以便稍后可以调用Method
。
我喜欢这种事件处理的方法是,您可以根据需要命名处理程序方法,并且可以在同一个类中处理不同的事件,而无需实现许多接口。
事件处理类看起来像这样:
class ExampleHandler implements EventHandler {
ExampleHandler(Game game) {
game.getEventManager().registerHandler(this);
}
@EventCallback
public void exampleKeyCallback(KeyPressEvent evt) {
//I only care about key-pressing, not key-releasing in this class
System.out.println(evt.getKey() + " was pressed");
}
@EventCallback
public void i_can_name_this_method_however_i_want(PlayerDeathEvent evt) {
System.out.println(evt.getPlayer().getName() + " died");
}
}
例如,当我的播放器死亡时,它会将PlayerDeathEvent
发送到EventManager
:
//Inside the player-class
public void update() {
if (health <= 0) {
getGame().getEventHandler().fireEvent(new PlayerDeathEvent(this));
}
}
并且EventHandler
将调用此Event
的所有回调:
//Inside the eventmanager-class
private Map<Class<? extends Event>, Set<Callback>> eventCallbackMap = new HashMap<>();
public void registerEventHandler(EventHandler evt) {
// find all the @EventCallback-Methods and find the Class-Type of their Paramater,
// then add the Method to the Set of Methods for this Class of Events.
// for example: exampleKeyCallback(KeyPressEvent)
// it will be added to the Set for KeyPressEvent.class
}
public void fireEvent(Event evt) {
Set<Callback> callbacks = eventCallbackMap.get(evt.getClass());
for (Callback callback : callbacks) {
callback.invoke(evt);
}
}
使用i_can_name_this_method_however_i_want
调用PlayerDeathEvent
并在控制台上打印"*Player-Name* died"
。
我想知道这是否是处理事件的好方法,以及它是否足够快以处理游戏中的事件或者我是否必须更改它。如果我必须改变它,我怎样才能让它变得更好?