わかりました、私はホイールを再発明して、Swing と AWT とデフォルトで Java に付属するものだけでスネーク ゲームをプログラミングしようとしています。しかし、そのずっと前に、ウィンドウ上の正方形を移動する方法を学んでいます。ミミミを切ると、次のようになります。
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)を止める)を押すと、しばらく待って無視してUPし始めます古い左)。
まあ、この話題が多すぎないことを願っています。不便な停止なしに矢印の動きを組み合わせたいです (Allegro では、C では、これはデフォルトで発生します)。なぜこれが起こるのか、あなたは深く知っていますか?この動きを改善する方法を知っていますか?
ありがとうございます!