不能在不弄乱重力的情况下翻转球的方向

时间:2018-12-04 16:02:56

标签: java graphics physics game-development

我正在做一个像乒乓球的游戏,除了只有一个球拍并且球以弹丸运动而运动。目的是使球尽可能长时间地在桨上弹跳。当我将球击中桨时,速度的y分量的方向将其符号翻转。这样做的问题是,当球向上移动时,重力会沿该方向作用,从而加快速度。代码在下面

这是我的球类的代码,这是tick方法,每秒调用60次

public Ball(double x, double y, Game game) {
    super(x,y);
    this.game=game;
}
public void tick() {
        time+=1.0/60.0;
        if(x<=0)
            xreflection=1.0;
        else if(x>=Game.Width-15)
            xreflection=-1.0;
        if(y<=0)
            yreflection=1.0;
        else if(y>=Game.Height-15)
            gameover=1;//different variable here as I use this to end the game if the ball hits the bottom of the screen
    x+=traj.xvel()*xreflection;
    y-=traj.yvel(time)*yreflection;

    if(Physics.Collision(this, game.getP())) {
    time=2;
        System.out.println("Collision");
        yreflection=-1;

    }

}

这是我的Ball Trajectory类,它处理所有与此相关的数学运算

public double xvel() {
    double xvelo=initvel*Math.cos(Math.toRadians(theta));
    return xvelo;
}

public double yvel(double time) {
    double yvelo;
        yvelo=initvel*Math.sin(Math.toRadians(theta))-(9.8*time);
    return yvelo;
}

我尝试使用带有y反射的if语句在yreflection为1时使9.8为负,而在-1时为9.8。

1 个答案:

答案 0 :(得分:0)

您实际上并不是在进行反射...要通过主轴进行反射,您应该否定速度矢量的适当坐标(并校正位置),我在代码中没有看到这种行为。取而代之的是,无论向上/向下的方向如何,您的y速度都没有任何符号,因此您只需向其添加重力acc即可以纠正代码或将yreflection添加到与重力相关的代码中...有θ?我只希望在第一次射击时能有角度

请参见

下面是带有空气摩擦的C ++示例:

//---------------------------------------------------------------------------
double pos[2],vel[2],acc[3],r;  // ball
double x0,y0,x1,y1;             // walls
//---------------------------------------------------------------------------
void ball_update(double dt)
    {
    int i;
    double v,k=0.0001,g=9.81;
    dt*=10.0;                                   // time multiplier for simulation speed ...
    // compute driving force/acceleration
    v=sqrt((vel[0]*vel[0])+(vel[1]*vel[1]));    // |vel|
    acc[0]=  -(k*vel[0]*v);                     // gravity + air friction (k*vel^2)
    acc[1]=+g-(k*vel[1]*v);
    // Newton/D'Alembert simulation
    for (i=0;i<2;i++) vel[i]+=acc[i]*dt;
    for (i=0;i<2;i++) pos[i]+=vel[i]*dt;
    // colision/reflect
    if (pos[0]<x0+r){ pos[0]=x0+r; vel[0]=-vel[0]; }
    if (pos[0]>x1-r){ pos[0]=x1-r; vel[0]=-vel[0]; }
    if (pos[1]<y0+r){ pos[1]=y0+r; vel[1]=-vel[1]; }
    if (pos[1]>y1-r){ pos[1]=y1-r; vel[1]=-vel[1]; }
    }
//---------------------------------------------------------------------------
void ball_init()
    {
    Randomize();
    pos[0]=0.5*(x0+x1);
    pos[1]=0.5*(y0+y1);
    double a=2.0*M_PI*Random(),v=50.0;
    vel[0]=v*cos(a);
    vel[1]=v*sin(a);
    r=20.0;
    }
//---------------------------------------------------------------------------

我的坐标系是(0,0)在左上角,x在右角,y在下... 要使用此功能,只需x0,y0,x1,y1调用墙ball_init(),然后调用ball_update(dt),然后在pos和半径r处渲染球... < / p>

它是这样的:

preview

PS。您需要调整诸如增量时间dt,加速度或添加像素比例等参数以满足您的需求...您需要使所有单位兼容...我建议使用 SI (m,m / s,m / s ^ 2,s,N,..),因此您还需要确定像素的大小(以米为单位)