2011-01-28 2 views
1

Я пытаюсь предварительно загрузить анимацию в методе init моего слоя. Затем я вызываю анимацию, если экран коснулся. Приложение вылетает без сообщения об ошибке, как только я касаюсь экрана, и, похоже, это связано с вызовом предварительно загруженной анимации. Я хотел бы сделать это таким образом, так как кажется, что создавать анимацию каждый раз, когда экран тронут, кажется дорогим, что, похоже, работает. Любые советы очень ценятся.Cocos2d: Предварительная загрузка анимации вызывает сбой

Пример кода:

В моем заголовке:

@interface Test : CCLayer { 
    NSMutableArray *wake; 
    CCSprite* ani; 
    CCAnimate *animate; 
} 
@end 

В моей реализации:

-(id) init { 
     if((self=[super init])) {  
    // enable touches 
    self.isTouchEnabled = YES; 

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"ani.plist" texture:[[CCTexture2D alloc] initWithImage:[UIImage imageNamed:@"ani.png"]]]; 
      ani = [CCSprite spriteWithSpriteFrameName:@"ani1.png"]; //comes from .plist file 
      ani.anchorPoint=ccp(0,0); 
      ani.position = ccp(700,65); 
      [self addChild:ani z:30]; 

    wake = [NSMutableArray array]; 
      for(int i = 1; i <= 4; i++) { 
       [wake addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"ani%d.png",i]]]; 
      } 
      animate = [CCAnimate actionWithAnimation:[CCAnimation animationWithFrames:wake delay:1.0f] restoreOriginalFrame:FALSE]; 

     } 
     return self;             
    } 

Handling прикосновение:

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
// run the animation 
    [ani runAction:animate]; 
} 

ответ

0

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

0

Анимации в Cocos2d не предназначены быть реу СЕПГ. Вы должны создавать новый каждый раз.

+0

. Нужно ли вам каждый раз загружать массив? неужели это должно быть хитом производительности? – Chev

+0

Вы можете кэшировать массив следа, но вам нужно вызвать animate = [CCAnimate actionWithAnimation: [CCAnimation animationWithFrames: wake delay: 1.0f] restoreOriginalFrame: FALSE]; каждый раз. – badgerr

0

Вам нужно сохранить анимацию, но массив может быть локальным.

self.myAnimation = [[CCAnimation animationWithFrames:myAniFramesArray delay:0.1f] retain]; 

Не забудьте сделать свойство неатомической, сохранить как заявлено Chev и освободить любые объекты, сохраняющие в соответствующем методе dealloc.

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