0

空気中の速度に関する問題があります。

ジャンプと移動を同時に行うと、その時のプレイヤーの速度が上がります。ジャンプには衝動を使用し、移動には力を使用します。プレイヤーが空中にいるときに速度を落とす方法を知りたいです。

これが私の左右の動きのコードです

-(void)update:(ccTime)dt :(b2Body *)ballBody :(CCSprite *)player1 :(b2World *)world
{

    if (moveRight.active==YES) 
    {   
  //      maxSpeed=10.0f;
            ballBody->SetActive(true);
    //    b2Vec2 locationworld=b2Vec2(maxSpeed,0);
        double mass=ballBody->GetMass();
        ballBody->ApplyForce(mass*locationworld, ballBody->GetWorldCenter());
        ballBody->SetLinearDamping(1.2f);
    }
    else if(moveLeft.active==YES)
    {
            ballBody->SetActive(true);
        b2Vec2 locationworld=b2Vec2(-10,0);
        double mass=ballBody->GetMass();
        ballBody->ApplyForce(mass*locationworld, ballBody->GetWorldCenter());
    //    ballBody->SetLinearDamping(1.2f);

    }
}

そして、以下はジャンピングプレイヤー用です

-(void)jump:(b2Body*)ballBody:(ccTime)dt:(BOOL)touch
{
    if (touch) 
    {

        if (jumpSprte.active==YES) 
        {
            ballBody->SetActive(true);
            b2Vec2 locationWorld;
            locationWorld=b2Vec2(0,25);
            ballBody->ApplyLinearImpulse(locationWorld, ballBody->GetWorldCenter());

        }
    }
}

それで、どこでロジックを使用しましたか??

前もって感謝します

4

2 に答える 2

1

プレイヤーが空中で減速するには、空気抵抗をモデル化する必要があります。シミュレーションをどれだけ現実的にしたいかによって、これを行うにはいくつかの方法があります。単純なモデルの場合、linearDampening速度が低下します。

真の空気抵抗は線形ではありません。これをより現実的な方法でモデル化するには、次のようなものを使用する必要があります。

F = - C * v * |v| 
  • F空気抵抗の総力
  • Cオブジェクトの形状に依存する抗力定数
  • vは速度ベクトルです (|v|は速度の大きさ、または必要に応じて長さです)

また、プレイヤーは移動中に空中で速度を上げることができるようです。これは、プレーヤーが足が地面に触れていないときに力を加えることができるためです。これが目標である場合にこれを許可しないようにするには、キャラクターが地面に触れているときだけ、より多くの力を加えてキャラクターを動かせるようにします。

これはすべて、これをどのような種類のゲームにしたいかによって大きく異なることに注意してください。ゲーム用の物理演算を作成するときに、見た目と感触が良ければそれで良いのです。最終結果がうまく機能する限り、完全に正確な現実のシミュレーションを行うことができなくても、ストレスを感じないでください。

于 2012-09-05T06:30:13.657 に答える
0

これが私の左右の動きのコードです

-(void)update:(ccTime)dt :(b2Body *)ballBody :(CCSprite *)player1 :(b2World *)world
{

    if (moveRight.active==YES) 
    {   
  //      maxSpeed=10.0f;
            ballBody->SetActive(true);
    //    b2Vec2 locationworld=b2Vec2(maxSpeed,0);
        double mass=ballBody->GetMass();
        ballBody->ApplyForce(mass*locationworld, ballBody->GetWorldCenter());
        ballBody->SetLinearDamping(1.2f);
    }
    else if(moveLeft.active==YES)
    {
            ballBody->SetActive(true);
        b2Vec2 locationworld=b2Vec2(-10,0);
        double mass=ballBody->GetMass();
        ballBody->ApplyForce(mass*locationworld, ballBody->GetWorldCenter());
    //    ballBody->SetLinearDamping(1.2f);

    }
}

そして、以下はジャンピングプレイヤー用です

-(void)jump:(b2Body*)ballBody:(ccTime)dt:(BOOL)touch
{
    if (touch) 
    {

        if (jumpSprte.active==YES) 
        {
            ballBody->SetActive(true);
            b2Vec2 locationWorld;
            locationWorld=b2Vec2(0,25);
            ballBody->ApplyLinearImpulse(locationWorld, ballBody->GetWorldCenter());

        }
    }
}

それで、どこでロジックを使用しましたか??

于 2012-09-05T06:50:43.083 に答える