Перезапуск действия в cocos2D для iPhone - PullRequest
1 голос
/ 12 августа 2010

Если я использую действие, которое не повторяется в cocos2D, как мне перезапустить это действие?

Я использую код:

 CCAnimate* action = [CCAnimate actionWithAnimation:myAnimation];

 [mySprite runAction: action];

Действие запускается нормально один раз, но когда событие инициируется, я хочу иметь возможность запустить действие снова, пока оно завершено, поэтому я попытался использовать это, когда сработало событие.

 if( [action isDone] ){

     [mySprite runAction: action];

 }

Но это приводит к сбою. Кто-нибудь знает, как правильно это сделать?

Ответы [ 3 ]

2 голосов
/ 12 августа 2010

попробуйте сохранить действие в переменной экземпляра.В заголовочном файле указатель, объявленный

CCAction* myAction;

, затем, когда слой или спрайт инициализируется

myAction = [CCAnimate actionWithAnimation:myAnimation];

С какого момента, когда вы хотите вызвать свое действие, делайте

if( [action isDone] ){

 [mySprite runAction: myAction];

}

Я думаю, что причина сбоя вашего приложения в том, что вы вызываете действие, которое существует только на время метода, в котором оно инициализируется.

Я игра, я использую CCSequence (такя могу использовать CCCallFunc для установки / объявления переменных в середине анимации), все эти CCSequence хранятся как переменные экземпляра в моем подклассе CCSprite.

У меня есть бездействующая анимация, которая повторяется навсегда.

Всякий раз, когда я хочу, например, «прыгнуть», я вызываю

[self stopAllActions];
[self runAction:jumpSeq];

Мой jumpSeq - это CCSequence, который воспроизводитанимация прыжка; в конце последовательности имеется CCCallFunc, который перезапускает анимацию ожидания, когда она завершена.

Надеюсь, это поможет.

Дополнительная информация: http://www.cocos2d -iphone.org / вики / doku.php / prog_guide: actions_special s [] = cccallfunc

0 голосов
/ 08 декабря 2011

У меня была та же проблема, я объявил CCAction * myAction в заголовочном файле, но когда я пошел вызывать его из другого метода, у меня произошел сбой, но, как упомянуто @Bongeh при использовании [myAction retain], он работал отлично

0 голосов
/ 12 августа 2010

Оказывается, я просто не сохранял действие, и спрайт, должно быть, удалял его, как только оно было сделано. Так что теперь мой код:

  CCAnimate* action = [CCAnimate actionWithAnimation:myAnimation];

  [mySprite runAction: action];

  [action retain];

и затем, когда я хочу, чтобы он снова запустился;

 if( [action isDone] ){

      [mySprite runAction: myAction];

 }
...