Проверить, запущено ли в данный момент действие? - PullRequest
5 голосов
/ 05 сентября 2011

Можно ли проверить, выполняются ли в настоящий момент действия в классе CCNode в Cocos2d? Я хотел бы знать, работает ли CCMoveBy или нет.

Ответы [ 3 ]

6 голосов
/ 05 сентября 2011

Вы можете использовать [self numberOfRunningActions] на любом CCNode. В вашем случае звучит так, будто вы хотите знать, выполняются ли какие-либо действия или нет, поэтому не сложно узнать точное число заранее.

5 голосов
/ 22 декабря 2012

Мы можем легко проверить, выполняются ли конкретные действия, используя метод 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
    }
}
1 голос
/ 05 сентября 2011

Вы всегда можете добавить метод, чтобы указать, когда метод завершен, а затем переключить некоторый BOOL или что-то подобное, чтобы указать, что он не запущен, и поместить метод запуска, чтобы переключить 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]];

Изменено с здесь.

В двух методах @selector:

-(void) spriteMoveStarted:(id)sender {
    ccMoveByIsRunning = YES;
}

и

-(void) spriteMoveFinished:(id)sender {
    ccMoveByIsRunning = NO;
}

где ccmoveByIsRunning - БУЛА, о которой я говорю.

РЕДАКТИРОВАТЬ : Как указал xus, на самом деле вы не должны этого делать и вместо этого использовать [self numberOfRunningActions], как указали другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...