呼叫之间的调度和延迟



我正在为那个老游戏西蒙(又名天才,在巴西(制作一个克隆,带有彩色按钮的那个,玩家需要按照一系列颜色按下。

用于测试,界面有4个彩色按钮我为按钮插座创建了一个数组,以便于访问:

var buttonArray:[UIButton] = [self.greenButton, self.yellowButton, self.redButton, self.blueButton]

此外,创建了另一个数组来存储颜色序列

var colors:[Int] = []

当游戏开始时,它会调用一个函数,该函数将一个从 0 到 3 的随机数(buttonArray 上的索引(相加,并将这个数字添加到颜色数组中在颜色序列添加新颜色后,应用需要为用户显示序列,以便他可以重复

为此,它调用 playMoves 函数,该函数使用 for 循环运行颜色数组并从按钮更改 alpha,模拟"闪烁"。

func playMoves(){
    let delay = 0.5 * Double(NSEC_PER_SEC)
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
        for i in self.colors{
            self.buttonArray[i].alpha = 0.2
            dispatch_after(time, dispatch_get_main_queue(), {
                self.buttonArray[i].alpha = 1
            })                
        }    
}

它将 alpha 从按钮更改为 0.2,然后在半秒后将 alpha 返回到 1。我正在使用dispatch_after,传递 0.5 秒,在代码块上它返回 alpha,正如你们在上面的代码中看到的那样。

在第一次运行时,它似乎做对了,但是当颜色数组有 2 个或更多项目时,当它运行循环时,尽管它有 0.5 秒的延迟,但它会同时闪烁所有按钮。

这可能是我犯的一些愚蠢的错误,但我现在一无所知。

我将非常感谢所有的帮助!

谢谢!

所有这些

dispatch_after呼叫几乎都安排在同一时间,使它们看起来同时闪烁。有几种方法可以解决这个问题:

例如,您可以调整每个按钮的when参数(dispatch_time_t参数(,使其与原始时间偏移(以便有效地delay i * 0.5 * Double(NSEC_PER_SEC)(。

您也可以使用关键帧动画,但我建议您首先尝试先修复dispatch_after方法中的delay

最新更新