Comments 10
В libGDX тоже есть система Actions, пишутся очень похоже. Например, для перемещения обьекта на 50 пикселей влево за 1 секунду:
actor.addAction(moveBy(50, 0, 1f));
Прочитал статью — практически все Action-ы есть в libGDX. Судя по тому, что поддержка Action в libGDX появилась где-то три года назад, разработчик libGDX вдохновлялся Cocos-2d в этом плане :)
Обратите внимание на то, что обе секвенции запускаются на одном и том же спрайте. Любые N секвенций запущеных на одной и той же ноде будут работать ОДНОВРЕМЕННО, поэтому если сделать что-то вроде
sprite->runAction(MoveTo::create(Point(0, 100)));
sprite->runAction(MoveTo::create(Point(100, 0)));
Будут работать параллельно и ноду (в данном случае условный спрайт) будет колбасить между этими двумя позициями. Поэтому для ясности все же лучше использовать Spawn.
А clone позволяет дублировать секвенции, чтобы не писать две одинаковые, но иметь независимое влияние/поведение.
Будет. Если положить два MoveTo
, то каждый будет пытаться высчитать новую дельту позиции основываясь на текущем положении. Поэтому финальная позиция вполне может не совпасть ни с одной из указанных точек.
Различие в том что Spawn запускает эти события явно из одного места. Если очень хочется запустить Action на ноде, которая потенциально уже имеет действующий Action, существует проверка на наличие isRunning
и методы для остановки stopAction
и stopAllAction
.
Ну и небольшое эмпирическое правило: Не запускать два одинаковых трансформирующих Action'а параллельно (Move, Scale, Skew, Rotate, Fade).
Будут работать параллельно и ноду (в данном случае условный спрайт) будет колбасить между этими двумя позициями. Поэтому для ясности все же лучше использовать Spawn.У вас по тексту получилось, что запускание этого через Spawn имеет преимущества перед отдельным параллельным запуском. Мне кажется, никакого в этом случае, кроме понятной организации кода.
Различие в том что Spawn запускает эти события явно из одного места.
Я думаю, что он их запускает также, как и если бы мы их запускали один за другим, просто все это упаковано в один аккуратный вызов Spawn. Надо глянуть в реализацию.
Да, вы можете явно сгенерировать две секвенции и запускать эти два события друг за другом, но никто не гарантирует что они запустятся корректно по времении и не перебьют друг друга.
sprite->runAction(MoveTo::create(Point(0, 100)));
heavyEval();
sprite->runAction(MoveTo::create(Point(100, 0)));
в таком примере heavyEval
делает очень тяжелое вычисление и в следующий участок кода он попадет с задержкой. Поэтому тайминг второй "сползёт" и параллельности не выйдет. У Spawn же группирует вызовы и оптом в цикле вызывает каждому из них обновление.
Cocos2d-x — Обработка действий