我如何在iOS上制作爆炸动画?

时间:2011-06-29 04:59:57

标签: iphone ios core-animation

我有一个iOS游戏,当一个球击中目标时它会爆炸。

为爆炸制作动画的最佳方式是什么?

4 个答案:

答案 0 :(得分:5)

如果你正在寻找简单的东西。

制作一系列使爆炸生动的图像。将它们添加到UIImageView并启动动画。像这样:

UIImage *image0 = [UIImage imageNamed:@"explosion0.png"];
UIImage *image1 = [UIImage imageNamed:@"explosion1.png"];
UIImage *image2 = [UIImage imageNamed:@"explosion2.png"];
UIImage *image3 = [UIImage imageNamed:@"explosion3.png"];

myImageView.animationImages = [NSArray arrayWithObjects:image0, image1, image2, image3, nil];
[myImageView setAnimationDuration:0.75f];

[myImageView startAnimation];

答案 1 :(得分:2)

对于弹跳球游戏,Cocos2D游戏和Box2d物理 - (包含在Cocos2D中)引擎是一个很好的方法。

Ray Wenderlich有三个很棒的教程,关于你想要做什么:

  1. Intro to Box2D with Cocos2D Tutorial: Bouncing Balls
  2. How To Create A Breakout Game with Box2D and Cocos2D Tutorial: Part 1
  3. How To Create A Breakout Game with Box2D and Cocos2D Tutorial: Part 2
  4. 一旦您了解了使用Box2d对象的基础知识,关键步骤是创建一个Contact Listener(如教程中所述),它将告诉您何时发生冲突。检查(通过在tick方法中迭代联系人)是否碰撞对象是爆炸所需的对象,如果是,则将它们添加到要销毁的对象向量中(我们不能在迭代联系人时执行此操作或我们将使迭代器无效)。记住碰撞的坐标并设置爆炸标志。

    退出循环后,破坏物体并在保存的位置运行爆炸效果。

    Cocos2D有一些非常好的内置爆炸效果,我在项目中使用的是CCParticleSun。您可以找到使用此效果here的人的屏幕截图。 (奇妙的名字CCParticleExplosion刚刚在屏幕上飞了很多五彩纸屑。)

    以下是我工作的一些初步代码的相关部分,主要来自教程。你仍然需要做其他一切,例如。在你的init方法中创建和设置你的世界和身体,更新位置,应用力量,并在你的tick方法中绘制,实现你的Contact Listener类等。所有这些都参考教程。

    std::vector<b2Body *>toDestroy;
    std::vector<MyContact>::iterator pos;
    CGPoint p;
    bool explode = FALSE;
    for(pos = _contactListener->_contacts.begin(); 
        pos != _contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;
    
        if ((contact.fixtureA->GetBody() == _moonBody && contact.fixtureB->GetBody() == _moon2Body) ||
            (contact.fixtureA->GetBody() == _moon2Body && contact.fixtureB->GetBody() == _moonBody)) {
            NSLog(@"Moons collided!");
            explode = TRUE;
            p = CGPointMake(PTM_RATIO*(_moonBody->GetPosition().x + _moon2Body->GetPosition().x)/2.,PTM_RATIO*(_moonBody->GetPosition().y + _moon2Body->GetPosition().y)/2.);
            if (std::find(toDestroy.begin(), toDestroy.end(), _moonBody) == toDestroy.end()) {
                toDestroy.push_back(_moonBody);
            }
            if (std::find(toDestroy.begin(), toDestroy.end(), _moon2Body) == toDestroy.end()) {
                toDestroy.push_back(_moon2Body);
            }
        }
    }
    
    std::vector<b2Body *>::iterator pos2;
    for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
        b2Body *body = *pos2;     
        if (body->GetUserData() != NULL) {
            CCSprite *sprite = (CCSprite *) body->GetUserData();
            [sprite.parent removeChild:sprite cleanup:YES];        }
        world->DestroyBody(body);
    }
    
    if (explode)
    {
        explosion = [[CCParticleSun alloc]initWithTotalParticles:250];
        explosion.texture = [[CCTextureCache sharedTextureCache] addImage:@"fire.png"];
        explosion.autoRemoveOnFinish = YES;
        explosion.startSize = 15.0f;
        explosion.speed = 30.0f;
        explosion.position = p;
        explosion.duration = 1.0f;
        [self addChild:explosion z:self.zOrder+1];
    }
    

答案 2 :(得分:1)

然后,您想要的是创建粒子发射系统的方法。我的建议是使用CAEmitterLayer。 Ray Wenderlich有一个很棒的教程:UIKit Particle Systems in iOS 5 Tutorial

答案 3 :(得分:0)

iPhone Programming Tutorial: Animating a Game Sprite

如果你需要制作爆炸,另一种方法是使用Cocos2d并执行:

CCParticleSun *anExplosion=[CCParticleGalaxy node];
[kk setPosition:ball.position];
[self addChild:anExplosion];

从你似乎没有使用Cocos2d的问题来看,也不是真正的动画,但如果你开始使用它,你可以这样做......