一个动作序列中的多个节点
multiple nodes in one action sequence
我还没有找到办法,我找到的所有方法似乎都行不通。
我正在尝试在一个序列中从两个不同的精灵调用两个动作。基本上我需要在第一个动作完成后调用第二个动作,但是这些动作有不同的 nodes/sprites。这就是我现在所拥有的,但我收到了一个错误。
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 移动到屏幕上的其他地方。这些不能同时发生。
谢谢
如果你想对多个精灵使用相同的动作,你必须使用 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。
您好,我使用以下序列来复制您在问题中描述的内容。我已经测试过它并且有效。
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 - 每个指定要在场景图中的节点上执行的操作。
然后从时间轴创建一个 ActionTimeline 对象,运行 作为对场景的 "the" 根节点的动作,它将播放时间轴,触发所有子节点上的动作.
感谢大家的回答,我相信您的方法也有效,但这就是我所做的并且有效。我没有直接从主序列调用我的 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);
}
我还没有找到办法,我找到的所有方法似乎都行不通。 我正在尝试在一个序列中从两个不同的精灵调用两个动作。基本上我需要在第一个动作完成后调用第二个动作,但是这些动作有不同的 nodes/sprites。这就是我现在所拥有的,但我收到了一个错误。
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 移动到屏幕上的其他地方。这些不能同时发生。
谢谢
如果你想对多个精灵使用相同的动作,你必须使用 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。
您好,我使用以下序列来复制您在问题中描述的内容。我已经测试过它并且有效。
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 - 每个指定要在场景图中的节点上执行的操作。
然后从时间轴创建一个 ActionTimeline 对象,运行 作为对场景的 "the" 根节点的动作,它将播放时间轴,触发所有子节点上的动作.
感谢大家的回答,我相信您的方法也有效,但这就是我所做的并且有效。我没有直接从主序列调用我的 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);
}