0

私は、6 つの銃を持つ宇宙船を持っている OpenGL ES アプリケーションに取り組んでいます。各銃は、キーフレーム アニメーションを使用して、開始位置と終了位置の 2 セットの頂点間を補間します。

rotateGun:どの銃を発射するかを参照する gunNumber 変数を渡すメソッドがあります。発砲するrotateGun:と、メソッドが呼び出されたときに砲身の位置で下向きのベクトルを介して船から遠ざかるレーザー爆風が作成されます。これはすべて正常に機能しますが、各銃が同時に発砲しているように見えるため、発砲する各銃にランダムな時間間隔を追加したいと考えています。

時間遅延を作成し、rotateGun: メソッドを使用して起動しようとしましたperformSelector:afterDelay:が、これは機能しません。mainGunFire:次に、遅延の後にメソッドを使用してから、メイン スレッドで呼び出しを試みましたが、rotateGun:これも機能しませんでした。「機能しなかった」とは、メソッド内で描画呼び出しの直前に挿入した NSLogrotateGun:が印刷されることを意味しますが、銃と爆発は描画されません。

単純に performSelectorOnMainThread を呼び出して を実行するとrotateGun:、銃と爆風が以前のように描画され、爆風が同時に発砲しているように見えます。私は明らかに何かを理解していません。誰かが私のレーザーブラストを少しランダム化して、すべてが同時に発射されないようにする方法を理解するのを手伝ってもらえますか? ありがとう!

// Randomly Fire Gun
- (void)mainGunFire:(NSNumber *)gunNumber {

    // Perform the Gun animation and fire on main thread
    [self performSelectorOnMainThread:@selector(rotateGun:) withObject:gunNumber waitUntilDone:YES];

}

// Draw and Rotate the Guns
- (void)drawRotateGuns {

    // Only shoot if this is not a ship life
    if ( self.isLife == NO ) {

        // Gun 1

        // Set the pass variable to 1 and call the method
        // after a variable amount of time
        int randomTime = 0;
        //[self performSelector:@selector(mainGunFire:) withObject:[NSNumber numberWithInt:1] afterDelay:randomTime];
        [self performSelectorOnMainThread:@selector(rotateGun:) withObject:[NSNumber numberWithInt:1] waitUntilDone:YES];

        // Gun 2 ...

        // Gun 3 ...

    }
}
4

1 に答える 1

0

最も簡単な解決策は!(rand()%some_number)、1の代わりに使用することです。値を試してsome_numberください(銃ごとに異なる必要があります)。しかし、それはそれほど大きくないはずです。

たとえば、2を使用する場合、確率!(rand()%2) == 1は約0.5です。したがって、1秒あたり60フレームをレンダリングする場合、1秒あたり約30回の火災が発生します。!(rand()%20)の場合、1秒間に約3回の火災が発生するはずです。あなたがそれを手に入れることを願っています。いくつかの擬似コード:

if( !(rand()%2) ) {
     [gun1 fire];
}

if( !(rand()%3) ) {
     [gun2 fire];
}
于 2012-02-06T23:03:22.667 に答える