Particleを使ってみる
学生時代に何度か触ったSpriteKitを触るついでに何回か使ったことのあるparticleですが、だいぶ時間が空いてしまったので、どんな風に使うのか思い出すために使ってみました。
タップした場所にSparkが出るだけのサンプル
SpriteKit Particle Fileを作成する
色々ありますが、今回はSparkを使ってみました。Snowとかも綺麗でよかったです!
タップ処理を作る
めっちゃ簡単です!
numParticlesToEmitを設定しないでおくと、パーティクルが止まらずにずっと描画され続けていきます。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touchPos = touches.first?.previousLocation(in: self){
let spk = SKEmitterNode(fileNamed: "Spark")!
spk.numParticlesToEmit = 300
spk.position = touchPos
self.addChild(spk)
}
}
注意点
1.self.viewで座標をとるとおかしくなる
touchesBeganのポジションを下記のように取得してしまうと、tapした位置にパーティクルが表示されなくなります。
tapLocation = touch!.locationInView(self.view)
これは、UIViewの座標系とSKViewの座標系が異なっている為で、UIViewは画面左上が原点なのに対して、SKViewは画面左下が原点になっているためです。
2.Particleは再利用できない
サンプルではタップされるたびにSKEmitterNodeを生成していましたが、SKEmitterNodeをメンバに保持して使いまわそうとしたら下記のようなエラーが出ました。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: <SKEmitterNode> name:'(null)' particleTexture:<SKTexture> 'spark' (64 x 64) position:{-44.083347320556641, 52.571418762207031} accumulatedFrame:{{-44.083000183105469, 52.570999145507812}, {0, 0}}'
親Viewが設定済みの場合は再度addSubViewすることができないようです。クラッシュするので気をつけて!