我正在发布 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
]];