【问题标题】:How can I detect when a user really released a key in Java?如何检测用户何时真正释放了 Java 中的密钥?
【发布时间】:2016-07-12 17:58:21
【问题描述】:

如果你按下一个键,玩家会向前走,但如果你按住这个键的时间长一点,玩家就会朝同一个方向移动太久。 我正在使用这段代码来检查玩家正在按下什么键:

private void KeyPressed(java.awt.event.KeyEvent evt) {

    key = evt.getKeyCode();

        if (key == KeyEvent.VK_W) {

            direction = 1;

            PlayerMovement();
        }
        if (key == KeyEvent.VK_S) {

            direction = 2;

            PlayerMovement();
        }
        if (key == KeyEvent.VK_D) {

            direction = 3;

            PlayerMovement();
        }
        if (key == KeyEvent.VK_A) {
            direction = 4;
            PlayerMovement();

        }
}

【问题讨论】:

  • 当用户释放一个键时,你会得到一个KeyReleased 事件。光靠KeyPressed事件的频率是自找麻烦。
  • 您基于 KeyEvent 进行操作,我认为这太笼统了。您可以尝试单独使用 KeyPressed 或 KeyTyped(输入字符时)。
  • KeyBindins API 也是一个不错的地方。 KeyListener 经常有焦点问题
  • 是的,我得到了一个 keyReleased 事件,但在整个过程之后。那为时已晚。例如,在我按住一个键后循环开始,这意味着当我按住一个键 2 秒时,事件进入一个循环,并且在 6 个动画之后我的播放器停止,因为 keyReleased 事件触发

标签: java key keylistener


【解决方案1】:

使用 keyReleased !!!如果您需要在每次按键时将播放器移动一步 当用户按下按键时,keyPressed 会继续运行

使用 THREADS 因为你在这里使用程序,但是如果你启动一个线程,你可以做任何你想做的事情,程序仍然可以正常工作 了解线程,因为游戏都是关于线程的

private class Walk_thread extends java.lang.Thread{

public void run(){
//call the walk methode here
PlayerMovement();
}
}

所以当按键被按下时创建一个调用 playermovement 的线程

if (key == KeyEvent.VK_W) {

        direction = 1;
new Walk_thread().start();//here the method run is called 
System.out.println("program will not stop the thread is walking and the program is continued too");
    }

【讨论】:

  • 但是如果我按住一个键 2 秒我的播放器会在 4 个很长的动画后停止,它会运行很多
  • 使用布尔变量 true 按下时线程将移动播放器并在用户释放键时休眠一段时间 暂停线程线程非常有用,了解它
  • 你能给我一个例子吗?我不知道你的意思。
  • 这是一个简单的例子,但它不能让你理解线程
  • 示例在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多