-1

わかりました、私はホイールを再発明して、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 では、これはデフォルトで発生します)。なぜこれが起こるのか、あなたは深く知っていますか?この動きを改善する方法を知っていますか?

ありがとうございます!

4

1 に答える 1