2013-06-24 42 views
-1

好吧,我正試圖重新發明輪子,並且只使用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中,這是默認情況下發生的)。你深入瞭解爲什麼會發生這種情況?你知道如何改善這種運動嗎?

非常感謝你!

+2

1)爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 2)對於Swing,通常使用基於AWT的較低級別KeyListener的鍵綁定。有關如何使用它們的詳細信息,請參見[如何使用鍵綁定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)。 –

+0

'SnakePane'似乎正在使用一個佈局管理器,一旦'SnakePane'驗證通過,更改'HeadPane'的位置將只是暫時的,它將被放置在佈局管理器希望它的位置 – MadProgrammer

回答