我正在尝试用Java写一个Snake游戏,作为一个开始,我想出了如何让蛇(我现在只实现它的头部)向右移动。 我的问题是当按下“向下”键时,我无法让它向下移动(即使释放了键,蛇也应继续向下移动)。 有什么想法吗?
主要代码:
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(500, 500);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Window window = new Window();
frame.add(window);
while(true) {
window.move();
Thread.sleep(10);
}
}
}
窗口代码:
import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class Window extends JPanel {
public Snake snake = new Snake(this);
public Window() {
this.setLayout(null);
setFocusable(true);
}
public void paint(Graphics g2d) {
super.paint(g2d);
snake.paint(g2d);
}
public void move() {
snake.moveRight();
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.VK_DOWN) {
snake.setDx(0);
}
}
public void keyReleased(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.VK_DOWN) {
snake.moveDown();
}
}
public void keyTyped(KeyEvent event) {
}
});
this.repaint();
}
}
Snake code:
import java.awt.Graphics;
public class Snake {
Window window;
private int positionX = 0;
private int positionY = 0;
private int dx = 1;
private int dy = 1;
public Snake(Window window) {
this.window = window;
}
public void paint(Graphics g2d) {
g2d.fillRect(positionX, positionY, 20, 20);
}
public int getPositionX() {
return positionX;
}
public void setPositionX(int positionX) {
this.positionX = positionX;
}
public int getPositionY() {
return positionY;
}
public void setPositionY(int positionY) {
this.positionY = positionY;
}
public int getDx() {
return dx;
}
public void setDx(int dx) {
this.dx = dx;
}
public int getDy() {
return dy;
}
public void setDy(int dy) {
this.dy = dy;
}
public void moveRight() {
positionX += dx;
}
public void moveDown() {
positionY += dy;
}
}
提前致谢。
答案 0 :(得分:1)
KeyListener
,这意味着,当您最终可以恢复关键通知时,您将受到大量关键事件的轰炸KeyListener
moveXxx
,而是设置一个标志,该标志指示哪个方向处于活动状态并且在游戏周期的每个循环上,检查该标志的状态并调用适当的方法答案 1 :(得分:1)
目前,由于此代码段,蛇只会向下移动
public void keyReleased(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.VK_DOWN) {
snake.moveDown();
}
}
如果密钥被释放,它只会向下移动。为了让蛇在没有按下向下键的情况下向下移动,我建议使用另一种方法:
snake.moveDown()
。 蛇的paint
方法可用于更新/绘制蛇头的位置。
答案 2 :(得分:0)
在您的JPanel构造函数中添加:
requestFocusInWindow();
此外,当按下向下键时,如果不将dy设置为-1,则将dx设置为0?