Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—收集过去值的最佳方式_Java_Performance_Swing_Keyevent - Fatal编程技术网

Java—收集过去值的最佳方式

Java—收集过去值的最佳方式,java,performance,swing,keyevent,Java,Performance,Swing,Keyevent,我有一个简单的马里奥游戏,有决定玩家不同动画和动作的关键事件 它们是: 向左移动 右移 向左跳 向右跳 正如您所想象的,只有当玩家向右移动并且按下了“跳跃”按钮时,他才能播放“向右跳跃”动画 我遇到的问题是一次只能发送1个键值。这使得带有&&条件的if语句无效 以下是不起作用的代码: if(key == KeyEvent.VK_LEFT) { if(distanceTraveled<300)dx=-5; else dx=-4;

我有一个简单的马里奥游戏,有决定玩家不同动画和动作的关键事件

它们是:

  • 向左移动
  • 右移
  • 向左跳
  • 向右跳
正如您所想象的,只有当玩家向右移动并且按下了“跳跃”按钮时,他才能播放“向右跳跃”动画

我遇到的问题是一次只能发送1个键值。这使得带有
&&
条件的if语句无效

以下是不起作用的代码:

        if(key == KeyEvent.VK_LEFT) {
            if(distanceTraveled<300)dx=-5; else dx=-4;
            if(key == KeyEvent.VK_UP)
                player = jump_L_anim.getImage();
            else
                player = walk_L_anim.getImage();
         } else {
            if(distanceTraveled<300)dx=5; else dx=4;
            if(key == KeyEvent.VK_UP)
                player = jump_R_anim.getImage();
            else
                player = walk_R_anim.getImage();
        }

我设法抓住了最后一把钥匙,但不是最后一把不是重复的钥匙

我感到很困惑,于是决定观看。这让我更加困惑,在我枯燥的会计课上,我发现解决方案必须是将所有以前的值存储在一个数组中,然后我将循环遍历从最后一个到开始的值。我将继续这样做,直到数字不再继续。重复停止的数字是我要查找的最后一个值

对于任何对此感到困惑的人,请看一下这些按键运动的控制台读数

48
48
48
49
49
49
49
47
47
47
在这种情况下,我要找的号码是49。这是因为上次按下的键不是当前键


我在这个问题背后的逻辑正确吗?你将如何解决这个问题?如果有一个简单的只使用变量的解决方案,我宁愿不使用数组。我正在寻找最快和最有效的逻辑。

您应该跟踪钥匙何时释放。如果up从未被释放,你知道它仍然被持有。如果权利从未被释放,你知道它仍然被持有。每次更新,您都可以检查两者是否都已关闭,并做出相应的反应

也许您可以将此时按下的键存储到HashSet中,if语句类似于:

if (keyCodeSet.contains(x) && keyCodeSet.contains(y))

其中x和y是您想要的关键数字。释放按键后,您只需将其从集合中移除。

实际上非常简单:

  • 同时收听按下的
    键和松开的
  • 对您感兴趣的键使用
    Set
    1或4变量
  • 当按下某个键时,将其添加到集合中
  • 释放密钥后,将其移除
在任何按键时,检查另一个键是否存在。这样,如果您愿意,您可以区分“向上+向右”和“向右+向上”



1
Key
可以是
Integer
或任何您喜欢的表示形式。

但是如果有人拿着三个键怎么办?@user2907910这取决于您。你能给我一个更具体的例子来说明你的担忧吗?我不确定,我有一种感觉,如果按下第一个键的三个键会被忽略,因为你会覆盖最后一个键。第二个键也将被忽略,除非我设法存储它并检查itA
Map
将是一个更好的对象。是的,但要收集当前按下的键,我必须检查最后的值,keyEvents一次只发送一个。是的,您可能必须检查最后的值;在按下按键时运行逻辑之前,将按键代码添加到列表中如何?这样,在您检查是否同时按下两个键(或三、四等)之前,列表将具有最新的值。好的,我喜欢您的逻辑。这允许使用不会破坏模式的漂亮组合键。谢谢,我会考虑<代码>设置>代码> >代码>清单>代码>,但是其他的概念是声音+ 1。
if (keyCodeSet.contains(x) && keyCodeSet.contains(y))