0

我正在制作一个 Pong 程序,并且我有一个开始按钮,可以开始绘制所有内容,并且确实可以让球滚动(欢迎您使用双关语)。无论如何,当我点击开始按钮时,除非我在画布上的某处单击鼠标以赋予它优先级,否则移动桨的 Key Listener 将不起作用。是否有某种代码可以自动在画布上“单击”而不会打扰用户这样做?提前致谢。

顺便说一句,这是在运行 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/JPanel作为游戏画布的基础并使用键绑定API。

于 2013-03-29T02:09:27.783 回答