好吧,我正试图重新发明轮子,并且只使用Swing和AWT以及默认随Java提供的东西来编写蛇游戏。但是,在此之前,我正在学习如何在窗口上移动一个正方形。切割mimimi,这里的东西:令人不愉快的小方形运动(在键盘中移动JPanel中的JComponent)
我有一个名为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);
问题可能会变得明显,熟练的人(除了我之外的每个人):当你按下箭头,然后按另一个箭头时,血腥方形STOPS。例如:向上......离开。如果你同时按下两个键,它会变得完美,但是如果你按下LEFT( - = 10),然后UP(它停止左边的( - = 10),它会等待一段时间,然后它开始向上,忽略旧的左)。
嗯,我希望这个话题不要太冗长,我已经表达清楚。我希望它能够结合箭头的运动而没有不方便的停顿(在Allegro中,在C中,这是默认情况下发生的)。你深入了解为什么会发生这种情况?你知道如何改善这种运动吗?
非常感谢你!
1)为了更好地提供帮助,请发布[SSCCE](http://sscce.org/)。 2)对于Swing,通常使用基于AWT的较低级别KeyListener的键绑定。有关如何使用它们的详细信息,请参见[如何使用键绑定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)。 –
'SnakePane'似乎正在使用一个布局管理器,一旦'SnakePane'验证通过,更改'HeadPane'的位置将只是暂时的,它将被放置在布局管理器希望它的位置 – MadProgrammer