パーティクルでリアルな表現
パーティクルというCGの技術があります。
炎や水といった自然界の曖昧なものを、小さな粒子の集合によって表現する手法です。
これも物理シミュレーションと同じく自分で実装しようとすると大変ですが、Sprite Kitにはこの機能も専用エディタと共にビルトインされています。
早速、炎を表示してみましょう。
New File…からSpriteKit Particle File
を選択します。
SpriteKit Particle File
Particle templateはFire
を利用します。
Fire
これをfire.sks
として保存し、Xcodeで開くと以下のようなエディタが表示されます。
Particle Emitter Editor
Particle Emitter Editor上では、パーティクルをGUIで様々にカスタマイズ可能です。例えばColor Rampを修正するだけで、青い炎を作ることができます。
青い炎
sksファイルを使ってパーティクルを画面に表示するには、SKEmitterNode
を利用します。
SJParticleScene
を作成し、以下のようなコードを記載しましょう。
青い炎
たったこれだけで、リアルな炎を表示することができました。
ただ、表示するだけではありがたみが少ないので、ボールに剣があったら爆発して消えるようにしてみましょう。
まずはボールをいくつか配置し、重力を反転させて、浮かべておきます。
ボール
ここに剣を飛ばしてボールを破壊してみましょう。
剣の飛ばし方としては、SKActionのmoveTo:duration
を使うことも考えられますが、ここでは重力を無視しておいて、力を加えることで飛ばしています。
affectedByGravity
が重力の影響を受けるかどうか、velocity
が加える力を設定するプロパティです。
また、自分の剣同士がぶつかるのはおかしいため、collisionBitMask
を設定しています。
categoryBitmask
によってそれぞれの物体にカテゴリを設定し、collisionBitMask
には衝突させたい物体のカテゴリを指定します。
これによって、ボールはボールと剣、剣はボールのみと衝突します。
ボールには何も設定していませんが、これは、デフォルトで他の物体とぶつかるようになっているためです。
なお、剣のphysicsBodyはノードの大きさそのままだと他の物体に衝突しすぎてしまうため、小さめにしています。
今回の剣のように速く動くものや、小さいものは、usesPreciseCollisionDetection
を指定することで正確に判定できます。
ただし、高コストになるので注意しましょう。
剣を飛ばす
これで剣を飛ばすことができるようになりました。
次に剣とボールがぶつかった時に爆発させる処理です。これには所謂当たり判定の実装が必要ですが、これにも物理エンジンが利用できます。
collisionBitMask
と同じ要領で、contactBitMask
を設定すれば2つの物体が接触したときにdelegateメソッドが呼ばれるようになるため、そこで必要な処理をおこないます。
実装は以下のようになります。
sword
のcontactBitMask
は、画面の枠とボールと接触するように設定します。
didBeginContact:
が肝です。
渡されてくる物体の順番は順不同のため、最初のif文でsword
が先に来るように2つの物体を並び替えています。
そして、swordがballと接触した場合、sparkのパーティクルを一瞬だけ表示すると共に、2つの物体を削除しています。
また画面の枠と接触した場合は、sword
をただ削除するようにしています。
sparkのパーティクルはParticle templateをSpark
にして、デフォルトのままのものを利用しています。
ボールを破壊
このように、Sprite Kitのパーティクル機能を使えば、手軽にゲームの表現力を向上させることができます。
comments powered by