У меня проблема с последовательностью 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 {
}
}
есть свойство класса boolean, называемое перемещением. только перемещать узлы, если перемещение ложно. перед перемещением узлов, переходящих в true. запустите действие перемещения на узле с помощью обработчика завершения, который снова переместится к false. – Okapi
Таким образом, код фактически не останавливает какое-либо уже запущенное действие. Если вы нажмете кнопку быстро, вы можете одновременно выполнить несколько действий перемещения. Поведение этого не определено. Запустите действия «с ключом», чтобы при запуске действия автоматически останавливались любые другие уже запущенные действия, имеющие один и тот же ключ. – LearnCocos2D
Хорошо, что имеет смысл. Я попробую это сегодня и дам вам знать, если это сработает. Благодарю. –