Arrays 按顺序在正方形中循环
我有一个如下图所示的正方形网格,我正试图找出如何循环通过每一行(从下到上,反之亦然),选择一个随机正方形并模拟一次按压(先向下缩放,然后向上缩放)。我已将每行创建为5个SKShapeNodes的数组,代码如下: 一排正方形: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
//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()
}
}
}