我还没有办法做到这一点,我找到的所有方法似乎都不起作用。 我试图在一个序列中调用两个不同精灵的两个动作。基本上我需要在第一个动作完成后调用第二个动作,但这些动作有不同的节点/精灵。这就是我现在所拥有的,但是我收到了错误。
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移动到屏幕上的其他位置。这些不能同时发生。
由于
答案 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创建它们,变得越来越相关。
对于这个非常简单的例子,ActionTimeline 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);
}