プレイグラウンドに雨を降らせる
まずは、最も単純なパーティクルの使用例を示しましょう。プレイグラウンドの画面に雨を降らせるというものです。これは雨粒のような小さなパーティクルが、画面の上から下に向かって落ちていくもので、そう言われれば雨のように見える、という程度のものと考えてください。
このプログラムは、シーン(SKScene)のdidMoveメソドdの中でパーティクルの設定をすべて完了し、後は何もしない、つまりプログラムを終了するまで雨を降らせっぱなしにするというものです。
ここでは、パーティクルファイルを読み込むために、見慣れないBundleというクラスを利用しています。パーティクルに限らず、外部から何らかのリソースファイルを読み込む場合によく利用されます。ここでは、ファイル名(PGRain)と拡張子(sks)を別々に指定しているところに注意してください。また、Bundleで作成したファイルパスから、NSKeyedUnarchiverというクラスを利用して、SpriteKitのノードオブジェクトを作成しています。これは、ちょうど圧縮ファイルを展開するようなものです。
ファイルから生成したエミッターノードを、とりあえず画面の中央に配置してみました。
すると、雨は画面の下半分にしか表示されません。雨粒は上方向には降らないからです。このようなパーティクルは、画面の最上部に配置するに限ります。シーン内の座標は、左下が(0, 0)なので、最上部の真ん中は、x座標とy座標は、それぞれシーン自体のフレームのmidX、maxYで指定できます。
指先から魔法の火花を噴射する
次に、もう1つ用意した火花のパーティクルエミッター(PGSpark.sks)を使って、ユーザーが画面に触れた位置から火花が放射されるような効果を実現してみましょう。それには、前回までの経験から、シーンのtouchesBeganメソッドで、エミッターノードを配置すればよさそうだとわかるでしょう。今回はそれに加えて、指を画面に触れたまま動かす、つまりドラッグすると、火花が指についてくるようにします。そのためには、新たにtouchesMovedというメソッドを実装して、その中でノードの位置(position)を更新してやればいいのです。
また、画面から指を離すと、その時点で火花の放射が止まるようにします。そのためには、また別のメソッドtouchesEndedを実装し、その中でエミッターノードをシーンから切り離します。
エミッターを1つだけシーンから外すメソッドはないので、複数のノードをまとめて取り除くremoveChildrenメソッドに、1つだけの要素からなる配列の要素として、火花のエミッターを指定しています。なお、画面へのタッチが始まってから、ドラッグして、タッチが終了するまでの間、1つのノードを複数のメソッドで引き継ぎながら追跡するようなかたちになります。そのためエミッターノードは、シーンのインスタンス変数として、デフォルトのオブジェクトとして初期化するように定義しています。
遠くから見てもらえば、ユーザーの指先とiPadの間から火花が出て、それが指の動きに追従するように見えるかもしれません。
次回の予定
今回は、SpriteKitのとりあえずの締めくくりということで、2種類のパーティクルエミッターの効果を試してみました。一般のユーティリティー系のアプリで使うには派手すぎる効果でしょうが、ゲームの画面などで利用するならかなり魅力的でしょう。次回からは、また少し地味な話題に戻りたいと思います。ウェブキットと、そうとは気づかないうちにマップキットで使われたいたのを除くと、これまでまったく扱ってこなかったネットワーク関連のものになる予定です。