runAction后触发粒子

时间:2014-07-01 14:48:13

标签: objective-c cocos2d-iphone spritebuilder

移动序列后触发粒子

代码第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 finished ??

2 个答案:

答案 0 :(得分: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>
}];

答案 1 :(得分:1)

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

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

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