2011-06-29 57 views
3

我有一款iOS遊戲,當一個球擊中目標時會爆炸。如何在iOS上製作爆炸動畫?

什麼是最好的動畫爆炸的方式?

+11

隨着iPhone的實際爆炸,當然。 – PengOne

+1

如果你想要一個真正的答案,解釋你如何讓你的遊戲有點。你用什麼方法繪製它? OpenGL的? cocos2d的?的UIImageView的? CoreGraphics中?你的問題有很多答案,因爲它缺少細節。 –

回答

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]; 
+0

該代碼有效,但Apple的粒子發射器更好,因爲您可以簡單地定義粒子的外觀和發射源/速率。例如,我可以創建數百萬個以每秒100個粒子的速度爆炸的灰色粒子,速度爲100個單位/秒,並且重疊的粒子會產生較暗的像素。 – moonman239

0

iPhone Programming Tutorial: Animating a Game Sprite

如果你需要做一個爆炸另一種選擇是使用cocos2d的和做的事:

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

不是一個真正的動畫,也從你的問題似乎沒有被使用Cocos2d,但如果你開始使用它,你可以做到這一點......

2

對於彈跳球遊戲,Cocos2D遊戲和Box2d物理(包括在Cocos2D)引擎是一個偉大的路要走。

雷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

一旦你過去與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]; 
}