iMac在while循环后冻结

时间:2017-05-20 08:55:30

标签: swift sprite-kit ios-simulator

我在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分钟才能关闭模拟器并获得一些速度。

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

1 个答案:

答案 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执行相同的操作,并在完成后重复创建新操作。