2014-12-04 7 views
0

У меня проблема с последовательностью SKAction, которую я установил.Проблема с комплектом спрайтов SKAction в Swift

Цель этой последовательности состоит в том, чтобы взять массив из 9 спрайт-узлов и отобразить по одному. Затем эта последовательность отобразит узел справа или слева от текущего узла в зависимости от того, какая кнопка нажата (правая или левая кнопка).

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

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

Мой вопрос в том, делает что-то очевидное, что выглядит неправильно здесь, и вы думаете, что блок завершения может решить проблему?

func pressedButtonRight(){ 
    if currentDisplayedWorld < 8 { 
     var currentWorld:SKSpriteNode = worldArray[currentDisplayedWorld] as SKSpriteNode 
     var nextWorld:SKSpriteNode = worldArray[currentDisplayedWorld + 1] as SKSpriteNode 
     nextWorld.position = CGPointMake(self.frame.size.width, 50) 
     self.addChild(nextWorld) 

     let move = SKAction.moveByX(-self.frame.size.width, y: 0, 
      duration: 1.0, delay: 0, 
      usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5) 

     //currentWorld.runAction(move) 
     nextWorld.runAction(move) 
     currentWorld.removeFromParent() 

     currentDisplayedWorld++ 
    }else if currentDisplayedWorld == 8 { 

    } 
} 

func pressedButtonLeft(){ 
    if currentDisplayedWorld > 0 { 
     var currentWorld:SKSpriteNode = worldArray[currentDisplayedWorld] as SKSpriteNode 
     var previousWorld:SKSpriteNode = worldArray[currentDisplayedWorld - 1] as SKSpriteNode 
     previousWorld.position = CGPointMake(-self.frame.size.width, 50) 

     self.addChild(previousWorld) 

     let moveBack = SKAction.moveByX(self.frame.size.width, y: 0, 
      duration: 1.0, delay: 0, 
      usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5) 

     //currentWorld.runAction(moveBack) 
     previousWorld.runAction(moveBack) 
     currentWorld.removeFromParent() 

     currentDisplayedWorld-- 
    }else if currentDisplayedWorld == 0 { 

    } 
} 
+0

есть свойство класса boolean, называемое перемещением. только перемещать узлы, если перемещение ложно. перед перемещением узлов, переходящих в true. запустите действие перемещения на узле с помощью обработчика завершения, который снова переместится к false. – Okapi

+0

Таким образом, код фактически не останавливает какое-либо уже запущенное действие. Если вы нажмете кнопку быстро, вы можете одновременно выполнить несколько действий перемещения. Поведение этого не определено. Запустите действия «с ключом», чтобы при запуске действия автоматически останавливались любые другие уже запущенные действия, имеющие один и тот же ключ. – LearnCocos2D

+0

Хорошо, что имеет смысл. Я попробую это сегодня и дам вам знать, если это сработает. Благодарю. –

ответ

0

Выполнено отличное решение. Я отправил свой последний код ниже, чтобы все могли видеть. Спасибо еще раз за помощь.

func pressedButtonRight(){ 
    if currentDisplayedWorld < 8 { 

     if self.moving == false { 
      self.moving = true 

      var currentWorld:SKSpriteNode = self.worldArray[currentDisplayedWorld] as SKSpriteNode 
      var nextWorld:SKSpriteNode = self.worldArray[currentDisplayedWorld + 1] as SKSpriteNode 
      nextWorld.position = CGPointMake(self.frame.size.width, 50) 

      self.addChild(nextWorld) 

      let move = SKAction.moveByX(-self.frame.size.width, y: 0, duration: 1.0, delay: 0,usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5) 

      //currentWorld.runAction(move) 
      nextWorld.runAction(move, completion: { 
       self.moving = false 
      }) 
      currentWorld.removeFromParent() 
      currentDisplayedWorld++ 
     } 

    }else if currentDisplayedWorld == 8 { 

    } 
} 

func pressedButtonLeft(){ 
    if currentDisplayedWorld > 0 { 

     if self.moving == false { 
      self.moving = true 

      var currentWorld:SKSpriteNode = self.worldArray[currentDisplayedWorld] as SKSpriteNode 
      var previousWorld:SKSpriteNode = self.worldArray[currentDisplayedWorld - 1] as SKSpriteNode 
      previousWorld.position = CGPointMake(-self.frame.size.width, 50) 

      self.addChild(previousWorld) 

      let moveBack = SKAction.moveByX(self.frame.size.width, y: 0, duration: 1.0, delay: 0, 
       usingSpringWithDamping: 0.7, initialSpringVelocity: 0.5) 

      //currentWorld.runAction(moveBack) 
      previousWorld.runAction(moveBack, completion: { 
        self.moving = false 
      }) 
      currentWorld.removeFromParent() 
      currentDisplayedWorld-- 
     } 

    }else if currentDisplayedWorld == 0 { 

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