Поведение CCMoveBy - PullRequest
       25

Поведение CCMoveBy

0 голосов
/ 07 октября 2011

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

Текущий код (без анимации) просто отбрасывает позицию блока, например:

   block.position = ccp(block.position.x, block.position.y - kBlockSize);

Это происходит в цикле for для классического программирования тетриса. Но когда я пытаюсь оживить, вот так:

id move = [CCMoveBy actionWithDuration:0.5f position:(0, -kBlockSize)];
[block runAction:move];

Некоторые блоки просто перемещаются вниз один раз, даже если действие может быть вызвано несколько раз для одного и того же блока (например, при разбивании нескольких строк) ...

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 октября 2011

Спасибо, ребята, эти ответы мне очень помогают!

Я пробовал CCSequence перед публикацией здесь, но безуспешно. Проблема была в следующем:

Внутри CCSequence, которая удаляет строку, у меня есть 2 действия: первое затухает весь ряд блоков (длительность x секунд), а второе отбрасывает все блоки над строкой (длительность y секунд) .

Это прекрасно работает, если нужно удалить ТОЛЬКО ОДНУ строку, потому что, если имеется более одной строки, следующая CCSequence начинается почти в то же время, что и предыдущая, читая неправильную позицию блоков выше, что приводит к неправильному каскаду блоки.

Я решил, что используя более длинную CCSequence, которая принимает CCCallFuncND в качестве последнего аргумента:

id fadeOutSequence = [CCSequence actions:fadeout, destroyBlocks, notifyFadeFinish, nil];

//inside method specified for notifyFadeFinish:
id dropAbove = [CCSequence actions: dropBlocks, notifyDropFinish, nil];

//inside method specified for notifyDropFinish
//start a new delete sequence, if there is more rows to delete.

Теперь перейдем к гравитационному режиму, еще раз спасибо!

0 голосов
/ 07 октября 2011

Я вполне уверен, что действия - это параллельные операции, поэтому вы можете вызывать действие CCMoveBy до того, как предыдущее будет завершено.Вот некоторые альтернативы, которые я использовал: ...

  1. Отслеживать, когда действие завершается с помощью CCSequence, заканчивая действием CCCallFunc, которое устанавливает флаг.Что-то вроде ...

    id myAction = [[CCSequence runWithActions: [CCMoveBy actionWithDuration: 0.5f position: (0, -kBlockSize)], [CCCallFunc actionWithTarget: self selector: @selector (myFunc)], ноль]

  2. Сверните свое собственное решение, используя переменную скорости в функции тиков или обновлений, где вы можете получить дельта-время / количество тиков с момента последнего обновления

Надеюсь, что это поможет.

...