gpt4 book ai didi

swift - iMac 在 while 循环后卡住

转载 作者:行者123 更新时间:2023-11-30 12:26:51 24 4
gpt4 key购买 nike

我正在 xcode 中创建一个游戏。获胜者将获得负分或 0。一切都很顺利,但现在我希望将这些负分添加到他/她的对手身上。我使用了这段代码:

while (activePlayer.score < 0) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.activePlayer.score += 1
self.activePlayer.scoreLabel.text = String (self.activePlayer.score)
self.notActivePlayer.score += 1
self.notActivePlayer.scoreLabel.text = String (self.notActivePlayer.score)
}
}

当我现在运行模拟器时,它会在这部分卡住。最糟糕的是我的整个 iMac 死机了。它变得非常慢,我必须等待大约 10 分钟才能关闭模拟器并恢复一些速度。

我的简单结论是这段代码是错误的。但为什么?我希望玩家看到分数变化,这就是为什么标签文本将在每个分数添加到分数后更新。

最佳答案

你的 while 循环是一个非常糟糕的主意。您期望它做什么?在第一次迭代中,您安排一个 asnyc 任务,然后迭代完成并安排下一个任务,等等
在循环运行的第一秒内,您将安排数千个异步任务。

如果您想以动画方式进行更改,您应该通过在第一个任务完成后安排下一个任务来实现。以下是执行此操作的一般方法,我还没有在 Playground 中运行它:

func schedule() {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.activePlayer.score += 1
self.activePlayer.scoreLabel.text = String (self.activePlayer.score)
self.notActivePlayer.score += 1
self.notActivePlayer.scoreLabel.text = String (self.notActivePlayer.score)
if (activePlayer.score < 0) {
self.schedule()
}
}
}

正如 Whirlwind 正确指出的那样,在 sprite-kit 中使用 dispatch 可以让你摆脱当前的游戏循环。您可以通过 SKActions 执行相同的操作,并在完成一个操作后重复创建新操作。

关于swift - iMac 在 while 循环后卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44083872/

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