如何使SKSpriteNode跟随另一个SKSpriteNode

时间:2017-04-14 11:46:19

标签: 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, 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()
}

孤独的僵尸将跟随我的玩家。知道为什么代码适用于一个僵尸,但不适用于多个僵尸?

2 个答案:

答案 0 :(得分:2)

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

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")

答案 1 :(得分:-1)

在阅读动作之前,您可能应removeAllActions() Enemy。您似乎有3秒钟的操作,但每帧都添加一个操作,因此一次最多可以为一个节点执行180次操作。