一个动作序列中的多个节点

时间:2015-10-06 20:32:55

标签: c++ xcode cocos2d-x

我还没有办法做到这一点,我找到的所有方法似乎都不起作用。 我试图在一个序列中调用两个不同精灵的两个动作。基本上我需要在第一个动作完成后调用第二个动作,但这些动作有不同的节点/精灵。这就是我现在所拥有的,但是我收到了错误。

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 个答案:

答案 0 :(得分:2)

您好我使用以下序列来复制您在问题中描述的内容。我测试了它并且它有效。

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);

不是在回调中调用不同的序列,而是在考虑完成第二个操作所需的时间之后,使用延迟时间运行您需要运行的操作。这对我有用。如果它不是您想要的预期结果,请告诉我。

答案 1 :(得分:1)

在您开始尝试对多个节点进行排序的项目中,ActionTimeline的工具 - 并使用Cocosstudio 2创建它们,变得越来越相关。

对于这个非常简单的例子,A​​ctionTimeline mechanisim本身有点过分,但实质上 - 假设你不只是在Cocosstudio中放置你的场景和时间线 - 你可以做的是创建一个cocosstudio :: timeline :: Timeline对象,你可以附加一些cocosstudio :: timeline :: Frame - 每个都指定要在场景图中的节点上执行的动作。

然后从时间轴创建一个ActionTimeline对象,并将其作为场景的“根”节点上的一个动作运行,它将播放时间线,触发所有子节点上的动作。

答案 2 :(得分:0)

如果你想在多个精灵上使用相同的动作,你必须使用action-> clone();

如果您想一个接一个地使用一个动作,您可以:

a)按第一个动作的时间延迟第二个动作(DelayTime :: create(t))

b)调用一个函数,该函数在第一个结束后创建并播放第二个动作。

如果您需要多次这样做,我会选择b)和最简单的解决方案:

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。

答案 3 :(得分:0)

感谢大家的回答我相信你的方法也能正常工作,但这就是我所做的并且它的工作原理。我没有直接从主序列中调用我的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); 

}