-1

好的,我正在尝试重新发明轮子并仅使用 Swing 和 AWT 以及 Java 默认附带的东西来编写蛇游戏。但是,在那之前,我正在学习如何在窗口上移动一个正方形。切断mimimi,事情是这样的:

我有一个名为 HeadSquare 的自定义 JComponent 类:

public class HeadSquare extends JComponent {

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int screenWidth = (int) screenSize.getWidth();
int screenHeight = (int) screenSize.getHeight();
int defaultSize = screenWidth / 2;
int snakeSquareDefaultSize = 10;

int headSquareXPos = ((defaultSize / 2) - (snakeSquareDefaultSize / 2));
int headSquareYPos = ((defaultSize / 2) - (snakeSquareDefaultSize / 2));

Rectangle head = new Rectangle(headSquareXPos, headSquareYPos, snakeSquareDefaultSize, snakeSquareDefaultSize);
Color snakeColor = Color.green;

private static final long serialVersionUID = 1L;

@Override
public Dimension getMinimumSize() {
    return new Dimension(0, 0);
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(defaultSize, defaultSize);
}

@Override

public void paintComponent(Graphics g) {
    Graphics2D graphics2D = (Graphics2D) g;
    g.setColor(snakeColor);
    super.paintComponent(g);
    graphics2D.fill(head);

}

}

我有一个出色的 JPanel(在其他地方被宣布):

snakePanel = new JPanel();

Main bla bla bla:

headSquare = new HeadSquare();
snakePanel.requestFocus();
snakePanel.add(headSquare);

就这样:

snakePanel.addKeyListener(new KeyListener() {

        @Override
        public void keyPressed(KeyEvent arg0) {
            if (arg0.getKeyCode() == KeyEvent.VK_LEFT) {
                headSquare.headSquareXPos -= 10;
                headSquare.head.setLocation(headSquare.headSquareXPos, headSquare.headSquareYPos);
                snakePanel.repaint();
            } else if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
                headSquare.headSquareXPos += 10;
                headSquare.head.setLocation(headSquare.headSquareXPos, headSquare.headSquareYPos);
                snakePanel.repaint();   
            } else if (arg0.getKeyCode() == KeyEvent.VK_UP) {
                headSquare.headSquareYPos -= 10;
                headSquare.head.setLocation(headSquare.headSquareXPos, headSquare.headSquareYPos);
                snakePanel.repaint();   
            } else if (arg0.getKeyCode() == KeyEvent.VK_DOWN) {
                headSquare.headSquareYPos += 10;
                headSquare.head.setLocation(headSquare.headSquareXPos, headSquare.headSquareYPos);
                snakePanel.repaint();   
            }
        }
    });
    contentPane.add(snakePanel, BorderLayout.CENTER);

对于熟练的人(除了我之外的所有人),问题可能会变得很明显:当你按下一个箭头时,血腥的方块停止,然后再按下另一个箭头。例如:向上.....向左。如果你同时按下两个,它会完美,但是如果你按下 LEFT (-= 10),然后 UP(它会停止 LEFT 的 (-= 10),它会等待一段时间然后开始向上,忽略老左)。

好吧,我希望这个话题不要太冗长,并且我已经清楚地表达了自己。我希望它结合箭头的移动而不会造成不便的暂停(在 Allegro 中,在 C 中,默认情况下会发生这种情况)。你知道为什么会发生这种情况吗?你知道如何改进这个动作吗?

我非常感谢你!

4

1 回答 1

3

请参阅Motion Using the Keyboard,它解释了使用 Key Listener 的问题。首选的解决方案是使用Key Bindings.

于 2013-06-25T00:10:53.303 回答