是否可以检查Cocos2d中的CCNode类中是否存在当前正在运行的操作?我想知道CCMoveBy
是否仍在运行。
答案 0 :(得分:6)
您可以在任何CCNode上使用[self numberOfRunningActions]
。在你的情况下,听起来你想知道是否有任何动作正在运行,所以事先知道确切的数字并不是什么大不了的事。
答案 1 :(得分:5)
我们可以使用 getActionByTag 方法和 action.tag 属性轻松检查是否运行了特定操作。 无需引入 CCCallFuncN 回调或计算 numberOfRunningActions 。
实施例
在我们的应用程序中,重要的是让jumpAction在执行另一次跳转之前完成。防止在已经运行的跳转动作期间触发另一次跳转 代码的关键跳转部分受到如下保护:
#define JUMP_ACTION_TAG 1001
-(void)jump {
// check if the action with tag JUMP_ACTION_TAG is running:
CCAction *action = [sprite getActionByTag:JUMP_ACTION_TAG];
if(!action) // if action is not running execute the section below:
{
// create jumpAction:
CCJumpBy *jumpAction = [CCJumpBy actionWithDuration:jumpDuration position:ccp(0,0) height:jumpHeight jumps:1];
// assign tag JUMP_ACTION_TAG to the jumpAction:
jumpAction.tag = JUMP_ACTION_TAG;
[sprite runAction:jumpAction]; // run the action
}
}
答案 2 :(得分:1)
您总是可以添加一个方法来指示方法何时完成,然后切换一些BOOL或类似的东西以指示它没有运行,并使用start方法切换BOOL以指示它已启动:
id actionMove = [CCMoveTo actionWithDuration:actualDuration
position:ccp(-target.contentSize.width/2, actualY)];
id actionMoveDone = [CCCallFuncN actionWithTarget:self
selector:@selector(spriteMoveFinished:)];
id actionMoveStarted = [CCCallFuncN actionWithTarget:self
selector:@selector(spriteMoveStarted:)];
[target runAction:[CCSequence actions:actionMoveStarted, actionMove, actionMoveDone, nil]];
从here.修改
在两个@selector方法中:
-(void) spriteMoveStarted:(id)sender {
ccMoveByIsRunning = YES;
}
和
-(void) spriteMoveFinished:(id)sender {
ccMoveByIsRunning = NO;
}
其中ccmoveByIsRunning是我所指的BOOL。
编辑:正如xus指出的那样,你实际上不应该这样做,而是像其他人指出的那样使用[self numberOfRunningActions]
。