Swift 如何使一个SKSpriteNode跟随另一个SKSpriteNode

Swift 如何使一个SKSpriteNode跟随另一个SKSpriteNode,swift,sprite-kit,skspritenode,Swift,Sprite Kit,Skspritenode,我的代码遇到了一些问题。我正试图用以下代码让僵尸跟随我的玩家: class GameScene: SKScene, SKPhysicsContactDelegate { func Enemies() { Enemy = SKSpriteNode(imageNamed: "Spaceship") Enemy.size = CGSize(width: 50, height: 50) Enemy.color = UIColor(red: 0.9,

我的代码遇到了一些问题。我正试图用以下代码让僵尸跟随我的玩家:

class GameScene: SKScene, SKPhysicsContactDelegate {
    func Enemies() {
        Enemy = SKSpriteNode(imageNamed: "Spaceship")
        Enemy.size = CGSize(width: 50, height: 50)
        Enemy.color = UIColor(red: 0.9, green: 0.1, blue: 0.1, alpha: 1.0)
        Enemy.colorBlendFactor = 1.0

        //physics
        Enemy.physicsBody = SKPhysicsBody(rectangleOf: Enemy.size)
        Enemy.physicsBody?.isDynamic = true
        Enemy.physicsBody?.affectedByGravity = false
        Enemy.name = "Enemy"

        Enemy.position.y = -frame.size.height/2
        let positionX = arc4random_uniform(UInt32(frame.size.width))
        Enemy.position.x = CGFloat(positionX)
        addChild(Enemy)
    }

    override func didMove(to view: SKView) {

        enemyTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(GameScene.Enemies), userInfo: nil, repeats: true)

    override func update(_ currentTime: TimeInterval) {
        Enemy.run(SKAction.move(to: ship.position, duration: 3))
    }
如果我运行这段代码,我可以繁殖僵尸,但它们不会跟随我的主要玩家,它们只会到达它们繁殖时的位置(即,在时间=0时繁殖的僵尸将在时间=0时到达飞船位置,在时间=1时繁殖的僵尸将在时间=1时到达飞船位置,依此类推)。但是,如果我在只生成一个僵尸的情况下运行此代码,如下所示:

override func didMove(to view: SKView) {
    Enemies()
}

孤独的僵尸会跟着我的玩家到处走。你知道为什么代码只适用于一个僵尸,而不适用于多个僵尸吗?

也许你应该在阅读一个动作之前,在
敌方
上执行
removeAllActions()
。看起来您的操作需要3秒钟,但您每帧添加一个操作,因此一个节点一次最多有180个操作。

我不建议您在更新周期中不断添加操作,因为在幕后发生的所有事情会导致性能损失。取而代之的是,使用一个
SKAction.customAction
,您只需将它添加到您的精灵中一次。
下面是一个自定义操作的示例,它将执行您想要的操作,请记住只分配一次。(代码未经测试,因此可能需要编辑)


这里有很多问题…你不应该使用定时器。它不与游戏循环配对。其次,为了实现下一步,您不应该每秒应用一个新操作60次,需要记住的一点是,操作一旦创建,就不能修改。这意味着,当您设置一次动作的参数时,以后不能修改它们。另外,您的敌人变量是全局变量,这对我来说没有意义。它只保留最后添加的敌人的引用。我的意思是,在这种情况下,您的逻辑也可能是错误的……检查
ship
是否是
struct
。可能它是一个
struct
,您只需复制该值,以后再也不会更新它-它应该是
class
let customActionBlock = 
{
  (node,elapsedTime) in 
  let dx = ship.x - node.position.x
  let dy = ship.y - node.position.y 
  let angle = atan2(dx,dy)
  node.position.x += sin(angle) * speedPerFrame
  node.position.y += cos(angle) * speedPerFrame

}

let duration = TimeInterval(Int.max) //want the action to run infinitely
let followPlayer = SKAction.customAction(withDuration:duration,actionBlock:customActionBlock)
Enemy.run(action:followPlayer,withKey:"follow")