Java-检查不使用KeyListener的按键

时间:2017-10-16 08:02:34

标签: java events key listener game-loop

我正在使用Java制作视频游戏的原型(我计划稍后将其移植到Unity,但由于我对Java非常熟悉,我认为它会更快地得到一个我在Java中的游戏结构和基本组件的想法。也许具有讽刺意味的是,我对如何用Java做这件事有些怀疑。

收集按键的最佳方法是什么?我知道KeyListeners以及如何使用它们,但它们看起来并不理想。我希望能够在每个更新周期(特别是在周期开始时)调用一个keyPress()方法,这是出于精确原因 - 我每周期都要更新信息,我希望它根据按下哪个键而变化 - 我意识到即使是几帧异步并不是很大的问题,但是我觉得,对于让游戏发挥得很好,响应的即时性非常重要。我也不希望每次按下不同的键时都会被单独提醒,但理想情况下,我想生成一种的列表,其中键在任何给定的按下片刻(游戏输入包含特定的击键,因此在任何时候,我都想知道活动击键是什么)。还有其他问题,关于游戏事件发生的时间,使得在3或4帧内同步非常重要。每个循环运行速度比在循环开始时得到键的响应要快得多。

有办法做到这一点吗?如果有的话,这是个好主意吗?如果我在每个更新周期都运行它,那么期望任何类型的一致游戏玩法是否会太慢(我希望它甚至可能比听众更快或更轻)?还有其他可能出错的地方吗?

由于

1 个答案:

答案 0 :(得分:1)

首先你应该看看你的游戏玩法。 事件的使用对您来说不会有问题。代码混乱和事件控制使其变得困难。 有很多解决方案。首先,你使用过任何框架(比如Libgdx)吗?如是。这是处理,否则你可以自己去。

使用“消息处理”的一种方法。在此解决方案中,您可以编写以下代码。

public interface Telegram {
    public boolean handleMessage(final Telegram msg,Object yourObject );
}
public class MessageHandler {
    private static Map<String,List<Telegram>> telegramKeyMap = new HashMap<>();

    public static void addTelegram(String key,Telegram telegram){
        List<Telegram> telegramList = telegramKeyMap.getOrDefault(key, new ArrayList<Telegram>());
        telegramList.add(telegram);
    }

    public static void dispatchMessage(String key,Object addVal){
        List<Telegram> telegramList = telegramKeyMap.getOrDefault(key, new ArrayList<Telegram>());

        for (Telegram telegram : telegramList) {
            telegram.handleMessage(telegram,addVal);
        }
    }
}
public class Player implements Telegram {
    public Player() {

    }

    @Override
    public boolean handleMessage(Telegram msg, Object yourObject) {
        return false;
    }
}

在此代码中,您可以为任何类实现Telegram。然后在侦听器上调用dispatchMessage。对于输入,您可以使用任何对象(如Listener,keyCode,...) 使用此密钥调度任何对象,它们调用handleMessage方法。现在,您的每个对象都可以处理他们的工作。

第二种解决方案:使用“事件管理”
如果第一个选项无法解决您的问题,那么我将采用第二个解决方案来获取示例代码。消息处理程序在大多数游戏引擎引擎中使用,它确实提高了游戏的速度,但它却大大地打开了你的手。