为什么我的move()方法不能将球保持在界限内?

时间:2014-12-30 17:06:13

标签: java swing game-physics paintcomponent thread-sleep

问题:所以我创建了一个带有Window类的程序,该类创建了一个JFrame,并将一个来自我的DrawStuff类的JPanel添加到它上面。 DrawStuff类创建一个球(应该)在屏幕上反弹,当它到达JFrame边界时,改变方向。球移动但由于某种原因,我的移动方法的检查块部分不起作用。任何帮助将不胜感激。我的目标是保持球的界限。

来自DrawStuff类的代码

public class Drawstuff extends JPanel {
    private int x = 0;
    private int y = 0;
    private int dx, dy=0;

    public  Drawstuff(){
        x = 300;
        y = 250;
        dx = 0;
        dy = 0;
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        this.setBackground(Color.BLACK);
        g2d.setColor(Color.RED);
        g2d.fillOval(x,y,50,50);    
    }
    public void move(){

        if (x < 600){
            dx = 1;
        }
        if (y < 500){
            dy = 1; 
        }
        if (x > 600){
            dx = -1; 
        }
        if (y >500){
            dy = -1;
        }
        x += dx;
        y += dy;
    }

}

来自Window Class的简单“GameLoop”(如果需要)

 while (true){
            stuff.repaint();
            stuff.move();
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

1 个答案:

答案 0 :(得分:3)

您的move错了。它的逻辑是错误的。你希望球能够反弹,所以当它击中墙壁时,它的运动会反转。你所做的是:如果它在外面进入内部,当内部尝试将它带到外面时!改为:

   public void move(){
        if (x < 0) { // left bound
            dx = 1;  // now move right
        }
        if (y < 0){  // upper bound
            dy = 1;  // now move down
        }
        if (x > 600){// right bound
            dx = -1; // now move left
        }
        if (y >500){ // lower bound
            dy = -1; // now move up
        }
        x += dx;
        y += dy;
    }

为了将来的使用,我建议您按以下方式进行:

   public void move(){
        if (x < 0) {   // left bound
            dx = -dx;  // now move right, same speed
            x=-x;      // bounce inside
        }
        if (y < 0){    // upper bound
            dy = -dy;  // now move down, same speed
            y=-y;      // bounce inside
        }
        if (x > 600){      // right bound
            dx = -dy;      // now move left, same speed
            x=600-(x-600); // bounce inside
        }
        if (y >500){       // lower bound
            dy = -dy;      // now move up, same speed
            y=500-(y-500); // bounce inside
        }
        x += dx;
        y += dy;
    }

所以你现在可以使用你想要的任何矢量速度(至少是合理的速度)。矢量坐标相应于击中相反,球被重新定位在界限内。