0

私は Pong プログラムを作成しており、すべてを描画し始める開始ボタンがあり、文字通りボールを転がします (しゃれは大歓迎です)。とにかく、開始ボタンを押すと、キャンバス上のどこかでマウスをクリックして優先順位を付けない限り、パドルを移動するためのキー リスナーは機能しません。ユーザーが煩わされることなく、キャンバス上で自動的に「クリック」するコードはありますか? 前もって感謝します。

ところで、これは awt を実行しています。スイングを学ばなければならないことはわかっていますが、スイングをすることはできませんでした。

public class Pong extends Applet implements ActionListener, KeyListener
{
    Canvas c1;
    Graphics myG;
    Button start;

    ball ball;
    paddle LPaddle;
    paddle RPaddle;

    public void init()
    {
        this.setSize(1300,700);

        c1 = new Canvas();
        add(c1);
        c1.addKeyListener(this);
        c1.setBackground(Color.pink);

        start = new Button("Start");
        add(start);
        start.addActionListener(this);


        ball = new ball();

        LPaddle = new paddle();
        RPaddle = new paddle();

        myG = c1.getGraphics();


    }

    public void paint(Graphics g)
    {
        c1.setLocation(0,0);
        c1.setSize(1251,700);

        start.setLocation(1255,350);
        start.setSize(40,20);
    }


    public void keyPressed(KeyEvent e) 
    {
        if(e.getKeyCode()==KeyEvent.VK_UP)//up
        {
            RPaddle.erasePaddle(myG);
            RPaddle.movePaddleUp();
            RPaddle.drawPaddle(myG);
        }
        if(e.getKeyCode()==KeyEvent.VK_DOWN)//down
        {
            RPaddle.erasePaddle(myG);
            RPaddle.movePaddleDown();
            RPaddle.drawPaddle(myG);
        }
        if(e.getKeyCode()==KeyEvent.VK_W)
        {
            LPaddle.erasePaddle(myG);
            LPaddle.movePaddleUp();
            LPaddle.drawPaddle(myG);
        }
        if(e.getKeyCode()==KeyEvent.VK_S)
        {
            LPaddle.erasePaddle(myG);
            LPaddle.movePaddleDown();
            LPaddle.drawPaddle(myG);
        }
        if(e.getKeyCode()==KeyEvent.VK_ENTER)
        {
            myG.drawLine(625,0,625,700);
            LPaddle.setInitial(150,0,350);
            RPaddle.setInitial(150,1250,350);

            LPaddle.drawPaddle(myG);
            RPaddle.drawPaddle(myG);
        }
    }

    public void keyReleased(KeyEvent e) 
    {

    }

    public void keyTyped(KeyEvent e) 
    {

    }



    public void actionPerformed(ActionEvent e) 
    {
        if(e.getSource()==start)
        {
            myG.drawLine(625,0,625,700);
            LPaddle.setInitial(150,0,350);
            RPaddle.setInitial(150,1250,350);

            LPaddle.drawPaddle(myG);
            RPaddle.drawPaddle(myG);
        }
    }
4

1 に答える 1

1

KeyListeners主要な重大な欠点がある低レベルのインターフェイスです。それらが登録されているコンポーネントは、フォーカス可能であり、フォーカスされている必要があります。

スタート ボタンをクリックすると、ボタンにフォーカスが置かれます。

キャンバスのインスタンスを呼び出すこともできますrequestFocusInWindowが、これはそもそもキャンバスがフォーカス可能であることを前提としています。

可能であれば、ゲーム キャンバスのベースとしてJComponent/を使用し、キー バインディングAPI を使用することをお勧めします。JPanel

于 2013-03-29T02:09:27.783 に答える