SKEmitterNode を SKNode に追加したいのですが、そのパーティクルは親ノードのフレーム内にとどまります。UIView の clipsToBounds プロパティのようなものです。
例: エミッターからのパーティクルは、黒い四角形の SKSpriteNode から離れてはなりません:
SKEmitterNode を SKNode に追加したいのですが、そのパーティクルは親ノードのフレーム内にとどまります。UIView の clipsToBounds プロパティのようなものです。
例: エミッターからのパーティクルは、黒い四角形の SKSpriteNode から離れてはなりません:
SKCropNode でそれを行うことができます。このような:
if let particles = SKEmitterNode(fileNamed: "rain.sks") {
let cropNode = SKCropNode()
cropNode.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
cropNode.zPosition = 3
cropNode.maskNode = SKSpriteNode(color: SKColor.blackColor(), size: CGSize(width: 150, height: 150))
cropNode.addChild(particles)
addChild(cropNode)
}
残念ながら、これは iOS8 でのみ機能します... iOS9 でエミッターをクロップ ノードに追加しようとすると、おそらくいくつかの問題が発生します。何もレンダリングされず、fps ドロップが発生する可能性があります。そして、これは既知の問題です。
そのリンクで述べられているように、パーティクルがレンダリングされる代わりに、実際には何も起こりません。個人的には fps の問題は経験していませんが、パーティクルは確実にレンダリングされません。
回避策は、エミッタを保持するノードを追加してから、そのコンテナ ノードをマスクすることです。それでは、SKSpriteNode を追加して、例のように黒い背景を作成しましょう。それを背景と呼びましょう:
if let particles = SKEmitterNode(fileNamed: "rain.sks") {
let cropNode = SKCropNode()
cropNode.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
cropNode.zPosition = 3
let blackNode = SKSpriteNode(color: .blackColor(), size: CGSize(width: 200, height: 200))
blackNode.addChild(particles)
cropNode.maskNode = SKSpriteNode(color: SKColor.blackColor(), size: CGSize(width: 200, height: 200))
cropNode.addChild(blackNode)
addChild(cropNode)
}