好吧,我正試圖重新發明輪子,並且只使用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