0

開発しようとしているゲームに 3 つの異なる難易度レベル (イージー、ミディアム、ハード) を作成しようとしています。フラグを使用して 3 (簡単 = 1、中 = 2、難しい = 3) を区別します。今、簡単に速度を一定に設定し、中程度のときに20回の衝突後に速度を上げ、ハードが選択されたときに10回後に速度を上げる方法を見つけようとしています. これは私がそれを実装しようとしている方法です:

-(id)init)
{vel = 8;
counter = 0;}

-(void)update:(ccTime)dt{
_world->Step(dt, vel, 10);

    for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
        if (b->GetUserData() != NULL) {
            CCSprite *sprite = (CCSprite *)b->GetUserData();
            sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
                              b->GetPosition().y * PTM_RATIO);
            sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
        }
    }
    if((contact.fixtureA == _paddleFixture && contact.fixtureB == _ballFixture) || (contact.fixtureA == _ballFixture && contact.fixtureB == _paddleFixture))
    {
        counter++;
        [self updateSpeed];
    }
}

-(void)updateSpeed{
if(diffLevel == 2)
{
    if(counter%20 == 0)
    {
        vel = vel + 5;
    }
}
else if(diffLevel == 3)
{
    if(counter%10 == 0)
    {
        vel = vel + 10;
    }
}
else
{
    vel = 8;
}}

カウンターは機能しますが、カウンターが20または10で割り切れるたびに速度が増加しないようで、簡単なレベルでも一定の速度を得ることができません. それは非常に速く始まり、徐々に遅くなります。ここで何が間違っていますか?助けてください。

4

1 に答える 1

0

誰かが私にこれを提案し、それはうまくいくので、他の誰かがそれを必要とする場合に備えて投稿します:

- (void)update:(ccTime) dt {
    _world->Step(dt, 10, 10);
    for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
        if (b->GetUserData() != NULL) {
            CCSprite *sprite = (CCSprite *)b->GetUserData();
            if(sprite.tag == 2)
            {
                int maxSpeed = 140;

                b2Vec2 dir = b->GetLinearVelocity();
                dir.Normalize();

                float currentSpeed = dir.Length();
                float accelerate = vel;

                if(currentSpeed < maxSpeed)
                {
                    b->SetLinearVelocity(accelerate * dir);
                }

                sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
                                      b->GetPosition().y * PTM_RATIO);
                sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}}}

それは基本的に、私が変更を加えた私のコードの唯一の部分です。updateSpeed メソッドに計算を実行させて、ボールの最大速度を上げて設定します。

于 2013-03-07T05:24:51.167 に答える