我正在创建一个基于传递的时间量更新的SpriteKit游戏。该游戏使用NSTimer
及其scheduledTimerWithTimeInterval
方法生成敌人,每2.0秒调用一次spawnEnemy
函数。
当5秒过去时,应该进行非常短暂的间歇,防止新敌人产生以显示等级变化动画。
当达到最初的5秒时,一切正常,直到条件为self.nextLevelDelayTicker == 100
。满足此条件后,"YOLO"
字符串仅在控制台中触发一次。但是,我假设NSTimer
的多个实例正在创建并存储在self.timer
中,因为在self.resumeGame()
被调用以创建新的计划计时器之后会产生大量的敌人。
关于为什么会发生这种情况的任何想法,即使我在条件设置中设置了标记,只调用一次self.resumeGame()
函数?
func resumeGame() {
// Start game timer
// Need a way to access ib action of pause button
self.timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "spawnEnemy", userInfo: nil, repeats: true)
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if gameTicker.isActive == true {
gameTicker.increment()
}
// If gameTicker is equal to 5 seconds, increase enemy amount
if gameTicker.getTimePassed() % 500 == 0 {
self.enemyAmount += 1
self.timer?.invalidate()
levelCount += 1
gameTicker.isActive = false
}
// If level has been completed and last ghost has been killed, activate next level scene
if gameTicker.isActive == false && enemyArray.count == 0 {
self.nextLevelDelayTicker.increment()
if self.nextLevelDelayTicker.getTimePassed() == 100 {
print("YOLO")
self.gameTicker.isActive = true
self.nextLevelDelayTicker.reset()
self.resumeGame()
}
}
}
答案 0 :(得分:4)
尝试遵循您的代码..但我认为您的方法对于spritekit来说并不是很好。它可能使事情变得比它需要的更复杂。
您可以直接使用更新方法跟踪时间。可能值得重写代码的这一部分。在spritekit中工作得更好,并且不容易出错。
你真正需要的是增量时间。
场景属性
Object.defineProperty(this, 'width', {
get : function(){
return this.right - this.left;
}
});
Object.defineProperty(this, 'height', {
get: function(){
return this.bottom - this.top;
}
})
您的场景的更新方法
// time values
var delta = NSTimeInterval(0)
var last_update_time = NSTimeInterval(0)
// some time youre trying to keep track of
var timeLimit = NSTimeInterval(5)
var timeLimitMax = NSTimeInterval(5)
现在,如果你每隔几秒就会产生一些东西,那么我们甚至不必费心去做 func update(currentTime: NSTimeInterval) {
if last_update_time == 0.0 {
delta = 0
} else {
delta = currentTime - last_update_time
}
last_update_date = currentTime
// now we can keep track of time
timeLimit -= self.delta
if timeLimit <= 0 {
// do something and reset timer
timeLimit = timeLimitMax
}
}
来做这件事。只需将其放入update
现在我们每两秒钟就会运行这段代码。最好的部分是自动暂停和恢复你的游戏。您不必过多地管理SKAction。 spritekit为你做的:)
viewDidLoad