我的程序突然停止接收键盘输入

时间:2016-10-06 07:02:19

标签: java eclipse io keyboard-events

这是我的第一个问题,所以我只是直截了当。

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

随着游戏控制的进行,我已经设置了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类的完整代码。)

1 个答案:

答案 0 :(得分:0)

  

有谁知道可能导致此问题的原因?

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

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

你说:

  

我收到此错误:

   java.awt.AWTEventMulticaster.keyPressed(Unknown Source)

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

最后,你不应该这样做:

  if (death == false) {

正确的写作方式是:

  if (!death) {

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

  if (death = false) {

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

由于此原因,您向我们展示的代码都没有中断,但这种不良习惯可能会在您的代码中的其他位置使用,这可能是您问题的根源。