我在Swift构建我的第一个游戏,我想知道如何一次处理多个屏幕上的精灵。我的游戏持续addChild
将精灵推到屏幕上,所以有很多活跃的。我意识到我没有适当的方式同时影响所有这些 - 比如我想立刻影响所有敌人精灵的物理属性。到目前为止,我在var enemySprites = [enemyType1]()
的开头创建了一个空数组GameScene
,并且已经为appending
精灵实例而不是使用addChild
将它们直接绘制到场景中。但是,我无法简单地循环并将它们绘制到屏幕上:
for enemy in enemySprites{
addChild(enemy)
}
这段代码在override func update(currentTime: CFTimeInterval)
函数中,所以也许我只是错放了它?如何解决这个问题的任何帮助都会很棒!
答案 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)
}
}