我正在做一个像乒乓球的游戏,除了只有一个球拍并且球以弹丸运动而运动。目的是使球尽可能长时间地在桨上弹跳。当我将球击中桨时,速度的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。
答案 0 :(得分:0)
您实际上并不是在进行反射...要通过主轴进行反射,您应该否定速度矢量的适当坐标(并校正位置),我在代码中没有看到这种行为。取而代之的是,无论向上/向下的方向如何,您的y速度都没有任何符号,因此您只需向其添加重力acc即可以纠正代码或将yreflection
添加到与重力相关的代码中...有θ?我只希望在第一次射击时能有角度
请参见
My Algorithm to Calculate Position of Smartphone - GPS and Sensors
您只使用/添加您想使用的力量。 但是在碰撞中,一旦检测到您在墙壁内,您还需要校正位置以及速度的反射,否则您将面临两次碰撞 ...
下面是带有空气摩擦的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>
它是这样的:
PS。您需要调整诸如增量时间dt
,加速度或添加像素比例等参数以满足您的需求...您需要使所有单位兼容...我建议使用 SI (m,m / s,m / s ^ 2,s,N,..),因此您还需要确定像素的大小(以米为单位)