0

投稿(例:これまたはこれ)を考慮して悪用されたトピックですが、私はまだ静かに私が欲しいものを手に入れることができません。

私はシューティングゲームに取り組んでおり、敵が攻撃されたときに(プレーヤーだけでなく)敵を照らしたいと思っています。

次のコマンドを実行すると、スプライトが白くなりません。これは正しい方向ですか?

-(void) gothitAnimation
{
ccColor3B originalColor = self.color;
id delay = [CCDelayTime actionWithDuration:0.4f];
[self runAction:[CCSequence actions: [CCTintTo actionWithDuration:0.01f red:255 green:240 blue:240], delay, [CCTintTo actionWithDuration:0.01f red:originalColor.r green:originalColor.g blue:originalColor.b] ,  nil]];
}

CCTintToアクションのみを実行しようとしましたが、白とは異なる色でのみ機能します。

私はアロディウスのゲームデモを見つけました。そこでは、プレイヤーの船がヒットしたとき、またはより低いエネルギーレベルでの短い一連のアクションで非表示と表示に複数回設定されているようです( このデモを参照)。また、敵は攻撃されると軽い効果を得る。

これがどのように達成されたかについてのアイデアはありますか?開発者はCCTintToアクションまたは他の何かを使用しましたか?私は彼が爆発のためにParticleEffectsを使用したことを知っています。

4

2 に答える 2

3

スプライトのデフォルトの色合いは白です。そのため、白に着色したり、着色でスプライトを明るく見せたりすることはできません。

点滅は、表示プロパティを一定の間隔でオンとオフに設定することで実現できます。これを行う1つの方法は、CCBlinkアクションを使用することです。

最善の策は、パーティクルエフェクトを使用することです。cocos2d 2.0を使用していて、この特定の効果のフラグメントシェーダーを作成する場合にのみ、真の照明効果を実現できます。

于 2012-07-27T16:34:21.763 に答える
2

私は最近同じことをする必要があり、ピクセルシェーダーを扱いたくありませんでした。テクスチャをシーンにブレンドして、ある種の白いフラッシュをシーンから取り除く方法をいじることができると思いました。

そこで、スプライトのDestination glBlend関数をGL_ONE_MINUS_SRC_ALPHAからGL_ONEに繰り返し変更してから、元に戻すことで、妥当なライトフラッシュ効果を見つけました。

これが私のトグル方法です:

-(void)toggleBlendFlash {
    if (sprite_) {
        ccBlendFunc blendFunc = sprite_.blendFunc;
        if (blendFunc.dst == GL_ONE_MINUS_SRC_ALPHA) {
            blendFunc.dst = GL_ONE; //flash white
        } else {
            blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA; //default
        }
        sprite_.blendFunc = blendFunc;
    }
}

これが私の点滅シーケンスです:

CCSequence *sequence =
        [CCSequence actions:
         [CCCallFunc actionWithTarget:targetEnemy selector:@selector(toggleBlendFlash)],
         [CCDelayTime actionWithDuration:0.3],
         [CCCallFunc actionWithTarget:targetEnemy selector:@selector(toggleBlendFlash)],
         [CCDelayTime actionWithDuration:0.2], nil ];

あなたの状況には完璧に見えないかもしれませんが、試してみてください!


編集1:また、詳細情報/リソースについては、これらのリンクを確認してください。

編集2:

もちろん、スプライトが異なるCCTexture2Dオブジェクト間でアニメーション化されている場合(たとえば、フレームごとに1つのファイルがある場合)、フレームごとにblendFuncがリセットされます。つまり、CCSpriteのカテゴリまたはサブクラスを作成する必要があります。 CCAnimateを使用して、カスタムのblendFuncを再適用します...したがって、当初考えていたほど迅速な解決策ではないと思います。

于 2012-07-27T17:52:44.787 に答える