0

方向パッドと2つのボタンが付いたゲームパッドがあります。それらはすべてデジタルです(アナログではありません)。

私は彼らのイベントを処理するための手順を持っています:

-(void)gamepadTick:(float)delta
{
    ...
    if ([gamepad.B active]) {
        [ship shoot];
    }
    ...
}

そして、私はそれをコマンドで呼び出します:

[self schedule:@selector(gamepadTick:) interval:1.0 / 60];

[ship shoot]は、武器クラスからshoot関数を呼び出します。

-(void)shoot
{
    Bullet *bullet = [Bullet bulletWithTexture:bulletTexture];
    Ship *ship = [Ship sharedShip];
    bullet.position = [ship getWeaponPosition];
    [[[CCDirector sharedDirector] runningScene] addChild:bullet];

    CGSize winSize = [[CCDirector sharedDirector] winSize];
    int realX = ship.position.x;
    int realY = winSize.height + bullet.contentSize.height / 2;
    CGPoint realDest = ccp(realX, realY);

    int offRealX = realX - bullet.position.x;
    int offRealY = realY - bullet.position.y;
    float length = sqrtf((offRealX*offRealX) + (offRealY*offRealY));
    float velocity = 480/1; // 480pixels/1sec
    float realMoveDuration = length / velocity;

    [bullet runAction:[CCSequence actions:[CCMoveTo actionWithDuration:realMoveDuration position:realDest],
                       [CCCallFuncN actionWithTarget:self selector:@selector(bulletMoveFinished:)], nil]];
}

-(void)bulletMoveFinished:(id)sender
{
    CCSprite *sprite = (CCSprite *)sender;
    [[[CCDirector sharedDirector] runningScene] removeChild:sprite cleanup:YES];
}

問題は、武器が弾丸を発射しすぎることです。ボタンや方向パッドごとに別々のタイマーや機能を使用せずに、その量を減らすことは可能ですか?

4

2 に答える 2

1

デルタを使用して撮影間の時間を追跡し、デルタが特定の量だけ増加した場合にのみ撮影します。これは、すべてのフレームで必要としないことを行うための一般的な方法です。

経過時間のiVarカウンターを保持し、撮影ごとにデルタ単位でインクリメントしてから、経過時間をテストして、目的の間隔しきい値を満たしているかどうかを確認する必要があります。含まれている場合は、撮影して経過時間を0にリセットします。

于 2012-04-01T05:38:22.607 に答える
0
-(void) update:(ccTime)delta {
totalTime += delta;
if (fireButton.active && totalTime > nextShotTime) {
    nextShotTime = totalTime + 0.5f;
    GameScene* game = [GameScene sharedGameScene];
    [game shootBulletFromShip:[game defaultShip]];
}
// Allow faster shooting by quickly tapping the fire button if (fireButton.active == NO)
{
    nextShotTime = 0;
}
}

これは、SteffenItterheimによる「learncocos2dgamedevelopment」の本からのオリジナルコードです。しかし、私はこのコードを少し改善することができます。

更新しました

私のコードは元のコードよりも理解しにくいですが、正しい構造になっています。これは、次のことを意味します。-グローバルタイマーはシーンに属します。-船は武器で撃つことができます。-武器は弾丸で撃つことができ、弾丸間の遅延はこの武器に属します(元の例のようなシーンではありません)

シーンクラスには、totalTime変数、shipオブジェクト、およびタイマーの更新を処理するための次のメソッドが含まれています。

-(void)update:(ccTime)delta
{
    totalTime += delta;

    if (!fireButton.active) {
        ship.weapon.nextShotTime = 0;
    } else if (totalTime > ship.weapon.nextShotTime) {
        [ship.weapon updateNextShotTime:totalTime];
        [ship shoot];
    }
}

船のクラスには、武器オブジェクトと狙い撃ち法が含まれています(この方法はこの質問では実際のものではありません)。

武器クラスには、nextShotTime変数と次のメソッドが含まれています。

-(void)updateNextShotTime:(ccTime)currentTime
{
    nextShotTime = currentTime + 0.05f;
}
于 2012-04-13T08:21:35.750 に答える