RunAction,带多个变量的CCCallFuncN - Cocos2D

时间:2013-06-10 20:29:29

标签: xcode cocos2d-iphone

有什么办法可以用RunAction发送2个参数吗?

你看我试图在顶部移动带有标签的精灵,我为每个精灵制作了单独的函数。与此类似。

     [sprite runAction:
 [CCSequence actions:actionMove, actionMoveDone, nil]];


id actionMoveDone = [CCCallFuncN actionWithTarget:self
                                         selector:@selector(spriteLabelMoveFinished:)];

现在,我有2个问题, 1 - 有没有办法发送2个或更多参数???? 2 - 我想知道是否有任何方法可以节省一些记忆并同时采取一项行动?

    - (void) spriteMoveFinished:(id)sender
{
CCLOG(@"Sprite move finished");
Sprites *sprite = (Sprites *)sender;

[self animateSprite:sprite];

}


- (void) animateSprite:(Sprites *)zprite
    {
CCLOG(@"We're animating sprite"):

Sprites *sprite = nil;

sprite = zprite;


int actualDuration = sprite.speed; //property of sprite

// Create the actions

id actionMove = [CCMoveBy actionWithDuration:actualDuration
                                    position:ccpMult(ccpNormalize(ccpSub(_player.position,sprite.position)), 10)];

id actionMoveDone = [CCCallFuncN actionWithTarget:self
                                         selector:@selector(spriteMoveFinished:)];
[sprite runAction:
 [CCSequence actions:actionMove, actionMoveDone, nil]];


}


- (void) spriteLabelMoveFinished:(CCLabelTTF *)sender
{   

[self animateSpriteLabel:sender];   
}

-(void)animateEnemyHP:(CCLabelTTF *)zpriteLabel
{


CCLabelTTF *spriteLabel = nil;

spriteLabel = zpriteLabel;


int actualDuration = spriteSpeed; //another property


id actionMove = [CCMoveBy actionWithDuration:actualDuration
                                    position:ccpMult(ccpNormalize(ccpSub(_player.position,spriteLabel.position)), 10)];

id actionMoveDone = [CCCallFuncN actionWithTarget:self
                                         selector:@selector(spriteLabelMoveFinished:)];
[spriteLabel runAction:
 [CCSequence actions:actionMove, actionMoveDone, nil]];

}

现在,这4个功能显而易见。

1-Move Sprite如果精灵结束移动,我们再次移动它。 2 - 以相同的速度将标签移向相同的位置,如果标签完成移动,我们再次移动它。

他们都去了同一个地方。 有没有办法将这4个功能混合成2个? 如果是这样,如何在动作结束时发送2个参数? 感谢您的帮助和时间,祝您度过愉快的一天!

2 个答案:

答案 0 :(得分:0)

尝试简化,毫无疑问会保存“内存”...我通常使用扩展CCNode的类来完成此操作,例如我的SoldierMapLayout类。在SoldierMapLayout节点中,我输入了士兵姿势动画(空闲,左右上下行走),健康栏,可选标签,适当的'HP点击'动画,适当的'XP获得'动画,一个头上的“毒云”等......当整个事物需要移动时我移动节点。一个动画,在移动完成时回调一次。

答案 1 :(得分:0)

要发送多个参数,而不是CCCallFunc,您可以使用CCCallBlock并调用代码块。在块中,您可以使用您想要的任何参数调用方法(选择器)。

一个简单的例子:

  CCAction *actionMoveDone = [CCCallBlock actionWithBlock:^()
                                   {
                                       [self spriteMoveFinished:param1 withParam2:param2 andParam3:param3];
                                   }];

更好的方法是使用" self"作为块参数,以防止内存分配:

  CCAction *actionMoveDone = [CCCallBlockN actionWithBlock:^(CCNode *myNode)
                                   {
                                       [(MyClass*)myNode spriteMoveFinished:param1 withParam2:param2 andParam3:param3];
                                   }];