好的,我正在尝试重新发明轮子并仅使用 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 中,默认情况下会发生这种情况)。你知道为什么会发生这种情况吗?你知道如何改进这个动作吗?
我非常感谢你!