我在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")
}
}
可能是你的敵人父母不在現場。在這種情況下,必須使用專用功能將座標轉換爲當前場景 –
我剛剛編輯了問題併爲敵人添加了功能。據我所知,沒有任何問題敵方功能。你知道還有什麼可能嗎? – Flinigan