2017-07-10 13 views
0

エミッタが生成する衝突に関する質問があります。衝突が発生すると、アプリがクラッシュします。私がやった研究から、私は何が間違っているのか分かりません。エミッタ衝突が機能していませんか?

衝突:

if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 3 || bodyA.categoryBitMask == 3 && bodyB.categoryBitMask == 1{ 
    print("END GAME") 
    let dieexplostionNode = SKEmitterNode(fileNamed: "Explode") 
    player.addChild(dieexplostionNode!) 
} 

私が産卵するエミッタのための何かが足りないのですか?衝突するたびにクラッシュします。

+0

dieeexplostionNodeは、これがクラッシュするコードであればおそらくnilです。 letの場合に使用し、プロジェクトにExplode.sksファイルがあるかどうかを確認します。 – Whirlwind

+0

待ってください。これにはSKSファイルが必要ですか?私はパーティクルシステムがscnpだと思った?私は何か間違っているのですか? –

+0

SCNPファイルを追加して起動する方法を教えてください。 –

答えて

2

上記の回答に対するあなたのコメントに基づいて、私はアクションがあなたの必要と思うものだと思っています。

if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 3 || bodyA.categoryBitMask == 3 && bodyB.categoryBitMask == 1{ 
    print("END GAME") 

dieexplostionNode = SKEmitterNode(fileNamed: "Explosion.sks"){ 
dieexplostionNode.targetNode = self 
//dieexplostionNode.position = player.position - no need for this! 

// add 3 actions 
let wait = SKAction.wait(forDuration: 2) 
let addExplosion = SKAction.run { 
    self.player.addChild(dieexplostionNode!) 
} 
let removeExplosion = SKAction.run { 
     dieexplostionNode?.removeFromParent() 
} 

// put them in a sequence. 
let seq = SKAction.sequence([addExplosion,wait,removeExplosion]) 

// run the sequence 
self.run(seq) 

} 

これは、プレーヤーにdieexplostionNodeを追加します。 2秒間待ってください。 dieexplostionNodeを削除してください

+0

パーフェクト!私はこれを行うためにシーケンスを使用することができます忘れてしまった。助けてくれてありがとう! –

+0

問題ありません。爆発が急に消えると感じる場合は、シーケンス内に他のアクションを追加することができます。 SKAction.fadeOutのように。エミッターを取り外す前に出生率を0に設定してください:) –

2

SceneKitとSpriteKitを混同していますか? SceneKitでSCNファイル/ Abreviationsが使用されています SpriteKitパーティクルエミッタファイルを追加する場合。 ファイル - >新規 - > IOS/OSX - >リソース - > SpriteKitパーティクルファイル

+0

ありがとうございます!その違いがかなり分かりました。エミッタを表示してからSKNodeを削除するにはどうすればいいですか?私は以下を持っていますが、トリガされる前にSKNodeが削除されます。 dieexplostionNode = SKEmitterNode(fileNamed: "Explosion.sks")を許可すれば、{ dieexplostionNode.targetNode =自己 dieexplostionNode.position = player.position player.addChild(dieexplostionNode) –

+0

あなたがやろうとしているか混乱しています。私が見つけた問題をあなたのコードを試してみると、それは表示されません。私はそれが始めるには良い場所だと思います。問題は、positionをplayer.positionに設定してからプレーヤーに追加しているように見えます。これは、プレイヤーと比較してシーンからの位置を追加することです。ステートメントdieexplostionNode.position = player.positionを削除すると、デフォルトでプレイヤーの位置に配置されます。 –

+1

@DonFirth thats良い点。プレイヤーにEmittrNodeを追加するだけで、プレーヤーの座標空間での位置はデフォルトで0.0になります。エミッタの位置を他の値に設定すると、0.0がプレーヤー座標空間内の位置をオフセットします。言い換えると。ノードの位置は常に親ノードとの相対的なものです –

関連する問題