2017-08-28 89 views
1

我在SpriteKit遊戲中遇到了爆炸粒子的位置問題。當導彈與敵人相撞時,我稱之爲「func爆炸」,但爆炸並不是殺死敵人的地方,而是位於屏幕中央。我已經設置了「爆炸位置」與「敵人位置」相匹配,但是爆炸仍然發生在屏幕中間,我怎麼能改變這個位置以使爆炸位置與被殺死的敵人的位置相同?SpriteKit Particle File position

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)!)」行中收到一條線程1錯誤,指出「(lldb)」。你知道這是爲什麼嗎? – Flinigan

+0

確認是否firstBody.node?存在 –