Swift Playgroundsで学ぶiOSプログラミング

指先から火花を放出するプログラム

文●柴田文彦 編集●吉田ヒロ

2017年08月07日 17時00分

プレイグラウンドに雨を降らせる

 まずは、最も単純なパーティクルの使用例を示しましょう。プレイグラウンドの画面に雨を降らせるというものです。これは雨粒のような小さなパーティクルが、画面の上から下に向かって落ちていくもので、そう言われれば雨のように見える、という程度のものと考えてください。

 このプログラムは、シーン(SKScene)のdidMoveメソドdの中でパーティクルの設定をすべて完了し、後は何もしない、つまりプログラムを終了するまで雨を降らせっぱなしにするというものです。

Rainのテンプレートから作成したパーティクルエミッターによって、画面に雨を降らせるプログラムです。とりあえず雨の起点は画面の中央に置いています

 ここでは、パーティクルファイルを読み込むために、見慣れないBundleというクラスを利用しています。パーティクルに限らず、外部から何らかのリソースファイルを読み込む場合によく利用されます。ここでは、ファイル名(PGRain)と拡張子(sks)を別々に指定しているところに注意してください。また、Bundleで作成したファイルパスから、NSKeyedUnarchiverというクラスを利用して、SpriteKitのノードオブジェクトを作成しています。これは、ちょうど圧縮ファイルを展開するようなものです。

 ファイルから生成したエミッターノードを、とりあえず画面の中央に配置してみました。

当然と言えば当然ですが、雨のパーティクルエミッターを画面の中央に配置すると、その下側にしか雨は降りません。雨の粒子は必ず下に向かうように設定されているからです

 すると、雨は画面の下半分にしか表示されません。雨粒は上方向には降らないからです。このようなパーティクルは、画面の最上部に配置するに限ります。シーン内の座標は、左下が(0, 0)なので、最上部の真ん中は、x座標とy座標は、それぞれシーン自体のフレームのmidX、maxYで指定できます。

指先から魔法の火花を噴射する

 次に、もう1つ用意した火花のパーティクルエミッター(PGSpark.sks)を使って、ユーザーが画面に触れた位置から火花が放射されるような効果を実現してみましょう。それには、前回までの経験から、シーンのtouchesBeganメソッドで、エミッターノードを配置すればよさそうだとわかるでしょう。今回はそれに加えて、指を画面に触れたまま動かす、つまりドラッグすると、火花が指についてくるようにします。そのためには、新たにtouchesMovedというメソッドを実装して、その中でノードの位置(position)を更新してやればいいのです。

ユーザーが画面に触れた位置にパーティクルを発生させるプログラムでは、touchesBeganメソッドでノードを生成してシーンに張り付け、touchesMovedメソッドで、指の位置に追従するように位置を移動します

 また、画面から指を離すと、その時点で火花の放射が止まるようにします。そのためには、また別のメソッドtouchesEndedを実装し、その中でエミッターノードをシーンから切り離します。

ユーザーが画面から手を離すとパーティクルの放射が止まるようにするには、touchesEndedメソッドを実装して、そこでノードをシーンから削除しています。しかし、この方法ではエミッターが突然見えなくなるだけです。火花が出なくなってだんだん消えていくようにする方法を探求してみてください

 エミッターを1つだけシーンから外すメソッドはないので、複数のノードをまとめて取り除くremoveChildrenメソッドに、1つだけの要素からなる配列の要素として、火花のエミッターを指定しています。なお、画面へのタッチが始まってから、ドラッグして、タッチが終了するまでの間、1つのノードを複数のメソッドで引き継ぎながら追跡するようなかたちになります。そのためエミッターノードは、シーンのインスタンス変数として、デフォルトのオブジェクトとして初期化するように定義しています。

 遠くから見てもらえば、ユーザーの指先とiPadの間から火花が出て、それが指の動きに追従するように見えるかもしれません。

画面には、最初は背景色以外何も表示されていませんが、指を触れるとその位置から火花が放射され、指を動かすと火花の中心も動きます。指を離せば止まり、また別の場所からドラッグを始めることも可能です

次回の予定

 今回は、SpriteKitのとりあえずの締めくくりということで、2種類のパーティクルエミッターの効果を試してみました。一般のユーティリティー系のアプリで使うには派手すぎる効果でしょうが、ゲームの画面などで利用するならかなり魅力的でしょう。次回からは、また少し地味な話題に戻りたいと思います。ウェブキットと、そうとは気づかないうちにマップキットで使われたいたのを除くと、これまでまったく扱ってこなかったネットワーク関連のものになる予定です。

■今回作ったプログラム

mobileASCII.jp TOPページへ