3

我正在尝试用 Java 编写一个 Pong 小程序。当用户向上或向下按住时,他们的桨应该平稳移动,但事实并非如此。它移动,然后暂停,然后再次开始移动。有没有办法阻止这种短暂的停顿发生?

主类:

public class Main extends JApplet {

    public DrawPanel dp = new DrawPanel(400, 400);

    public void init(){
        add(dp);
        setSize(400, 400);
        requestFocusInWindow();

        Action moveDown = new AbstractAction(){
            public void actionPerformed(ActionEvent e){
                dp.player.y += 10;
                dp.repaint();
            }
        };

        dp.getInputMap().put(KeyStroke.getKeyStroke("pressed DOWN"), "move down");
        dp.getActionMap().put("move down", moveDown);       
    }
}

绘图面板类:

public class DrawPanel extends JPanel {

    public Paddle player;
    public Paddle opponent;

    public DrawPanel(int height, int width){
        int y = (height / 2) - (height / 10);
        int w = 15;
        int h = height / 5;

        player = new Paddle(2, y, 15, h, Color.white);
        opponent = new Paddle(width - (w+2), y, 15, h, Color.white);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        this.setBackground(Color.BLACK);

        g.setColor(player.color);
        g.fillRect(player.x, player.y, player.width, player.height);

        g.setColor(opponent.color);
        g.fillRect(opponent.x, opponent.y, opponent.width, opponent.height);
    }   
}

桨类:

public class Paddle {

    public int x, y, width, height;
    public Color color;

    public Paddle(int _x_, int _y_, int w, int h, Color c){
        x = _x_;
        y = _y_;
        width = w;
        height = h;
        color = c;
    }
}
4

1 回答 1

4

根本问题是 keyPressed 的“实例”概念与运动的“持续时间”概念之间的阻抗不匹配。

而不是试图在视图中平滑它(无论如何这不应该与游戏逻辑的细节有任何关系),而是使用更适合的 api 来增强游戏模型。Fi 添加启动/停止逻辑并将这些方法绑定到 keyPressed/keyReleased:

public class Paddle {

     public void startMoveDown() {
         // here goes the logic, f.i. starting a timer
         // in the actionPerformed of that timer:
         ...  moveUnitDown(); 
     }
     public void stopMoveDown() {
        //... 
     }

     protected void moveUnitDown() {
         y+=unit;
         // ideally, have listeners and notify them the change of y
     } 
}

// in the view:
Action startMoveDown = new AbstractAction(){
    public void actionPerformed(ActionEvent e){
        player.startMoveDown();
   }
};

dp.getInputMap().put(KeyStroke.getKeyStroke("pressed DOWN"), "start move down");
dp.getActionMap().put("start move down", startMoveDown); 

// in the view:
Action stopMoveDown = new AbstractAction(){
    public void actionPerformed(ActionEvent e){
        player.stopMoveDown();
   }
};

dp.getInputMap().put(KeyStroke.getKeyStroke("released DOWN"), "stop move down");
dp.getActionMap().put("stop move down", stopMoveDown); 
于 2013-08-05T09:05:49.507 回答