【Swift】Spritekitの使い方。衝突した位置にパーティクルを放出する。(Swift 2.2、XCode 7.3)
パーティクルファイルとは
前回記事ではシーンにエミッターノードを配置してパーティクルを放出する方法を説明した。⇒「前回記事」
シーン内の特定位置にパーティクルを放出するのではなく、ノード同士が触れたときの爆発シーンなどでパーティクルを瞬間的に放出したいことがある。そんなときにパーティクルファイルが利用される。というか、普通にエミッターノードをシーンに配置するときもパーティクルファイルを使うことが多い。
パーティクルファイルとは、パーティクルの放出を設定しておくことに特化したファイルである。このファイルをソースコードで読み込んでシーンに追加する。
パーティクルファイルを使ってみる
実際にパーティクルファイルを作って、ノード衝突時にパーティクルを放出してみよう。
以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。⇒「テスト用プロジェクト」
事前準備では、背景と鳥2匹をシーンに追加し、タップで茶鳥を落として赤鳥と衝突するところまでを実装しておいた。
以下のコードは、変更前のTestScene.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
// // TestScene.swift // import Foundation import SpriteKit class TestScene:SKScene, SKPhysicsContactDelegate { var birdBrown:SKSpriteNode! //現在シーン設定時の呼び出しメソッド override func didMoveToView(view: SKView) { //SKSファイルに配置した鳥ノードを取得する。 birdBrown = self.childNodeWithName("bird_brown") as? SKSpriteNode //デリゲート先を自分に設定する。 self.physicsWorld.contactDelegate = self } //画面タッチ時の呼び出しメソッド override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { //タッチした座標のノードを取得する。 let location = touches.first!.locationInNode(self) let node = nodeAtPoint(location) as! SKSpriteNode //鳥ノードの場合、物理ボディを設定する。 if(node == birdBrown){ node.physicsBody?.affectedByGravity = true } } //衝突時の呼び出しメソッド func didBeginContact(contact: SKPhysicsContact) { print("衝突しました") } } |
メニューから「File」⇒「New」⇒「File…」を選択する。
テンプレートを選択する画面が表示されるので、iOSの「Resource」⇒「SpriteKit Particle File」を選択し、「Next」ボタンを押す。
パーティクルのテンプレートを選択する画面が表示されるので、今回は「Spark」を選択して「Next」ボタンを押す。
ファイル名を入力する画面が表示されるので、Save Asに「TestParticle」を入力、保存先がプロジェクトフォルダになっていることを確認し、「Create」ボタンを押す。
これでプロジェクトに「TestParticle.sks」と「spark.png」の2つのファイルが追加された。
この中のTestParticle.sksがパーティクルファイルである。拡張子は「skp」のようになるかと思いきや、SpriteKit Sceneファイル(以下、SKSファイル)と同じ「sks」である。間違わないように気をつけよう。
TestParticle.sksを開くと閃光の動画が表示される。これは、先ほどのパーティクルのテンプレートで「Spark」を選択したためである。
パーティクルのテンプレートの選択肢は全部で8種類ある。どんな感じか見てみよう。
Bokeh(ぼやけ)
Fire(炎)
FireFlies(ほたる)
Magic(魔法)
Rain(雨)
Smoke(煙)
Snow(雪)
すべてのパーティクルは、アトリビュートインスペクタの設定画面で色や形、個数、速度、方向などを細かく設定できる。好みに応じて自由に変更するべし。
設定項目の意味については次の記事を参照されたし。⇒「パーティクルの設定」
今回はアトリビュートインスペクタの設定を下表に変更した。
設定項目 | 設定値 |
---|---|
Texture | 「testRect」 |
Emitter | Birthrate「30」 |
Lifetime | start「0.2」 |
Speed | Start「300」、Range「200」 |
Scale | Start「0.5」 |
TestScene.swiftのdidBeginContactメソッドを以下のコードに変更する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//衝突時の呼び出しメソッド func didBeginContact(contact: SKPhysicsContact) { //パーティクルを作成する。 let particle = SKEmitterNode(fileNamed: "TestParticle.sks") //接触座標にパーティクルを放出するようにする。 particle!.position = CGPoint(x:contact.contactPoint.x, y:contact.contactPoint.y) //0.7秒後にシーンから消すアクションを作成する。 let action1 = SKAction.waitForDuration(0.7) let action2 = SKAction.removeFromParent() let actionAll = SKAction.sequence([action1, action2]) //パーティクルをシーンに追加する。 self.addChild(particle!) //アクションを実行する。 particle!.runAction(actionAll) } |
以下は実際のプレイ動画