2

我正在制作手机游戏,无法预测身体/精灵对的未来位置。我用来执行此操作的方法如下。

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;
}
4

1 回答 1

1

解决了:

问题出在这一行:

float futureY = (posY + (vel.y)*time + (1/2)*accel.y*(time*time))*PTM_RATIO;

我需要明确地将 (1/2) 转换为浮点数。我用这个修复了它:

float futureY = (posY + (vel.y)*time + (float).5*accel.y*(time*time))*PTM_RATIO;

请注意,否则,加速度项被评估为零。

于 2013-03-11T01:09:23.230 回答