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

キノコの自省録

テクノロジーとコンテンツの融合を目指して

パーティクルで魔法エフェクト(3) - 氷魔法編

関連記事

パーティクルで魔法エフェクト(1) - 炎魔法編 - キノコの自省録

パーティクルで魔法エフェクト(2) - 光魔法編 - キノコの自省録

f:id:kinokorori:20170327235357p:plain:w120

ウィッチクライドでは、いくつかの魔法をParticle Systemを使って表現しています。

今回は氷魔法を紹介。

氷魔法概要

前回も書きましたが、ウィッチクライドの攻撃魔法は、エフェクトを詠唱の長さに応じて3レベルに分けています。長いほど派手です。今回紹介するのは1レベル目。一番シンプルなエフェクトです。

ターゲットに雪の結晶っぽいパーティクルをワッと表示させ、外側に向かって移動+小さくなっていくエフェクトです。画像にするとこんな感じです。

f:id:kinokorori:20170410214620j:plain:w250f:id:kinokorori:20170410214622j:plain:w250f:id:kinokorori:20170410214623j:plain:w250

ムービーはこちら。

youtu.be

エフェクト実装解説

見た通り非常にシンプルで、基本は1秒間パーティクルシステムを表示しているだけです。パーティクル単体はこれです。実装にも使われています。完全不透明なので、アルファブレンディングしません。

f:id:kinokorori:20170410214913p:plain

パーティクルシステムの実装をそのまま載せておきます。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秒経過後にパーティクルを削除しています。