100分求助球碰撞杯子算法
正在做一个游戏,球从地上弹上去之后可能碰到杯子,球为变速运动,可能碰到杯子的内外壁。求检测算法。
我写的bug太多了,求修改或可以用的。
已知球半径r。杯子的宽width、高height、厚度thick。
可以计算球的坐标ball.x和ball.y杯子的坐标cup.x和cup.y。
这是我的球运动轨迹计算公式。给它一个速度v。算出单位时间的位移dx和dy。然后计算新的坐标x,y。
dx=v*cos;
x=x+dirx*dx;
dy=v*sin-10*T;
y= y-(v*sin*diry-10*T);
dx和dy可以代表每个单位时间的位移。如果水平方向碰到障碍物(如:杯子),则T=0,dirx=-0.5dirx,diry=0。这样竖直方向以重力加速度下降,水平方向速度反向,大小减为一半,就可以反向减速运动。如果竖直方向只有水平方向碰撞,则把竖直方向速度置零,以重力加速度下降。水平速度不变。知道接触地面。
由于球是变速运动,所以有时检测到碰撞时球已经运动过检测线了。所以要y=~~~~或者x=~~~来修正它的位置。
这下就到了与球的碰撞检测上了:
if(x>=cup.x&&x<=cup.x+Cup.width&&###########)//杯底内部
{
y=cup.y+Cup.height-Cup.thick-r;
state=GOAL_STATE;
}
if(x>=cup.x&&x<=cup.x+Cup.width&&##########) //杯外底部
{
y=cup.y+Cup.height+r;
diry=0;
T=0;
}
if(y>=cup.y&&y<=cup.y+Cup.height&&##########) ////杯内部左边
{
x=cup.x+Cup.thick+r;
dirx=-0.5dirx;
diry=0;
T=0;
}
if(y>=cup.y&&y<=cup.y+Cup.height&&##########)//杯外部左边
{
x=cup.x-r;
dirx=-0.5dirx;
diry=0;
T=0;
}
if(y>=cup.y&&y<=cup.y+Cup.height&&##########)//杯内部右边
{
x=cup.x+Cup.width-Cup.thick-r;
dirx=-0.5dirx;
diry=0;
T=0;
}
if(y>=cup.y&&y<=cup.y+Cup.height&&##########)//杯外部右边
{
x=cup.x+Cup.width+r;
dirx=-0.5dirx;
diry=0;
T=0;
}
求补全#########代表的判断碰撞代码。
谢谢。