gpt4 book ai didi

ios - timeInterval 变量不起作用

转载 作者:行者123 更新时间:2023-11-28 16:07:25 31 4
gpt4 key购买 nike

我正在尝试更改 scheduledTimer 中的 timeInterval。我试图通过将变量更改为间隔而不是将 timeInterval 设置为此变量来做到这一点。我没有收到任何错误,但 timeInterval 不会改变。有人可以帮助我吗?

var enemyTimer = Timer()
var playTime = 0
var enemySpawnTime: Double = 3
enemyTimer = Timer.scheduledTimer(timeInterval: Double(enemySpawnTime), target: self, selector: #selector(GameScene.enemySpawn), userInfo: nil, repeats: true)
playTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameScene.ingameTimer), userInfo: nil, repeats: true)
func enemySpawn() {

let enemy = SKSpriteNode(imageNamed: "Enemy")

let minValue = self.size.width / 8
let maxValue = self.size.width - 20

let spawnPoint = UInt32(maxValue - minValue)

enemy.position = CGPoint(x: CGFloat(arc4random_uniform(spawnPoint)), y: self.size.height)

let action = SKAction.moveTo(y: -70, duration: 5)
enemy.run(action)

self.addChild(enemy)
}

func ingameTimer() {

playTime += 1

if(playTime >= 10 && playTime < 30){
enemySpawnTime = 2
print(enemySpawnTime)
}else
if(playTime >= 30 && playTime < 60){
enemySpawnTime = 1
print(enemySpawnTime)
}else
if(playTime >= 60 && playTime < 120){
enemySpawnTime = 0.75
print(enemySpawnTime)
}else
if(playTime >= 120 && playTime < 180){
enemySpawnTime = 0.5
print(enemySpawnTime)
}else
if(playTime >= 180 && playTime < 240){
enemySpawnTime = 0.25
print(enemySpawnTime)
}
}

希望有人能帮帮我!谢谢!

最佳答案

您的代码不起作用的原因是因为 Timer 对象不知道它的间隔需要与您的 enemySpawnTime 同步。解决方案很简单,只需在更改敌人生成时间时重新创建计时器即可。

但是……

当您使用 SpriteKit 时,您应该永远使用 Timer(NSTimer 在 Swift 3 之前)或 GCD 来延迟东西。参见 this了解更多详情。

执行此操作的正确方法是创建一系列 SKAction

假设 selfSKScene 的子类,你可以这样做:

override func didMove(to view: SKView) {
let waitAction = SKAction.wait(forDuration: enemySpawnTime)
let enemySpawnAction = SKAction.run { self.enemySpawn() }
let sequence = SKAction.sequence([waitAction, enemySpawnAction])
somePlaceholderNode.run(SKAction.repeatForever(sequence))
}

其中 somePlaceholderNode 只是一个节点,它除了运行操作外什么都不做。稍后我会对此进行解释。

您也应该为另一个计时器执行此操作。

现在每当你改变定时器间隔时,也要这样做:

somePlaceholderNode.removeAllActions()
let waitAction = SKAction.wait(forDuration: enemySpawnTime)
let enemySpawnAction = SKAction.run { self.enemySpawn() }
let sequence = SKAction.sequence([waitAction, enemySpawnAction])
somePlaceholderNode.run(SKAction.repeatForever(sequence))

这里我首先删除节点正在运行的 Action ,并告诉它运行几乎相同的 Action ,但时间间隔不同。您可以将此代码块添加到 enemySpawnTimedidSet block 中:

var enemySpawnTime: Double = 3 {
didSet {
let waitAction = SKAction.wait(forDuration: enemySpawnTime)
let enemySpawnAction = SKAction.run { self.enemySpawn() }
let sequence = SKAction.sequence([waitAction, enemySpawnAction])
somePlaceholderNode.run(SKAction.repeatForever(sequence))
}
}

现在您的代码应该可以工作了!

我们在这里想要一个占位符节点的原因是因为当我们通过调用 removeAllActions 删除操作时,我们不想删除所有正在运行的操作.

关于ios - timeInterval 变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074390/

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