Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 按顺序在正方形中循环_Arrays_Swift_Sprite Kit - Fatal编程技术网

Arrays 按顺序在正方形中循环

Arrays 按顺序在正方形中循环,arrays,swift,sprite-kit,Arrays,Swift,Sprite Kit,我有一个如下图所示的正方形网格,我正试图找出如何循环通过每一行(从下到上,反之亦然),选择一个随机正方形并模拟一次按压(先向下缩放,然后向上缩放)。我已将每行创建为5个SKShapeNodes的数组,代码如下: 一排正方形: //Row Seven for var i = -2; i < 3; i++ { firstSquare = SKShapeNode(rectOfSize: CGSize(width: self.view!.frame.siz

我有一个如下图所示的正方形网格,我正试图找出如何循环通过每一行(从下到上,反之亦然),选择一个随机正方形并模拟一次按压(先向下缩放,然后向上缩放)。我已将每行创建为5个SKShapeNodes的数组,代码如下:

一排正方形:

//Row Seven
        for var i = -2; i < 3; i++ {

            firstSquare = SKShapeNode(rectOfSize: CGSize(width: self.view!.frame.size.width * (1/5), height: self.view!.frame.size.width * (1/5)))
            firstSquare.fillColor = SKColor(hue: 225.0/360.0, saturation: 0.1176, brightness: 0.2667, alpha: 1.0)
            firstSquare.strokeColor = SKColor.clearColor()
            firstSquare.position = CGPoint(
                x: CGRectGetMidX(self.frame) + ((firstSquare.frame.size.width + CGFloat(2)) * CGFloat(i)),
                y: (CGRectGetMidY(self.frame) + self.frame.size.height / 4) - (firstSquare.frame.size.width + CGFloat(2)) * CGFloat(6))
            rowSeven.append(firstSquare)
            addChild(firstSquare)

        }
我有下面的代码来循环通过gameLayers数组来选择每一个箭头,选择一个随机元素并运行压力机的动画

private func randomIntergerInRange(low:Int, high: Int) -> Int {
        let randomGeneratedNumber = low + Int(arc4random()) % (high - low);
        return Int(randomGeneratedNumber)
    }

func loopThrough() {

for eachRow in gameLayers {

    let selectedSquare = eachRow[randomIntergerInRange(0, high: eachRow.count)]

    let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(2) * Double(NSEC_PER_SEC)))
        dispatch_after(delay, dispatch_get_main_queue()) {

            let scaleDown = SKAction.scaleTo(0.85, duration: 0.3)
            let scaleUp = SKAction.scaleTo(1.0, duration: 0.3)
            let scalingSequence = SKAction.sequence([scaleDown, scaleUp])

            selectedSquare.runAction(scalingSequence)

    }
}

}
在尝试此操作时,每行中都会选择一个正方形,但所有选定的正方形都会同时运行动画,而不是像我希望的那样按顺序运行

你知道原因是什么吗。我认为for循环会按顺序为每个元素运行动画


我认为这个问题可以通过递归循环来解决。在一行的正方形上运行动画后,调用相同的函数并更新上的行以触发动画

var selectedRowIndex = 0

    func loopThrough() {
            let rowSelected = gameLayers[selectedRowIndex] //Select a row from the gameLayers


            let selectedNumber = self.randomIntergerInRange(0, high: rowSelected.count)
            let squareSelected = rowSelected[selectedNumber] //Select a square from the selected Row. 

            //Run the animation on that square
            let scaleDown = SKAction.scaleTo(0.9, duration: 0.2)
            let scaleUp = SKAction.scaleTo(1.0, duration: 0.2)
            let scalingSequence = SKAction.sequence([scaleDown,
                    scaleUp])

            squareSelected.runAction(scalingSequence)


            let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(1.3) * Double(NSEC_PER_SEC)))
                dispatch_after(delay, dispatch_get_main_queue()) {

//Delay for 1.3 seconds and call the function again. Increase the index of the selected row to select the next 
                    if self.selectedRowIndex != self.gameLayers.count - 1 {
                        self.selectedRowIndex++
                        self. loopThrough()
                    }
            }
     }

它在做你写的,但不是你想要的。runAction在所有方块上执行,方块之间没有任何延迟。在对“环通”的调用中,您正在建立要执行的指令。可以将其视为向动画系统发送程序。您正在为所有要设置动画的方块发送指令,然后它将在所有方块上运行该动画。您真正想要的是指示动画系统一次只在一个正方形上执行。然后,你需要等到动画结束后再开始下一个动画。这绝对是有道理的,但对我来说,我不知道如何以这种方式编写代码@JVeneI只能看到这么多,但是…geeze,必须习惯于“输入”结束评论。设计你的计划的关键是要意识到你可能需要一个定时器,或者在每个方块完成动画后触发一个方法的一些方法。此外,您还需要保留上次计划的方块,以便在每次计时器启动时知道下一个方块的位置。然后,当最后一个方块被安排好时,停止启动计时器。@JVene为没有结束评论而道歉。谢谢你的提示。这导致了下面的解决方案。我建议您使用
SKAction
或两个,而不是
dispatch\u after
,因为操作1)暂停/恢复场景和/或视图时适当暂停/恢复,2)更改场景的
速度
属性时正确响应,3)与Sprite Kit的游戏循环同步。谢谢@0x141E。我们将实现这一点。
var selectedRowIndex = 0

    func loopThrough() {
            let rowSelected = gameLayers[selectedRowIndex] //Select a row from the gameLayers


            let selectedNumber = self.randomIntergerInRange(0, high: rowSelected.count)
            let squareSelected = rowSelected[selectedNumber] //Select a square from the selected Row. 

            //Run the animation on that square
            let scaleDown = SKAction.scaleTo(0.9, duration: 0.2)
            let scaleUp = SKAction.scaleTo(1.0, duration: 0.2)
            let scalingSequence = SKAction.sequence([scaleDown,
                    scaleUp])

            squareSelected.runAction(scalingSequence)


            let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(Double(1.3) * Double(NSEC_PER_SEC)))
                dispatch_after(delay, dispatch_get_main_queue()) {

//Delay for 1.3 seconds and call the function again. Increase the index of the selected row to select the next 
                    if self.selectedRowIndex != self.gameLayers.count - 1 {
                        self.selectedRowIndex++
                        self. loopThrough()
                    }
            }
     }