蛇形游戏移动问题[JAVA]
我正试图用Java编写一个蛇游戏,作为一个开始,我想出了如何得到蛇,我只实现了它的头部的一瞬间移动的权利。 我的问题是,我不能让它向下移动,蛇应该继续向下移动,即使在按下向下键时松开键。 有什么想法吗 主要代码:蛇形游戏移动问题[JAVA],java,Java,我正试图用Java编写一个蛇游戏,作为一个开始,我想出了如何得到蛇,我只实现了它的头部的一瞬间移动的权利。 我的问题是,我不能让它向下移动,蛇应该继续向下移动,即使在按下向下键时松开键。 有什么想法吗 主要代码: import javax.swing.JFrame; public class Main { public static void main(String[] args) throws InterruptedException { JFrame fr
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();
}
}
蛇代码:
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;
}
}
提前感谢。在您的JPanel构造函数中添加: requestFocusInWindow(); 此外,当按下向下键时,您正在将dx设置为0,而不是将dy设置为-1 不要在move方法中不断添加KeyListener,这将意味着,当您最终能够恢复密钥通知时,您将受到大量密钥事件的轰炸 使用键绑定API来克服KeyListener的焦点限制 不要在关键事件发生时调用moveXxx,而是在游戏周期的每个循环中设置一个标志,指示哪个方向处于活动状态,检查该标志的状态并调用适当的方法
目前,蛇只会因为这个代码片段而向下移动
public void keyReleased(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.VK_DOWN) {
snake.moveDown();
}
}
所以它只会向下移动,如果按键被释放的话。要使蛇向下移动,即使未按下向下键,我建议使用另一种程序:
与其在监听器内部调用snake.moveDown,我建议只更新监听器内部x和/或y位置的增量。
如果按下向下键,则将dy设置为1;如果按下向上键,则将dy设置为-1。如果按下左键或右键,则将dy设置为0。
用同样的方法处理x
然后可以使用蛇的绘制方法来更新/绘制蛇头的位置。你不能发布所有代码并说出任何想法吗?在这里缩小范围。这可能解决不了你的问题。。。但你要增加多少听众?每次调用window.move时,您都在添加一个新的匿名侦听器,或者?我根据您的代码创建了一个应用程序,并且能够向下移动蛇。。。。与您的原始代码相比,我只修改了睡眠时间并允许帧调整大小。@Stefan Freitag,我希望蛇即使在按下按钮时也能继续移动,例如