【发布时间】:2017-07-08 18:22:39
【问题描述】:
我正在开发 JAVA 蛇游戏,但我的 KeyListener 似乎由于某种原因无法正常工作。我试图寻找答案,但找不到任何有用的东西。我是 JAVA 的初学者,所以我不知道我是否正确使用了 keylistener。我根本没有输出。
public class GameBoard extends JPanel implements Runnable, KeyListener{
/**
*
*/
private boolean up, down, right, left;
private Thread thread;
private boolean running;
private long targetTime;
public GameBoard() {
setPreferredSize(new Dimension(WIDTH,HEIGHT));
setFocusable(true);
requestFocus();
addKeyListener(this);
}
@Override
public void keyPressed(KeyEvent e) {
int k = e.getKeyCode();
System.out.println("pressed");
if( k == KeyEvent.VK_W || k == KeyEvent.VK_UP) up = true;
if( k == KeyEvent.VK_S || k == KeyEvent.VK_DOWN) down = true;
if( k == KeyEvent.VK_A || k == KeyEvent.VK_LEFT) left = true;
if( k == KeyEvent.VK_D || k == KeyEvent.VK_RIGHT) right = true;
}
@Override
public void keyReleased(KeyEvent e) {
int k = e.getKeyCode();
System.out.println("Released");
if( k == KeyEvent.VK_W || k == KeyEvent.VK_UP) up = false;
if( k == KeyEvent.VK_S || k == KeyEvent.VK_DOWN) down = false;
if( k == KeyEvent.VK_A || k == KeyEvent.VK_LEFT) left = false;
if( k == KeyEvent.VK_D || k == KeyEvent.VK_RIGHT) right = false;
}
@Override
public void keyTyped(KeyEvent e) {
int k = e.getKeyCode();
System.out.println("typed");
}
@Override
public void run() {
if(running) return;
init();
while(running) {
startTime = System.nanoTime();
update();
requestRender();
elapsed = System.nanoTime()-startTime;
wait = targetTime - elapsed / 10000000;
if (wait > 0) {
try {
Thread.sleep(wait);
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
private void init() {
addKeyListener(this);
}
private void update() {
if(up && dy == 0) {
dy = -SIZE;
dx = 0;
}
if(down && dy == 0) {
dy = SIZE;
dx = 0;
}
if(left && dx == 0) {
dx = -SIZE;
dy = 0;
}
if(right && dy == 0) {
dx = SIZE;
dy = 0;
}
if(dy!=0 || dx!= 0) {
for( int i = snake.size() -1 ;i > 0; i-- ) {
snake.get(i).setPosition(snake.get(i-1).getX(),snake.get(i-1).getY());
}
}
head.move(dx,dy);
if(head.getX() < 0 ) head.setX(WIDTH);
if(head.getY() < 0 ) head.setY(HEIGHT);
if(head.getX() > WIDTH) head.setX(0);
if(head.getY() > HEIGHT) head.setY(0);
}
}
}
【问题讨论】:
-
欢迎来到 Stack Overflow!我想 95% 的代码与您的问题无关。请创建一个 Minimal, Complete and Verifiable Example 来证明您的问题。
-
已编辑,谢谢@JoeC
-
正如@FredK 所建议的那样,您没有正确调用
JPanel,而是正在初始化一个阻塞线程。所以我想如果你发布你的主要方法,我们可能会追踪问题。 -
这仍然是太多的代码,社区没有时间浏览它。请记住,我们是在自愿奉献我们的时间,而我们要求的回报是您为自己付出一些努力。请花一些时间在调试器中,将问题缩小到不超过 20 行,然后如果您仍然需要帮助,请返回这 20 行。
标签: java events listener keylistener keyevent