我正在制作手机游戏,无法预测身体/精灵对的未来位置。我用来执行此操作的方法如下。
1 --futureX 作为 cocos2d 精灵的位置传入,使用 CCSprite.getPosition().x 找到
2 -- 我使用 b2Body 值来表示加速度和速度,所以我必须通过将 futureX 坐标除以 PTM_RATIO(在别处定义)来校正它
3 -- 该函数求解b2Body 到达futureX 位置所需的时间(基于其x 方向加速度和速度),然后使用该时间确定body 的futureY 位置应该在哪里。我最后乘以 PTM_RATIO 因为坐标是用来创建另一个精灵的。
4 - 在求解时间时,我有两种情况:一种是 x 加速度!= 0,另一种是 x 加速度 == 0。
5 -- 我正在使用二次公式和运动学方程来求解我的方程。
不幸的是,我正在创建的精灵不是我期望的。它最终位于正确的 x 位置,但是,Y 位置总是太大。知道为什么会这样吗?请让我知道这里还有哪些有用的信息,或者是否有更简单的方法来解决这个问题!
float Sprite::getFutureY(float futureX)
{
b2Vec2 vel = this->p_body->GetLinearVelocity();
b2Vec2 accel = p_world->GetGravity();
//we need to solve a quadratic equation:
// --> 0 = 1/2(accel.x)*(time^2) + vel.x(time) - deltaX
float a = accel.x/2;
float b = vel.x;
float c = this->p_body->GetPosition().x - futureX/PTM_RATIO;
float t1;
float t2;
//if Acceleration.x is not 0, solve quadratically
if(a != 0 ){
t1 = (-b + sqrt( b * b - 4 * a * c )) / (2 * a);
t2 = (-b - sqrt( b * b - 4 * a * c )) / (2 * a);
//otherwise, solve linearly
}else{
t2 = -1;
t1 = (c/b)*(-1);
}
//now that we know how long it takes to get to posX, we can tell the y location on the sprites path
float time;
if(t1 >= 0){
time = t1;
}else{
time = t2;
}
float posY = this->p_body->GetPosition().y;
float futureY = (posY + (vel.y)*time + (1/2)*accel.y*(time*time))*PTM_RATIO;
return futureY;
}