Java游戏引擎的事件处理

时间:2015-05-09 15:35:38

标签: java game-engine

我正在用Java编写一个小游戏引擎,想知道如何优化我的事件处理。

对于事件处理,我有一个类EventManager,在这里你可以注册EventHandlerEventHandler只是一个标志接口)。 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"

我想知道这是否是处理事件的好方法,以及它是否足够快以处理游戏中的事件或者我是否必须更改它。如果我必须改变它,我怎样才能让它变得更好?

0 个答案:

没有答案