У меня есть сетка квадратов, как показано ниже, и я пытаюсь выяснить, как перемещаться по каждой строке (снизу вверх или наоборот), выбирать случайный квадрат и имитировать прессу (масштабировать ее вниз вверх). Я создал каждую строку как массив из 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), который содержит все строки.
gameLayers = [rowOne, rowTwo, rowThree, rowFour, rowFive, rowSix, rowSeven]
У меня есть следующий код для перебора массива gameLayers к и выбрать eachRow, выбрать случайный элемент и запустить анимацию печати.
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 будет запускать анимацию для каждого элемента последовательно.
Это то, что вы написали, но не то, что вы хотите. RunAction выполняется на всех квадратах без каких-либо задержек между квадратами. В рамках вызова «loopThrough» вы устанавливаете инструкции, которые должны выполняться. Подумайте об этом, отправляя программу в систему анимации. Вы отправляете инструкции для всех квадратов для анимации, и ТОГДА он будет запускать эту анимацию - на всех квадратах. Вы действительно хотите, чтобы система анимации выполняла только один квадрат за раз. Затем вам нужно подождать, пока эта анимация не завершится до начала следующего. – JVene
Это абсолютно разумно, но для жизни я не могу понять, как написать код именно так. @JVene – Gugulethu
Я могу видеть только так много, но .... geeze, должен привыкнуть «вводить» комментарии к закрытию. Ключом к разработке вашего плана является осознание того, что вам может понадобиться таймер или какие-то средства для запуска метода после того, как каждый квадрат завершит его анимацию. Кроме того, вам нужно будет сохранить тот квадрат, который вы запланировали, поэтому вы знаете, какой квадрат стоит каждый раз при каждом срабатывании таймера. Затем, когда запланирован последний квадрат, прекратите стрельбу по таймеру. – JVene