我找到了如何让敌人向玩家移动的答案。如果我有一个敌人,它会很好地工作。但是,如果我在场景中添加另一个敌人,其中只有一个移动,而另一个静止不动。
这是到目前为止我如何设置所有内容的代码。
var player: SKSpriteNode?
var spawnZombie = SKSpriteNode()
override func didMove(to view: SKView) {
playerTexture = SKTexture(imageNamed: "player_2")
player = SKSpriteNode(texture: playerTexture)
player?.name = "player"
player?.position = (pSpawnPoint?.position)!
player?.setScale(0.5)
self.addChild(player!)
randomEnemy()
randomEnemy()
}
我的敌人就是这样建立起来的
func randomEnemy(){
spawnPoint0 = childNode(withName: "spawnPoint_0") as? SKSpriteNode
spawnPoint1 = childNode(withName: "spawnPoint_1") as? SKSpriteNode
spawnPoint2 = childNode(withName: "spawnPoint_2") as? SKSpriteNode
// Set up enemies
enemy = SKSpriteNode(imageNamed: "enemy_2")
enemy.name = "enemy"
enemy.setScale(0.5)
enemy.zPosition = 10
enemy.physicsBody = SKPhysicsBody(rectangleOf: enemy.size)
enemy.physicsBody?.categoryBitMask = PhysicsCatagory.Enemy
enemy.physicsBody?.collisionBitMask = PhysicsCatagory.None
enemy.physicsBody?.contactTestBitMask = PhysicsCatagory.Player
enemy.physicsBody?.isDynamic = true
enemy.physicsBody?.affectedByGravity = false
let choice = Int(arc4random_uniform(3))
switch choice {
case 0:
enemy.position = (spawnPoint0?.position)!
self.addChild(enemy)
break
case 1:
enemy.position = (spawnPoint1?.position)!
self.addChild(enemy)
break
case 2:
enemy.position = (spawnPoint2?.position)!
self.addChild(enemy)
break
default:
print("something went wrong")
}
}
override func update(_ currentTime: TimeInterval) {
let location = player?.position
//Aim
let dx = (location?.x)! - enemy.position.x
let dy = (location?.y)! - enemy.position.y
let angle = atan2(dy, dx)
enemy.zRotation = angle - 3 * .pi/2
//Seek
let velocityX = cos(angle) * enemySpeed
let velocityY = sin(angle) * enemySpeed
enemy.position.x += velocityX
enemy.position.y += velocityY
}
你知道为什么每次我运行两次函数时只有一个敌人移动吗?事先谢谢。
最佳答案
你把你的两个敌人都放在同一个敌人变量中。所以当你试图移动敌人的时候,你基本上是移动最后一个分配给这个变量的。
你需要做的是把他们排成一个阵型,然后把所有的敌人从阵型中移开。
let enemies = [SKSpriteNode]()
func randomEnemy() {
//...other code blah blah blah
enemies.append(enemy)
}
在更新功能中
override func update(_ currentTime: TimeInterval) {
let location = player?.position
for enemy in enemies {
//Aim
let dx = (location?.x)! - enemy.position.x
let dy = (location?.y)! - enemy.position.y
let angle = atan2(dy, dx)
enemy.zRotation = angle - 3 * .pi/2
//Seek
let velocityX = cos(angle) * enemySpeed
let velocityY = sin(angle) * enemySpeed
enemy.position.x += velocityX
enemy.position.y += velocity
}
}
现在,您可能想看看子类敌人,并在该类中具有移动功能,但这超出了您的问题范围。这应该能让你开始。
关于swift - SpriteKit:更新几个敌人位置以跟随玩家,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49343420/