2017-08-28 4 views
1

SpriteKitゲームで爆発パーティクルの配置に問題があります。ミサイルが敵と衝突するとき、私は「ファンク爆発」と呼ぶが、爆発は殺された敵がどこであるのかではなく、スクリーンの真ん中にある。私は "敵の位置"に一致するように "explosion.position"を設定しましたが、画面の中央で爆発が起こっていますが、どのように爆発位置が殺された敵の位置と同じになるように変更できますか?SpriteKitパーティクルファイルの位置

func spawnExplosion() { 
    let explosionEmmiter = Bundle.main.path(forResource: 
    "ParticleExplosion", ofType: "sks") 
    let explosion = NSKeyedUnarchiver.unarchiveObject(withFile: 
    explosionEmmiter as! String) as! SKEmitterNode 

    explosion.position = CGPoint(x: enemy.position.x, y: 
    enemy.position.y) 

    explosion.zPosition = 3 
    explosion.targetNode = self 

    self.addChild(explosion) 

    let wait = SKAction.wait(forDuration: 0.5) 
    let removeExplosion = SKAction.run { 
     explosion.removeFromParent() 
    } 

    self.run(SKAction.sequence([wait, removeExplosion])) 
} 


func didBegin(_ contact: SKPhysicsContact) { 

    var firstBody = SKPhysicsBody() 
    var secondBody = SKPhysicsBody() 

    if contact.bodyA.node?.name == "Enemy" { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if firstBody.node?.name == "Enemy" && secondBody.node?.name == 
    "Missile" { 
     spawnExplosion() 
    } 

func createEnemiesLeft() { 

    let enemyTexture1 = SKTexture(imageNamed: "Enemy1") 
    let enemyTexture2 = SKTexture(imageNamed: "Enemy2") 
    let enemyTexture3 = SKTexture(imageNamed: "Enemy3") 
    let enemyTexture4 = SKTexture(imageNamed: "Enemy4") 
    let enemyTexture5 = SKTexture(imageNamed: "Enemy5") 
    let enemyTexture6 = SKTexture(imageNamed: "Enemy6") 
    let enemyTexture7 = SKTexture(imageNamed: "Enemy7") 
    let enemyTexture8 = SKTexture(imageNamed: "Enemy8") 
    let enemyTexture9 = SKTexture(imageNamed: "Enemy9") 
    let enemyTexture10 = SKTexture(imageNamed: "Enemy10") 

    let animation = SKAction.animate(with: [enemyTexture1, 
    enemyTexture2, enemyTexture3, enemyTexture4, enemyTexture5, 
    enemyTexture6, enemyTexture7, enemyTexture8, enemyTexture9, 
    enemyTexture10], timePerFrame: 0.1) 

    let makeEnemyRun = SKAction.repeatForever(animation) 

    let enemy = SKSpriteNode(texture: enemyTexture1) 
    enemy.name = "Enemy" 
    enemy.setScale(0.1) 
    enemy.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.height 
    /2) 
    enemy.physicsBody?.categoryBitMask = ColliderType.Enemy 
    enemy.physicsBody?.affectedByGravity = false 
    enemy.zPosition = 3 

    enemy.position.y = self.frame.height + 100 
    enemy.position.x = CGFloat.randomBetweenNumbers(firstNum: -347.5, 
    secondNum: -85) 

    enemy.run(makeEnemyRun) 


    self.addChild(enemy) 

    let destination = self.frame.height * 0.5 
    let move = SKAction.moveTo(y: -destination, duration: 
    TimeInterval(10)) 
    let remove = SKAction.removeFromParent() 

    enemy.run(SKAction.sequence([move, remove]), withKey: 
    "MoveEnemiesLeft") 

} 

func spawnEnemiesLeft() { 

    let spawn = SKAction.run({() -> Void in 
     self.createEnemiesLeft() 
    }) 

    let delay = SKAction.wait(forDuration: TimeInterval(1)) 
    let sequence = SKAction.sequence([spawn, delay]) 

    self.run(SKAction.repeatForever(sequence), withKey: 
    "SpawnEnemiesLeft") 
} 

func createEnemiesRight() { 

    let enemyTexture1 = SKTexture(imageNamed: "Enemy1") 
    let enemyTexture2 = SKTexture(imageNamed: "Enemy2") 
    let enemyTexture3 = SKTexture(imageNamed: "Enemy3") 
    let enemyTexture4 = SKTexture(imageNamed: "Enemy4") 
    let enemyTexture5 = SKTexture(imageNamed: "Enemy5") 
    let enemyTexture6 = SKTexture(imageNamed: "Enemy6") 
    let enemyTexture7 = SKTexture(imageNamed: "Enemy7") 
    let enemyTexture8 = SKTexture(imageNamed: "Enemy8") 
    let enemyTexture9 = SKTexture(imageNamed: "Enemy9") 
    let enemyTexture10 = SKTexture(imageNamed: "Enemy10") 

    let animation = SKAction.animate(with: [enemyTexture1, 
    enemyTexture2, enemyTexture3, enemyTexture4, enemyTexture5, 
    enemyTexture6, enemyTexture7, enemyTexture8, enemyTexture9, 
    enemyTexture10], timePerFrame: 0.1) 

    let makeEnemyRun = SKAction.repeatForever(animation) 

    let enemy = SKSpriteNode(texture: enemyTexture1) 
    enemy.name = "Enemy" 
    enemy.setScale(0.1) 
    enemy.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.height 
    /2) 
    enemy.physicsBody?.categoryBitMask = ColliderType.Enemy 
    enemy.physicsBody?.affectedByGravity = false 
    enemy.zPosition = 3 

    enemy.position.y = self.frame.height + 100 
    enemy.position.x = CGFloat.randomBetweenNumbers(firstNum: 85, 
    secondNum: 347.5) 

    enemy.run(makeEnemyRun) 

    self.addChild(enemy) 

    let destination = self.frame.height * 0.5 
    let move = SKAction.moveTo(y: -destination, duration: 
    TimeInterval(10)) 
    let remove = SKAction.removeFromParent() 

    enemy.run(SKAction.sequence([move, remove]), withKey: 
    "MoveEnemiesRight") 

} 

func spawnEnemiesRight() { 

    let spawn = SKAction.run({() -> Void in 
     self.createEnemiesRight() 
    }) 

    let delay = SKAction.wait(forDuration: TimeInterval(1)) 
    let sequence = SKAction.sequence([spawn, delay]) 

    self.run(SKAction.repeatForever(sequence), withKey: 
    "SpawnEnemiesRight") 
} 


} 
+0

は、あなたの敵がシーンではない親を持つがある可能性があります場合は、あなたがしなければなりません。専用の機能で座標を現在のシーンに変換する –

+0

質問を編集して敵の機能を追加しました。敵の機能。他に何があるかも知っていますか? – Flinigan

答えて

0

オクラホマので、あなたは敵の多くを作成しているし、あなたが衝突位置を取得する必要があります。

func spawnExplosion(pos:CGPoint) { 
    let explosionEmmiter = Bundle.main.path(forResource: 
    "ParticleExplosion", ofType: "sks") 
    let explosion = NSKeyedUnarchiver.unarchiveObject(withFile: 
    explosionEmmiter as! String) as! SKEmitterNode 

    explosion.position = pos 

    explosion.zPosition = 3 
    explosion.targetNode = self 

    self.addChild(explosion) 

    let wait = SKAction.wait(forDuration: 0.5) 
    let removeExplosion = SKAction.run { 
     explosion.removeFromParent() 
    } 

    self.run(SKAction.sequence([wait, removeExplosion])) 
} 


func didBegin(_ contact: SKPhysicsContact) { 


    var firstBody = SKPhysicsBody() 
    var secondBody = SKPhysicsBody() 

    if contact.bodyA.node?.name == "Enemy" { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if firstBody.node?.name == "Enemy" && secondBody.node?.name == 
    "Missile" { 
     spawnExplosion(pos: firstBody.node.position) 
    } 
+0

"spawnExplosion(pos:(firstBody.node?.position)!)"行に "(lldb)"というスレッド1エラーが表示されます。なぜそれが分かっていますか? – Flinigan

+0

firstBody.node?存在する –

関連する問題