2013-06-24 36 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

回答