2015-12-09 2 views
0

У меня есть несколько кнопок (SKSpriteNodes), которые я пытаюсь прокрутить и анимировать, с небольшой задержкой между ними. Мой код компилируется, но когда я его запускаю - я получаю только белый экран и сбой с этой ошибкой: «Сообщение от отладчика: завершено из-за проблемы с памятью». Вот мой код:Swift/SpriteKit: Анимация нескольких кнопок с небольшой задержкой между ними

var sequence = SKAction.sequence([animationUp, animationDown]) 

runAction(SKAction.repeatActionForever(SKAction.sequence([ 

    SKAction.runBlock({ 

     button1.runAction(sequence) 
     SKAction.waitForDuration(0.5) 

     button2.runAction(sequence) 
     SKAction.waitForDuration(0.5) 

     button3.runAction(sequence) 
     SKAction.waitForDuration(0.5) 

    }), 

]))) 

Так что я пытаюсь сделать это анимация вверх/вниз на каждой кнопке Я рисунок на экран, с 0,5 секунды задержки между каждой кнопки. Анимация должна выполняться вечно до тех пор, пока я не изменю текущий экран. У меня не было проблем с анимацией этих кнопок одновременно, но я бы очень хотел добавить равномерную задержку, чтобы они не все одновременно оживляли. Есть идеи?

+0

способ использования последовательности SKAction совершенно неправильно. Вы понимаете, что вы повторяете блок навсегда? Повторяющееся действие должно иметь немедленную продолжительность. Согласно документам, SKAction.runBlock имеет мгновенный эффект. Это то же самое, что в то время как (1) {сделать что-то} – Whirlwind

+0

Ну, это не то, как я был _using_ моей последовательностью SKAction, это именно то, что я пытался сделать, но не мог понять, поэтому отправляю свой вопрос в первую очередь. – user1547019

+0

Ну, вы жаловались на проблемы с памятью. Повторение этого блока кода навсегда было причиной. О принял ответ ... Это может работать для вас, но в зависимости от того, как кнопки объявляются (локальные переменные или свойство), вы можете столкнуться с сильными вопросами опорного цикла. – Whirlwind

ответ

1
let waitAction = SKAction.waitForDuration(0.5) 
let movementAction = SKAction.sequence([animateUp, animateDown]) 
let button1Block = SKAction.runBlock({ 
    button1.runAction(movementAction) 
}) 
let button2Block = SKAction.runBlock({ 
    button2.runAction(movementAction) 
}) 
let button3Block = SKAction.runBlock({ 
    button3.runAction(movementAction) 
}) 
let sequence = SKAction.sequence([button1Block,waitAction,button2Block, waitAction, button3Block, waitAction]) 
runAction(SKAction.repeatActionForever(sequence)) 
+0

Хорошее чистое решение, спасибо большое. Работает как шарм – user1547019

0

Я не уверен, что SKAction.sequence инициирует/уничтожает, но, возможно, ваш цикл в .repeatActionForever (..) создает и уничтожает объекты, тогда как память не будет выпущена до тех пор, пока цикл не будет завершен.

Попробуйте запустить свой внутренний блок runAction внутри autoreleasepool {..} блок:

autoreleasepool { 
    runAction ... 
} 

But there is one situation we do need to autorelease, that is we create a lot of objects in a method scope and want to release them sooner. It is extremely useful when these objects turn to a pressure on memory.

http://en.swifter.tips/autoreleasepool/

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