【问题标题】:Cocos2D setvisible =no after animation finishes动画结束后 Cocos2D setvisible =no
【发布时间】:2012-07-26 17:35:16
【问题描述】:

在我的代码中,小行星向飞船驶来, 如果激光击中小行星,我想实现爆炸动画。 小行星应该运行爆炸动画并切换到隐形模式。

击中目标时没有动画,目标成功切换到隐形模式。在不将对象设置为不可见的情况下,动画运行良好。当我因为程序代码而没有看到动画而将它放在一起时,它很快将对象设置为不可见。

我怎样才能看到动画然后将其设置为不可见模式。 (目标又名小行星的速度不同,其中一些太快而另一些太慢) 让目标隐形的想法是防止他们撞到船。

我试过这个问题&回答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;
            }
        }
}

【问题讨论】:

    标签: objective-c ios animation cocos2d-iphone


    【解决方案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;
    }
    

    【讨论】:

    • 我喜欢 CCCallBlockN 示例:CCCallBlockN *calFuncN = [CCCallBlockN actionWithBlock:^(CCNode *node) { node.visible = false; }
    • @zeiteisen,感谢您提供此信息,它减少了代码行数。
    • 就像 Matthijs Hollemans 说的:懒惰是程序员最大的美德 :)
    【解决方案2】:

    还没有在 Cocoa2D 中进行游戏开发,但是当我制作这样的游戏时,我会有一个单独的爆炸对象,它会在动画结束时自行移除。所以你应该生成一个爆炸物体并立即使小行星隐形。如果您无法在动画完成时自动移除,请为爆炸计时,然后在您的爆炸对象上设置一个计时器以自行移除。

    我注意到您正在使小行星隐形...您应该将它们移除 - 它们在隐形时仍会占用内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2022-07-29
      • 2016-02-23
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 2015-06-01
      相关资源
      最近更新 更多