Несколько узлов в одной последовательности действий
Я еще не нашел способ сделать это, все методы, которые я нашел, не работают. Я пытаюсь назвать два действия из двух разных спрайтов в одной последовательности. По сути, мне нужно вызвать второе действие после завершения первого действия, но эти действия имеют разные узлы / спрайты. Это то, что у меня сейчас, но я получаю ошибку.
void Objects::function(cocos2d::Layer *layer)
{
auto object1 = Sprite::create("object1.png");
auto object2 = Sprite::create("object2.png");
...
...
layer->addChild(object1);
...
...
layer->addChild(object2);
auto object1StartMove = MoveBy::create(3, Point (50, 100));
auto object2Move = MoveBy::create(3, Point ( 30, 160));
auto object1FinishMove = MoveBy::create(3, Point (100, 50));
auto actionSequenceObject2 = Sequence::create(object2Move, RemoveSelf::create(), NULL);
auto actionSequenceObject1 = Sequence::create(object1StartMove,CallFunc::create(
[&]() {
object2->runAction(actionSequenceObject2);
}),object1FinishMove,RemoveSelf::create(), NULL);
object1->runAction(actionSequence);
Поэтому мне нужно сделать это по порядку: Sprite1 перемещается куда-то на экране, sprite2 затем перемещается куда-то на экране, sprite1 затем перемещается куда-то еще на экране. Это не может произойти одновременно.
Спасибо
4 ответа
Спасибо всем за ответы, я уверен, что ваши методы работают, но это то, что я сделал, и это работает. Вместо того, чтобы вызывать мой object2->runAction непосредственно из главной последовательности, я создал новую функцию и назвал оттуда object2->runAction. Затем в основной последовательности в первой функции я вызвал вторую функцию, и все прошло гладко. Если бы кто-то мог пролить свет на то, почему это работает, это было бы здорово.
void Objects::function1(cocos2d::Layer *layer)
{
object1 = Sprite::create("object1.png");
object2 = Sprite::create("object2.png");
...
...
layer->addChild(object1);
...
...
layer->addChild(object2);
auto object1StartMove = MoveBy::create(3, Point (50, 100));
auto object1FinishMove = MoveBy::create(3, Point (100, 50));
auto actionSequenceObject1 = Sequence::create(object1StartMove,CallFunc::create(
[&]() {
function2(layer);
}),object1FinishMove,RemoveSelf::create(), NULL);
object1->runAction(actionSequenceObject1);
}
void Objects::function2(cocos2d::Layer *layer)
{
...
...
auto object2Move = MoveBy::create(3, Point ( 30, 160));
auto actionSequenceObject2 = Sequence::create(object2Move, RemoveSelf::create(), NULL);
object2->runAction(actionSequenceObject2);
}
Привет, я использовал следующую последовательность, чтобы повторить то, что вы описываете в своем вопросе. Я проверил это, и это работает.
auto objectOneMovementSequence = Sequence::create(
MoveTo::create(1.0f, Vec2(100, 50)),
CallFunc::create([object2]()
{
object2->runAction(MoveTo::create(1.0f, Vec2(100, 0)));
}),
DelayTime::create(1.0f),
MoveTo::create(1.0f, Vec2()),
NULL);
object1->runAction(objectOneMovementSequence);
Вместо вызова другой последовательности в вашем обратном вызове, просто запустите действие, которое вам нужно выполнить, используя время задержки после того, как учтете время, которое потребуется для выполнения вашего второго действия. Это работает на моей стороне. Дайте мне знать, если это не тот результат, который вы ищете.
В тот момент в проекте, где вы начинаете пытаться упорядочить несколько узлов, возможности ActionTimeline и использование Cocosstudio 2 для их создания становятся все более актуальными.
Механизм ActionTimeline сам по себе является излишним излишним для этого очень простого примера, но по сути - при условии, что вы не просто кладете свою сцену и временные рамки в Cocosstudio, - вы можете создать объект cocosstudio:: timeline:: Timeline, чтобы который вы бы прикрепили несколько cocosstudio:: timeline:: Frame's - каждый из которых указывает действие, которое будет выполнено на узле в графе сцены.
Затем создайте объект ActionTimeline из временной шкалы и запустите его как действие на "корневом" узле вашей сцены, и он будет воспроизводить временную шкалу, вызывая действия на всех дочерних узлах.
Если вы хотите использовать одно и то же действие для более чем одного спрайта, вы должны использовать action->clone();
Если вы хотите использовать одно действие за другим, вы можете:
а) задержать второе действие на время первого действия (DelayTime::create(t))
б) вызвать функцию, которая создает и воспроизводит второе действие после первого.
Если вам нужно сделать это более одного раза, я бы выбрал б) и самое простое решение:
void Objects::anim1(){
auto action = Sequence::create(..., CallFunc::create([&](){anim2(); }), NULL);
object1->runAction(action);
}
void Objects::anim2(){
auto action = Sequence::create(..., CallFunc::create([&](){anim1(); }), NULL);
object2->runAction(action);
}
Или используйте CC_CALLBACK_0 вместо CallFunc.