2

モバイルゲームを作成中ですが、ボディとスプライトのペアの将来の位置を予測するのに問題があります。これを行うために私が使用している方法は以下のとおりです。

1 --futureXは、CCSprite.getPosition()。xを使用して検出されたcocos2dスプライトの場所として渡されます。

2-私は加速度と速度にb2Body値を使用しているので、futureX座標をPTM_RATIO(他の場所で定義)で割って修正する必要があります

3--関数は、b2BodyがfutureX位置に到達するのにかかる時間を解決し(x方向の加速度と速度に基づいて)、その時間を使用して、ボディのfutureY位置を決定します。座標は別のスプライトを作成するために使用されるため、最後にPTM_RATIOを掛けます。

4--時間を解くとき、2つのケースがあります。1つはx加速度!= 0で、もう1つは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 に答える