2012-06-03 4 views
0

Я новичок в использовании CCAnimations в cocos2D, и у меня возникла проблема, с которой мне было трудно решить проблему.EXC_BAD_ACCESS при переключении CCAnimations

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

У меня есть следующий код в init методе моего слоя:

sprite = [CCSprite spriteWithSpriteFrameName:@"stand.png"]; 

standingSprites = [NSArray arrayWithObjects: 
        [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"stand.png"], 
        nil]; 
runningSprites = [NSArray arrayWithObjects: 
        [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"run1.png"], 
        [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"run2.png"], 
        nil]; 

standingAnimation = [CCAnimation animationWithFrames:standingSprites delay:0.2f]; 
runningAnimation = [CCAnimation animationWithFrames:runningSprites delay:0.2f]; 
animationAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:standingAnimation]]; 
[sprite runAction:animationAction]; 

Это работает, как ожидается, либо из двух анимаций. Тем не менее, я хочу запустить standingAnimation, когда игрок стоит на месте и runningAnimation, когда игрок работает. Я попытался сделать это следующим образом:

-(void)walk { 

    if(!isWalking) { 
     isWalking = true; 
     [sprite stopAction:animationAction]; 
     animationAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:runningAnimation]]; 
     [sprite runAction:animationAction]; 
    } 
} 

Второй до последней строки происходит сбой программы, в результате чего EXC_BAD_ACCESS (на ссылки 0x0). Выбрав в отладчике walk, не видно, что любой из соответствующих указателей имеет значение NULL.

Из трассировки стека:

2012-06-03 10:59:59.907 ThirtyMinutes[9876:6403] *** Terminating app 
due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[NSCTFontDescriptor frames]: unrecognized selector sent to instance 
0x7f808d93e9f0' 

0x7f808d93e9f0 это адрес runningAnimation.

  1. Что я делаю неправильно?
  2. Есть ли лучший способ сделать это?

Спасибо!

ответ

2

В сообщении об ошибке сообщается, что в момент ошибки 0x7f808d93e9f0 является адресом объекта NSCTFontDescriptor. Вероятная причина заключается в том, что вы не сохраняете runningAnimation, и его память была исправлена ​​для другого объекта.

(Показать декларацию runningAnimation, если его не ясно, каким образом это происходит.)

+0

Вызов сохранения на анимации исправил его. Благодаря! – jonmorgan

0

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

Смежные вопросы