2012-07-26 48 views
1

在我的代碼中,朝向船的小行星 如果激光撞擊小行星,我想實現爆炸動畫。 小行星應運行爆炸動畫並切換到隱形模式。Cocos2D setvisible =動畫完成後沒有

當目標被擊中時,沒有動畫,目標成功切換到隱形模式。沒有將對象設置爲不可見,動畫效果很好。當我將程序代碼放在一起而沒有看到動畫時,它很快將對象設置爲隱形。

我怎樣才能看到動畫,然後將其設置爲隱形模式。 (目標aka小行星速度不同,其中一些速度太快,而其他速度太慢) 將目標置於不可見狀態的想法阻止了它們撞上船。

我想這個問題的答案& cocos2d autoremove sprite after animation沒有工作

for (CCSprite *asteroid in _asteroids) 
{   
    if (!asteroid.visible) continue; 

     for (CCSprite *shipLaser in _shipLasers) 
     {       
      if (!shipLaser.visible) continue; 

      if (CGRectIntersectsRect(shipLaser.boundingBox, asteroid.boundingBox)) 
      {     
       [[SimpleAudioEngine sharedEngine] playEffect:@"explosion_large.caf"]; 

       //explosion zombie animation starts 
       NSMutableArray *walkAnimFrames = [NSMutableArray array]; 
       for(int i = 1; i <= 12; ++i) 
       { 
        [walkAnimFrames addObject: 
        [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: 
         [NSString stringWithFormat:@"zombieexplodes%d.png", i]]]; 
       } 
       CCAnimation *walkAnim = [CCAnimation 
             animationWithFrames:walkAnimFrames delay:0.1f]; 


       _dieAction = [CCRepeatForever actionWithAction: 
           [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]]; 

       [asteroid runAction:_dieAction]; 
       //explosion zombie ends 

       [self addPoint]; 

       //change meme to woohoo.png 
       [_ship setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: @"woohoo.png"]]; 

       shipLaser.visible = NO; 
       [asteroid setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: @"zombieexplodes13.png"]]; 
       //asteroid.visible=NO; 


       continue; 
      } 
     } 
} 

回答

1

使用這種風格上呼籲:

CCAnimation *walkAnim = [CCAnimation 
         animationWithFrames:walkAnimFrames delay:0.1f]; 
id animate = [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]; 
id calFuncN = [CCCallFuncN actionWithTarget:self selector:@selector(explodeAnimDone:)]; 
id sequence = [CCSequence actions:animate, calFuncN,nil]; 

[asteroid runAction:sequence]; 

當你的動畫完成禁用精靈。

-(void)explodeAnimDone:(id)sender 
{ 
    CCNode *myNode = (CCNode*)sender; 
    myNode.visible = false; 
} 
+1

我喜歡CCCallBlockN樣品: CCCallBlockN * calFuncN = [CCCallBlockN actionWithBlock:^(CCNode *節點){ node.visible = FALSE; } – zeiteisen 2012-07-26 19:06:05

+0

@zeiteisen,感謝這個信息,它減少了代碼行數。 – Guru 2012-07-26 19:17:18

+1

像Matthijs Hollemans說的那樣:懶惰是程序員的最大美德:) – zeiteisen 2012-07-26 19:44:30

1

有沒有做遊戲開發的Cocoa2D,但是當我做了這樣的比賽我有刪除自身,當它的動畫結束了單獨的爆炸對象。所以你應該生成一個爆炸物體,並立即將小行星變爲不可見。如果無法在動畫完成時使用自動刪除功能,請定時爆炸,然後在爆炸對象上設置一個定時器以刪除自身。

我注意到你正在把小行星看不見......你應該把它們移開 - 當它們不可見時,它們仍然會記憶。