我找到了如何让敌人向玩家移动的答案。如果我有一个敌人,它会很好地工作。但是,如果我在场景中添加另一个敌人,其中只有一个移动,而另一个静止不动。
这是到目前为止我如何设置所有内容的代码。

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/

10-14 16:58
查看更多