我在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分钟才能关闭模拟器并获得一些速度。
我的简单结论是这段代码错了。但为什么? 我希望玩家能够看到分数变化,这就是为什么标签文本会在每个分数添加到分数后更新的原因。
答案 0 :(得分:0)
你的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执行相同的操作,并在完成后重复创建新操作。