如何在屏幕上正确管理精灵群组

时间:2016-08-02 19:20:37

标签: ios swift sprite-kit

我在Swift构建我的第一个游戏,我想知道如何一次处理多个屏幕上的精灵。我的游戏持续addChild将精灵推到屏幕上,所以有很多活跃的。我意识到我没有适当的方式同时影响所有这些 - 比如我想立刻影响所有敌人精灵的物理属性。到目前为止,我在var enemySprites = [enemyType1]()的开头创建了一个空数组GameScene,并且已经为appending精灵实例而不是使用addChild将它们直接绘制到场景中。但是,我无法简单地循环并将它们绘制到屏幕上:

    for enemy in enemySprites{
        addChild(enemy)
    }

这段代码在override func update(currentTime: CFTimeInterval)函数中,所以也许我只是错放了它?如何解决这个问题的任何帮助都会很棒!

2 个答案:

答案 0 :(得分:1)

您可以使用计时器,而不是使用update方法。来自消息来源:

public class func scheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> NSTimer

因此,如果您遵循Apple指南,那将是例如:

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("spawnAlien:"), userInfo: myParameter, repeats: true)

func spawnAlien(timer : NSTimer) {
      if let myUserInfo = timer.userInfo {
         print(myUserInfo) // a parameters passed to help you to the alien creation
      }
      timer.invalidate()
}

但是根据Whirlwind我同意他和LearnCocos2d工作, sprite-kit不能与定时器配合使用 (正如LearnCocos2d链接中所解释的那样)和更好的方式,特别是当你说你开发你的第一个游戏时,要使用SKAction,这些行动的组合可以实现类似的行为由NSTimer获得。

我已经考虑过功能或扩展程序,请告诉我它是否按预期工作:

extension SKAction {
   class func scheduledTimerWithTimeInterval(time:NSTimeInterval, selector: Selector, repeats:Bool)->SKAction {
      let call = SKAction.customActionWithDuration(0.0) { node, _ in
          node.performSelector(selector)
      }
      let wait = SKAction.waitForDuration(time)
      let seq = SKAction.sequence([wait,call])
      let callSelector = repeats ? SKAction.repeatActionForever(seq) : seq
      return callSelector
   } 
}

<强>用法

let spawn = SKAction.scheduledTimerWithTimeInterval(time, selector: #selector(GenericArea.spawnAlien), repeats: true)
self.runAction(spawn,withKey: "spawnAlien")

答案 1 :(得分:1)

山姆,

这里有一些示例代码,用于在您的生命达到0时更新敌人:

首先,我们在lives属性上设置一个属性观察者,这样我们就可以在你失去所有生命时调用一个函数:

var lives = 3 {
    didSet {
        if lives == 0 {
        updateEnemies()
    }
}

然后是一个枚举所有敌人并将每个人的速度改为(0,0)的函数:

func update enemies() {
        enumerateChildNodesWithName("type1") {
            node, stop in
            let enemy = node as! SKSpriteNode
            enemy.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
        }
}