这是我的第一个问题,所以我只是直截了当。
我使用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类的完整代码。)
答案 0 :(得分:0)
有谁知道可能导致此问题的原因?
鉴于您向我们展示的代码,我们无法说出来。
我建议您添加一些调试代码。例如,向keyPressed
添加记录收到的事件的内容,以及death
,jumping
等变量的状态。
你说:
我收到此错误:
java.awt.AWTEventMulticaster.keyPressed(Unknown Source)
它看起来像堆栈跟踪中的一行,而不是错误消息。如果这是一个堆栈跟踪,您需要在开头向我们展示整个跟踪包括异常。
最后,你不应该这样做:
if (death == false) {
正确的写作方式是:
if (!death) {
它更简洁,但更重要的是它不那么脆弱。想象一下,如果您将您的版本输错为:
if (death = false) {
一个字符差异。容易被忽视。它完全改变了陈述的含义。使用==
和!=
来测试boolean
变量是一个坏主意。
由于此原因,您向我们展示的代码都没有中断,但这种不良习惯可能会在您的代码中的其他位置使用,这可能是您问题的根源。