蛇形游戏移动问题[JAVA]

蛇形游戏移动问题[JAVA],java,Java,我正试图用Java编写一个蛇游戏,作为一个开始,我想出了如何得到蛇,我只实现了它的头部的一瞬间移动的权利。 我的问题是,我不能让它向下移动,蛇应该继续向下移动,即使在按下向下键时松开键。 有什么想法吗 主要代码: import javax.swing.JFrame; public class Main { public static void main(String[] args) throws InterruptedException { JFrame fr

我正试图用Java编写一个蛇游戏,作为一个开始,我想出了如何得到蛇,我只实现了它的头部的一瞬间移动的权利。 我的问题是,我不能让它向下移动,蛇应该继续向下移动,即使在按下向下键时松开键。 有什么想法吗

主要代码:

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,我希望蛇即使在按下按钮时也能继续移动,例如