パーティクルで魔法エフェクト(3) - 氷魔法編
関連記事
パーティクルで魔法エフェクト(1) - 炎魔法編 - キノコの自省録
パーティクルで魔法エフェクト(2) - 光魔法編 - キノコの自省録
ウィッチクライドでは、いくつかの魔法をParticle Systemを使って表現しています。
今回は氷魔法を紹介。
氷魔法概要
前回も書きましたが、ウィッチクライドの攻撃魔法は、エフェクトを詠唱の長さに応じて3レベルに分けています。長いほど派手です。今回紹介するのは1レベル目。一番シンプルなエフェクトです。
ターゲットに雪の結晶っぽいパーティクルをワッと表示させ、外側に向かって移動+小さくなっていくエフェクトです。画像にするとこんな感じです。
ムービーはこちら。
エフェクト実装解説
見た通り非常にシンプルで、基本は1秒間パーティクルシステムを表示しているだけです。パーティクル単体はこれです。実装にも使われています。完全不透明なので、アルファブレンディングしません。
パーティクルシステムの実装をそのまま載せておきます。Cocos-2d2なので、Objective-Cですが、他のパーティクルシステムでも基本大差ありません。
+ (CCParticleSystem*)particleIce { CCParticleSystem* particle = [CCParticleSystemQuad node]; particle.texture = [[CCTextureCache sharedTextureCache] addImage:@"ice@2x.png"]; particle.totalParticles = 20; particle.life = 1.0; particle.lifeVar = .3; particle.startSize = 60; particle.startSizeVar = 20; particle.endSize = 0; particle.endSizeVar = 0; particle.angle = 0; particle.angleVar = 360; particle.startSpin = 0; particle.startSpinVar = 360; particle.endSpin = 0; particle.endSpinVar = 360; particle.position = ccp(0,0); particle.posVar = ccp(10,10); //emitter setting particle.emissionRate = 400; particle.emitterMode = kCCParticleModeGravity; particle.duration = .3; particle.speed = 50; particle.speedVar = 20; particle.gravity = ccp(0, 0); particle.radialAccel = .2; particle.radialAccelVar = 0; particle.tangentialAccel = .3; particle.tangentialAccelVar = 0; //Color setting particle.startColor = ccc4f(5.0, 6.0, 1.0, 0.6); particle.endColor = ccc4f(1.0, 1.0, 1.0, 0.4); particle.startColorVar = ccc4f(0, 0.03, 0.01, 0); particle.endColorVar = ccc4f(0.04, 0.02, 0.02, 0); particle.autoRemoveOnFinish = YES; return particle; }
ポイントとしては、まずターゲット中央付近、(-10,-10)〜(10,10)にエミッションします。
particle.position = ccp(0,0); particle.posVar = ccp(10,10);
さらに、パーティクルに回転をかけます。
particle.startSpin = 0; particle.startSpinVar = 360; particle.endSpin = 0; particle.endSpinVar = 360;
進行方向を360°全方位として、速度を30〜70の間に設定します。
particle.angle = 0; particle.angleVar = 360; particle.speed = 50; particle.speedVar = 20;
パーティクル終了時のサイズを0に固定しているので、どんどん小さくなります。
particle.endSize = 0; particle.endSizeVar = 0;
主な設定値はこんなところです。ゲーム中では、1秒経過後にパーティクルを削除しています。