检查当前是否正在运行某个操作?

时间:2011-09-04 23:43:53

标签: objective-c cocos2d-iphone

是否可以检查Cocos2d中的CCNode类中是否存在当前正在运行的操作?我想知道CCMoveBy是否仍在运行。

3 个答案:

答案 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]