蛇游戏移动问题[JAVA]

时间:2014-12-14 19:52:07

标签: java

我正在尝试用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;
    }

}

提前致谢。

3 个答案:

答案 0 :(得分:1)

  1. 请勿在移动方法中添加KeyListener,这意味着,当您最终可以恢复关键通知时,您将受到大量关键事件的轰炸
  2. 使用Key Bindings API克服了KeyListener
  3. 的焦点限制
  4. 不是在发生键事件时调用moveXxx,而是设置一个标志,该标志指示哪个方向处于活动状态并且在游戏周期的每个循环上,检查该标志的状态并调用适当的方法

答案 1 :(得分:1)

目前,由于此代码段,蛇只会向下移动

public void keyReleased(KeyEvent event) {
  if(event.getKeyCode() == KeyEvent.VK_DOWN) {
    snake.moveDown();
  }
}

如果密钥被释放,它只会向下移动。为了让蛇在没有按下向下键的情况下向下移动,我建议使用另一种方法:

  • 我建议只更新侦听器内x和/或y位置的delta,而不是从侦听器内部调用snake.moveDown()
  • 如果按下按键,则将dy设置为1,如果按下按键,则将dy设置为-1。如果按下左或右键,请将dy设置为0。
  • 对x
  • 采取相同的方式

蛇的paint方法可用于更新/绘制蛇头的位置。

答案 2 :(得分:0)

在您的JPanel构造函数中添加:

requestFocusInWindow();

此外,当按下向下键时,如果不将dy设置为-1,则将dx设置为0?