有什么办法可以用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个参数? 感谢您的帮助和时间,祝您度过愉快的一天!
答案 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];
}];