【问题标题】:My program suddenly stops receiving keyboard inputs我的程序突然停止接收键盘输入
【发布时间】:2016-10-06 07:02:19
【问题描述】:

这是我的第一个问题,所以我会直接回答。

我一直在使用 Eclipse Neon IDE 用 Ja​​va 开发一个小型 2D 平台游戏。到目前为止,我已经能够克服我遇到的任何问题,除了我将要告诉你的问题。

由于游戏控件通常进行,我已经设置了 WASD 键用于移动和空格键用于跳跃。我控制的角色确实响应了按键输入,所以我知道这段代码可以工作,但是由于某种原因,在程序运行了大约 3 分钟左右后,角色停止接收按键输入并且我收到此错误:

java.awt.AWTEventMulticaster.keyPressed(Unknown Source)

我尝试过修改代码,看看是否可以自己修复它,但我不知道是什么导致了问题。

这是我的 Player 类的相关代码部分。您可能不需要关注 keyPressed() 和 keyReleased() 方法中的任何变量,只需关注方法本身:

    public void keyPressed(KeyEvent keyID) { //This method checks to see which keys the user has pressed
    int key = keyID.getKeyCode();
    if (debug == false && key == KeyEvent.VK_F1) {
        debug = true;
    }
    else if (debug == true && key == KeyEvent.VK_F2) {
        debug = false;
    }

    if (death == false) {
        if (key == KeyEvent.VK_SPACE && jumping == false) {
            //Player.key = 2;
            velY = ySpeed;
            jumping = true;
            Sound.playSound("audio/playerJump.wav");
        }
        else if (key == KeyEvent.VK_D && rightIntersect == true) {
            velX = 0;
            lastKeyPressed = 'D';
            Player.key = 1;
        }
        else if (key == KeyEvent.VK_D && rightIntersect == false) {
            velX = xSpeed;
            lastKeyPressed = 'D';
            Player.key = 1;
        }
        if (key == KeyEvent.VK_A) {
            velX = -xSpeed;
            lastKeyPressed = 'A';
            Player.key = -1;
        }
    }

    else if (key == KeyEvent.VK_R && death == true) {
        for (int i = 0; i < GameFrame.getPlayerList().size(); i++) {
            Player p = GameFrame.getPlayerList().get(i);

            GameFrame.removePlayer(p);
            GameFrame.addPlayer(new Player(GameFrame.xPosStart, GameFrame.yPosStart));
            death = false;
            GameFrame.level = 1;
            GameFrame.mainTimer.setInitialDelay(0);
            GameFrame.mainTimer.start();
        }
    }
}

public void keyReleased(KeyEvent keyID) { //This method checks to see which keys the user has released
    int key = keyID.getKeyCode();

    if (key == KeyEvent.VK_A || key == KeyEvent.VK_D) {
        Player.key = 0;
        velX = 0;
    }
}

这是 Player 类引用的 KeyAdapt 类的代码:

public class KeyAdapt extends KeyAdapter {
Player p;

public KeyAdapt (Player player) {
    p = player;
}   
public void keyPressed (KeyEvent keyID) {
    p.keyPressed(keyID);
}
public void keyReleased (KeyEvent keyID) {
    p.keyReleased(keyID);
}

同样,这段代码确实有效。它只是在程序运行一定时间后突然停止工作。 有谁知道可能导致此问题的原因?

(如果需要更多信息,我可以提供 Player 类的完整代码)。

【问题讨论】:

  • 这通常发生在你告诉它停止接收来自键盘的输入或者你有内存崩溃或者你拔掉键盘时。但也许你是幸运的人有不同的原因。
  • 这个变量death是什么? if (death == false) {
  • 变量“death”用于检测玩家是否死亡。在这种情况下,只有当 death == false 时才允许玩家控制角色。

标签: java eclipse io keyboard-events


【解决方案1】:

有谁知道是什么导致了这个问题?

鉴于您向我们展示的代码,无法说。

我建议你添加一些调试代码。例如,向keyPressed 添加一些记录接收到的事件的内容,以及诸如deathjumping 等变量的状态。


你说:

我收到此错误:

   java.awt.AWTEventMulticaster.keyPressed(Unknown Source)

这看起来像是堆栈跟踪中一行的一部分,而不是错误消息。如果这是一个堆栈跟踪,您需要向我们展示整个跟踪包括开头的异常。


最后,你不应该这样做:

  if (death == false) {

正确的写法是:

  if (!death) {

它更简洁,但更重要的是它不那么脆弱。想象一下,如果您将版本输入错误:

  if (death = false) {

一个字符的区别。容易被忽视。它完全改变了语句的含义。使用==!= 来测试boolean 变量是一个坏主意

您向我们展示的所有代码都不会因此而中断,但这个坏习惯可能会在您代码的其他地方使用,这可能是您问题的根源。

【讨论】:

  • 那是另外一回事,开头也不例外。每当发生此问题时,这是在控制台中打印出来的唯一内容。我将尝试围绕“key = keyID.getKeyCode();”在 try/catch 块中查看问题发生时是否发生其他任何事情。
  • 感谢您提到布尔变量。我一定会改变的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 2020-07-30
  • 2018-07-07
相关资源
最近更新 更多