2015-09-14 4 views
0

У меня есть сетка квадратов, как показано ниже, и я пытаюсь выяснить, как перемещаться по каждой строке (снизу вверх или наоборот), выбирать случайный квадрат и имитировать прессу (масштабировать ее вниз вверх). Я создал каждую строку как массив из 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 будет запускать анимацию для каждого элемента последовательно.

enter image description here

+0

Это то, что вы написали, но не то, что вы хотите. RunAction выполняется на всех квадратах без каких-либо задержек между квадратами. В рамках вызова «loopThrough» вы устанавливаете инструкции, которые должны выполняться. Подумайте об этом, отправляя программу в систему анимации. Вы отправляете инструкции для всех квадратов для анимации, и ТОГДА он будет запускать эту анимацию - на всех квадратах. Вы действительно хотите, чтобы система анимации выполняла только один квадрат за раз. Затем вам нужно подождать, пока эта анимация не завершится до начала следующего. – JVene

+0

Это абсолютно разумно, но для жизни я не могу понять, как написать код именно так. @JVene – Gugulethu

+0

Я могу видеть только так много, но .... geeze, должен привыкнуть «вводить» комментарии к закрытию. Ключом к разработке вашего плана является осознание того, что вам может понадобиться таймер или какие-то средства для запуска метода после того, как каждый квадрат завершит его анимацию. Кроме того, вам нужно будет сохранить тот квадрат, который вы запланировали, поэтому вы знаете, какой квадрат стоит каждый раз при каждом срабатывании таймера. Затем, когда запланирован последний квадрат, прекратите стрельбу по таймеру. – JVene

ответ

0

Я полагал, что проблема может быть использована посредством рекурсивного цикла. После запуска анимации на квадрате в одной строке вызовите ту же функцию и обновите строку, чтобы запустить анимацию.

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() 
        } 
      } 
    } 
+0

Я предлагаю вам использовать 'SKAction' или два вместо' dispatch_after', потому что действия 1) приостанавливают/возобновляют соответственно при паузе/возобновлении сцены и/или просмотра, 2) правильно реагируют, когда вы меняете свойство 'speed' сцены, и 3) синхронизируются с игровым циклом Sprite Kit. – 0x141E

+0

Спасибо @ 0x141E. Будет реализовывать это. – Gugulethu

Смежные вопросы