読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【cocos2d】パーティクルエフェクトをつけてみた

cocos2d

前回はあたり判定を実装し、被弾した敵キャラを抹消しました。しかし一瞬で消えてしまうのではやっつけた感が薄いので今回はパーティクルエフェクトで敵キャラを宇宙の塵にしたいと思います。パーティクルの粒は多数のスプライトなのですが、スプライトとして表示するより高速に大量に処理できます。また、スプライトと同様にバッチ処理できますので、それも試してみたいと思います。cocos2dには標準でサンプルとして何パターンかのパーティクルエフェクトのクラスが用意されていますので、今回はそれを使ってお手軽に実装します。爆発を演出するのにピッタリと思われるのがそのままの名前のCCParticleExplosion。せっかくなのでこれを使いましょう。

パーティクルを表示する処理はMyEnemyクラスのupdateメソッドであたり判定の結果がnilでないと判断したところに挿入します。CCParticleExplosionインスタンスを生成し、表示位置を敵キャラクターの位置に合わせ、親ノードであるバッチノードにaddChildすれば表示されます。
particle.autoRemoveOnFinish=YES;
という設定は重要です。これは、パーティクルの表示が終了したときに自動的にインスタンスをremoveすることを指定します。これを指定しないとパーティクルのインスタンスがどんどん生成され、しばらくすると打ち止めになりパーティクルが表示されなくなります。私はこれで少しハマりました。爆発など時間がくれば終了するタイプのパーティクルの場合はこれを使うと自動で親ノードから外れてくれるので便利ですね。炎や煙、雨など連続して表示するパーティクルの場合は表示をやめたいタイミングで手動で親ノードからremoveしてあげれば良いと思います。

- (void)update:(ccTime)delta
{
    // 当たり判定
    CCArray* array = [MySpriteBatch sharedMyBatch].children;
    CollisionSprite* hitObject = [[MyCollision sharedMyCollision]
                                  checkCollisionBetween:self andType:kMyShip | kMyBullet inArray:array];
    if (hitObject != nil) {
        [hitObject collisionDetectedWith:self];
        CCParticleExplosion* particle = [CCParticleExplosion node];
        particle.position = self.position;
        particle.autoRemoveOnFinish = YES;
        [[MyParticleBatch sharedMyBatch] addChild:particle];
//        [self removeFromParentAndCleanup:YES];
    }
}

パーティクル用に新たに作成したMyParticleBatchクラスの実装は次の通りです。このクラスを追加するのに伴い、以前MyBatchクラスという名前だったスプライト用のバッチノードクラスはMySpriteBatchクラスに改名しました。なお、バッチノードに指定しているfire.pngというファイルはcocos2dのテンプレートには含まれていないのでダウンロードしたcocos2dのフォルダからプロジェクトにコピーしてあげる必要があります。cocos2dバージョン2の場合は、cocos2d-iphone-2.0/Resources/Images/フォルダーの中にあります。

@implementation MyParticleBatch

+ (MyParticleBatch *)sharedMyBatch
{
    static MyParticleBatch* sharedInstance = nil;
    if (sharedInstance == nil) {
        sharedInstance = [self batchNodeWithFile:@"fire.png"];
    }
    return sharedInstance;
}

@end

スプライトバッチノードと同様こちらのバッチノードも同じテクスチャファイルを使うパーティクルしかaddできません。今は1種類のパーティクルしか使っていないのでファイルを直接指定していますが、複数のテクスチャが必要になった場合はこちらもテクスチャアトラスで対応可能だと思います。
で、実行画面がこちら。
f:id:takujidev:20130414104611p:plain
標準で用意されているCCParticleExplosionクラスはかなり華やかで広範囲に飛び散るので次回はもう少しリアルな爆発系パーティクルエフェクトを自作したいと思います。