2012-03-31 5 views
0

私は方向パッドと2つのボタンを備えたゲームパッドを持っています。それらはすべてデジタル(アナログではない)です。Cocos2d。火災(弾丸)の迅速性(速度)を低下させるか?

私は彼らのイベントを処理するための手順があります。

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

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

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

[船の撮影は]武器クラスからシュート関数を呼び出します。

-(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]; 
} 

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

答えて

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

Steffen Itterheimの「learn cocos2d game development」ブックの元のコードです。 しかし、私は少しこのコードを改善することができます。

オリジナルのものよりも私のコードを理解することは困難ですが、それは正しい構造を持って更新しました。次のことを意味します。 - グローバルタイマーはシーンに属します。 - 船は武器で撃つことができます。

: - 弾丸と弾丸の間の遅延で撮影できる武器は、この武器(ないオリジナルの例のようにシーン)

シーンクラスはTOTALTIME変数、船のオブジェクトが含まれており、タイマーの更新を処理するために、以下の方法に属し

-(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]; 
    } 
} 

Shipクラスには、武器オブジェクトとシュートメソッドが含まれています(この方法では実際の方法ではありません)。

-(void)updateNextShotTime:(ccTime)currentTime 
{ 
    nextShotTime = currentTime + 0.05f; 
} 
1

デルタを使用して撮影間の時間を記録し、デルタが一定量増加した場合にのみ撮影します。これは、あらゆるフレームを必要としないことを行う一般的な方法です。

iVarカウンタの時間を経過させ、各撮影ごとにデルタでカウントアップし、希望の間隔のしきい値を満たしているかどうかを調べる必要があります。そうであれば、時間を刻んで0にリセットしてください。

+0

+1が、私は同じことの具体的な例を発見した:

武器クラスはnextShotTime変数と次のような方法が含まれています。誰もがそれを投稿しようとしないなら – Gargo

関連する問題