0

最近、パワーアップの実装に関する質問をしました。しかし、私はそれを別の方法で進めたいと決心しました。

私のゲームでは、無限にスクロールする背景があり、主人公はコインを集めながら右に移動します。

プレイヤーが青いコインを押すと、パワーアップします。1. キャラクターを青色に変更します (このためのフレームがあります)、2. 背景を青色に変更し、3. プラットフォームを青色に変更します。 (このための画像があります); これらすべての要因が 20 秒間発生することを望みます。

他のクラス (Platform クラス、Player クラス) で、青のインスタンス変数 (パブリック変数) を持つBlueクラスを用意し、それに応じて (青のコインがヒットした場合) YES と NO に設定することで、これを行うことを計画しました。しかし、タイマーを組み込むと効率が悪くてうまくいきません。

パワーアップを実装する方法を知っている人はいますか?

これは、プレーヤーが青いコインを打ったときの私のコードです。

    // try remove blue coin
    - (void) tryRemoveBluecoin
    {
    NSMutableArray * currentBluecoinArray = [self getcurrentBluecoinArr];

    if(currentBluecoinArray)
    {
        int playerY = ((CCLayer*)(self.player)).position.y;
        for(int x=0; x<[currentBluecoinArray count];x++)
        {
            CCSprite *bluecoin = [currentBluecoinArray objectAtIndex:x];

            if(abs(bluecoin.position.x+bluecoin.parent.position.x-[Player initX])<50)
            {
                if(abs(bluecoin.position.y+bluecoin.parent.position.y-playerY)<30 && bluecoin.visible && bluecoin.visible)
                {
                    [bluecoin.parent removeChild:bluecoin cleanup:YES];

                    CGSize winSize = [[CCDirector sharedDirector] winSize];
                    [[SimpleAudioEngine sharedEngine] playEffect:@"jump.wav" pitch:1 pan:0 gain:1];

                    // SET BLUE VARIABLE TO YES

                    NSLog(@"BEGIN BLUE POWER UP EFFECTS FOR 20 SECONDS");

                }
            }
        }
    }


    [self hitTestOB];
}

あなたが持っているアイデアをありがとう!

4

1 に答える 1

0

さて、前回Cocos2dを使ってからずいぶん経ちましたが、実はノードに色情報を設定できることをご存知でしょうか?これは、ダウンするためのはるかに賢明な方法のように聞こえます。これを念頭に置いてスプライトを設計し、色を付ける必要があるすべての要素を含む配列を保持してください。

ゲームの状態に基づいて新しい色を定義するメソッドを用意します。たとえば、ゲームの状態の列挙型をパワーアップの NSInteger プロパティと一致させることができます。ccColor3B 色;

// _state being an NSInteger ivar
// the different states defined in an enum

switch (_state) {
    case gameStateBlue:
        color = ccc3(0, 0, 255);
        break;
    case gameStateGreen:
        color = ccc3(0, 255, 0);
        break;
    default:
        break;

        // etc.
}

この色情報を、次のようにスプライトの配列を処理するメソッドに送信します。

for (CCSprite *sprite in _arrayOfSpritesToChangeColor) {
    sprite.color = color; 
}

これには、アセットを事前に計画する必要がありますが、さまざまな色や効果を試してみたい場合は、より柔軟に行う必要があります。負担が大幅に軽減されるだけでなく、目的を達成するために多数のアセットを交換する必要がなくなります。さて、私のココスはかなり錆びているので、細部を台無しにしたかもしれませんが、一般的な考え方は正しいはずです.

編集:配列内のスプライトへの参照を保持する代わりに、独自のスプライト サブクラスを持ち、そのサブクラスに CCSprite colorSprite プロパティを持たせることができます。次に、シーンの子をループして、このプロパティを持つスプライトを変更できます。

于 2013-11-08T19:26:38.053 に答える