-1
私はJAVAのsnakeゲームに取り組んでいます。何らかの理由でKeyListenerが動作していないようです。私は答えを探すことを試みたが、私は助けて何も見つけることができなかった。私はJavaで初心者ですので、私が正しくキーストーンを使用しているかどうかはわかりません。私は何の出力も得られません。JAVA linux 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);
}
}
}
ようこそスタックオーバーフロー!私はこのコードの95%があなたの問題に関連していないと思います。あなたの問題を示す[**最小**、完全で実証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 –
編集、ありがとう@JoeC –
@FredKで提案されているように、あなたは正しく 'JPanel'を呼び出すのではなく、ブロックスレッドを初期化しています。だから私はあなたがあなたのメインの方法を投稿した場合、私たちは問題を追跡するかもしれないと思います。 – AntJavaDev