0

移动序列后触发粒子

代码第 1 部分

CCActionMoveTo *moveTo = [CCActionMoveTo actionWithDuration:0.2f position:nextPosition];
CCActionRemove *remove = [CCActionRemove action];

CCActionSequence *sequence = [CCActionSequence actionWithArray:@[moveTo,remove]];
[mySprite runAction:sequence];

然后我想像下面这样触发这段代码。

代码第 2 部分

CCParticleSystem *mergePart1 = (CCParticleSystem *)[CCBReader load:@"MergePart1"];
mergePart1.autoRemoveOnFinish = TRUE;

mergePart1.position = mySprite.position;
[game.parent addChild:mergePart1];

runAction:sequence 完成后如何执行此语句?

4

2 回答 2

1

用于CCCallFunc将函数调用包装在CCAction.

CCAction* nextStepAction = [CCCallFunc actionWithTarget:self selector:@selector(nextStep)];
CCActionSequence *sequence = [CCActionSequence actionWithArray:@[moveTo,remove, nextStepAction]];

您需要将“代码第 2 部分”封装在一个名为的独立方法中nextStep(或者如果您更喜欢使用不同的名称,请更改操作定义)。

希望这可以帮助。

编辑:

在 cocos2d v3 上,您可以使用

CCActionCallFunc

使用类似的语法,或

CCActionCallBlock

你可以这样定义:

CCAction *nextStepAction = [CCActionCallBlock actionWithBlock:^{
    <code part2 here>
}];
于 2014-07-01T14:57:29.937 回答
1

我正在发布 Cocos2d 和 Cocos2d-x 的解决方案,因为每个人都应该切换到 cocos2d-x,因为它可以为 iOS 和 Android 编译而无需额外的移植,以防万一使用 Cocos2d-x 的人遇到同样的问题。

在 Cocos2d-x 中,我会从元调用函数:

Sequence::create(MoveTo::create(1.0, Point(100, 200))),
                 CallFunc::create([&](){HelloWorld::myFunction()},
                 null);

在 Cocos2d 中,我会这样做:

[CCSequence actions:
   [CCMoveTo actionWithDuration:1.0 position:ccp(100, 100)],
   [CCCallFuncN actionWithTarget:self selector:@selector(myFunction:)],
   nil];

如果你不想把它放在一个函数中(就像它只是一次使用),按照你的风格,你应该能够这样做:

CCActionMoveTo *moveTo = [CCActionMoveTo actionWithDuration:0.2f position:nextPosition];
CCActionRemove *remove = [CCActionRemove action];
CCAction *particles = [CCCallBlock actionWithBlock:^{
    CCParticleSystem *mergePart1 = (CCParticleSystem *)[CCBReader load:@"MergePart1"];
    mergePart1.autoRemoveOnFinish = TRUE;
    mergePart1.position = mySprite.position;
    [game.parent addChild:mergePart1];
  }];


CCActionSequence *sequence = [CCActionSequence actionWithArray:@[moveTo,remove,particles]];
[mySprite runAction:sequence];

这将按顺序工作。(虽然我有点不确定单独定义粒子动作,但定义调用对象范围之外的其他对象的东西有一些有趣的事情)。

就个人而言,如果我只调用一次,我不喜欢在调用它之前定义东西,我会使用 CCSequence 和 Actions,如下所示:

[mysprite runaction:[CCSequence actions:
                     [CCMoveTo actionWithDuration:0.2f position:nextPosition],
                     [CCActionRemove action], //not sure what this does
                     [CCCallBlock actionWithBlock:^{
    CCParticleSystem *mergePart1 = (CCParticleSystem *)[CCBReader load:@"MergePart1"];
    mergePart1.autoRemoveOnFinish = TRUE;
    mergePart1.position = mySprite.position;
    [game.parent addChild:mergePart1];
                     }],
                     nil
                   ]];
于 2014-07-02T14:52:11.457 回答