繁体   English   中英

Java-不使用KeyListener来检查按键

[英]Java- Check for key presses not using KeyListener

我正在使用Java制作视频游戏的原型(我打算稍后将其移植到Unity中,但是由于我对Java相当熟悉,因此我认为可以更快地了解我的结构和基本组件Java游戏)。 但是,也许具有讽刺意味的是,我对如何在Java中执行此操作有些怀疑。

收集按键的最佳方法是什么? 我了解KeyListeners以及如何使用它们,但是它们似乎并不理想。 出于精度原因,我希望能够在每个更新周期(特别是在周期开始时)调用一次keyPress()方法-我有每个周期都在更新的信息,并且我希望它根据所按下的键而有所不同–我意识到,即使异步几个帧也没什么大不了的,但是我认为响应的及时性对于使游戏流畅运行非常重要。 我也不想每一个不同的按键时单独警报,但理想情况下,我想产生一种列表,其中在任何时刻按下键(游戏中输入由特定的按键,和所以在任何时候,我都想知道有效的击键是什么。 还有其他一些问题,例如与游戏事件发生的时间有关,这使得在3帧或4帧内同步非常重要。 与在周期开始时获得键的响应相比,使每个周期快速运行并不重要。

有办法吗? 如果有,这是个好主意吗? 如果我在每个更新周期都运行一次,那么期待任何一种稳定的游戏玩法是否会太慢(我希望它甚至可能比侦听器更快或更轻)? 还有其他地方可能会出错吗?

谢谢

首先,您应该看一下游戏玩法。 使用事件不会给您带来问题。 代码混乱和事件控制使其变得困难。 有很多解决方案。 最初,您是否使用过任何框架(例如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方法。 现在,您的每个对象都可以处理其工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM