gpt4 book ai didi

ios - 为什么我的 SpriteKit update() 函数会创建多个 NSTimer?

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:58 26 4
gpt4 key购买 nike

我正在创建一个 SpriteKit 游戏,它会根据耗时量进行更新。游戏使用 NSTimer 及其 scheduledTimerWithTimeInterval 方法生成敌人,每 2.0 秒调用一次 spawnEnemy 函数。

当 5 秒过去后,应该有一个非常短暂的中场休息,以防止新敌人生成以显示关卡变化动画。

当达到最初的 5 秒时,一切正常,直到条件 where 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()
}
}
}

最佳答案

尝试遵循您的代码……但我认为您的方法不适合 spritekit。它可能使事情变得比它需要的更复杂。

您可以直接使用您的更新方法来跟踪时间。重写这部分代码可能是值得的。在 spritekit 中会更好地工作并且不易出现错误。

您真正需要的只是增量时间。

场景属性

// 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 来执行此操作。只需将其放入您的 viewDidLoad

现在我们永远每两秒运行一次这段代码。最好的部分是这将自动暂停和恢复您的游戏。您不必过多地管理 SKAction。 spritekit 为你做:)

let spawnAction = SKAction.repeatActionForever(
SKAction.sequence([
SKAction.waitForDuration(2),
SKAction.runBlock({
[unowned self] in
self.spawnEnemy()
})
])
)
runAction(spawnAction)

关于ios - 为什么我的 SpriteKit update() 函数会创建多个 NSTimer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35678936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com