我正在制作一个简单的SpriteKit游戏,其中物品掉落,我需要根据当前分数管理物品生成速度。但是我遇到了Timer.scheduledTimer的问题。
func manageItemsSpawnSpeed() {
if score < 10 {
itemsSpawnTimeInterval = 1.0
} else if score >= 10 && score < 20 {
itemsSpawnTimeInterval = 0.9
} else if score >= 20 && score < 50 {
itemsSpawnTimeInterval = 0.8
} else if score >= 50 && score < 100 {
itemsSpawnTimeInterval = 0.7
}...
spawnItems() - 在随机位置
生成屏幕顶部的项目func spawnItems() {
self.scene?.addChild(itemController.spawnItems())
}
这是项目spawn计时器,目前我只在游戏开始时调用它
func theSpawntimer() {
Timer.scheduledTimer(timeInterval: TimeInterval(itemsSpawnTimeInterval), target: self, selector: #selector(GameplayScene.spawnItems), userInfo: nil, repeats: true)
}
因此,当分数改变时 - itemsSpawnTimeInterval更新得很好,但每当我再次调用theSpawntimer()时,它也会启动额外的spawnItems(),而不是增加产生的速度 - 它会让游戏中的项目下雨。
请告知如何在itemsSpawnTimeInterval更改时每次调用theSpawntimer()而不调用spawnItems()。 有可能吗?
答案 0 :(得分:0)
要解决此问题,我拒绝使用scheduledTimer。相反,我使用了SKAction:
func theSpawner() {
removeAction(forKey: spawnKey) // remove previous action if running.
let spawnAction = SKAction.run(spawnItems)
let spawnDelay = SKAction.wait(forDuration: itemsSpawnTimeInterval)
let spawnSequence = SKAction.sequence([spawnAction, spawnDelay])
run(SKAction.repeatForever(spawnSequence), withKey: spawnKey) // run action with key so you can cancel it later