在一个圆圈内弹出一个球

时间:2015-01-27 05:10:33

标签: java math geometry angle bounce

我有一个Pong-360游戏,其中弧形桨转向应该留在圆形边界内的球。如果球在到达边界时没有遇到桨,则它继续超出界限并且球员持续击球得分。我遇到的问题是在用桨冲击时将球以正确的方向返回。如果球接触桨的某一半,它应该朝那个方向反弹,但在任何情况下都应该返回到边界的另一侧而不会再次击中边界的同一侧。

Screenshot of game with added notes现在我已经通过将边界划分为16个切片并在一个范围内给出一个随机角度来完成弹跳,该范围取决于它在撞击时所处的切片。即使这不能按预期工作,因为我的数学不正确,但需要以任何方式重做。我无法弄清楚如何获得一个角度,以确保球返回到边界的另一半,无论它被击中的位置。我已经多次尝试从变量中获取角度,例如球的行进方向,边界内的当前位置以及接触的桨的位置,但到目前为止,我经历过失败。目前,改变球的方向的代码如下:

    public void bounce(){

        boolean changeAngle = false;

        if( bluePaddle.intersects( ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter() ) ){

            lastHit = 1;
            changeAngle = true;
        }
        else if( redPaddle.intersects( ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter() ) ){

            lastHit = 2;
            changeAngle = true;
        }

        if ( changeAngle ){

            //  Right side of boundary
            if ( ball.getX() > center_x ) {

                //  Quadrant 4
                if ( ball.getY() > center_y ){

                    //  Slice 13
                    if ( ball.getY() - center_y > Math.sin(3 * Math.PI / 8) ){                      
                        angle = (double) ( randNum.nextInt(90) + 90 );
                    }
                    //  Code for other slices omitted
                }//end Quadrant 4
                // Code for other quadrants omitted
            }//end right side of boundary

            //  Code for Left side of boundary omitted

            ball.setDx( (int) (speed * Math.cos(Math.toRadians(angle))) );
            ball.setDy( (int) (speed * Math.sin(Math.toRadians(angle))) );
        }//end if (changeAngle)

        bouncing = false;       
    }//end bounce method

正如您所看到的,就像现在一样,角度只是在我认为对每个切片都有好处的范围内随机生成。要强调的是,我主要需要数学方面的帮助,用Java实现它是次要的。编译和运行的整个代码(所有.java和.class文件)可以在这里找到:https://github.com/pideltajah/Pong360/tree/master/Pong360

主要方法是在Pong.java文件中。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,找到它在桨上的位置。你可以这样做,在红色桨的情况下(蓝色桨将类似,但你可能需要交换ang0和ang1):

桨的边缘由圆上的两个角度定义,ang0和ang1,其中ang0是下边缘,ang1是上边缘

假设圆心是点(0,0),球在点pBall =(xBall,yBall)

在[ang0 .. ang1]

范围内球将处于某个角度ballAng = atan2(yBall,xBall)

现在将其在球拍上的角度位置转换为[0 .. 1]之间的参数。 您可以将其定义为

u = (ballAng - ang0) / (ang1 - ang0);

现在您要将其映射到中心线,如下所示:

假设圆心线的底部位置是点p0,中心线的顶部是点p1

现在将中心线的交点定义为

p = p0 + u * (p1 - p0)

作为球的速度矢量,这需要是归一化差矢量

velBall = normalize(p - pBall)

希望这是有道理的

[编辑:做了更正]