¿Cómo haría una animation de explosión en iOS?

Tengo un juego de iOS, y cuando una pelota golpea un objective explota.

¿Cuál sería la mejor manera de animar esta explosión?

Si buscas algo simple.

Haz una serie de imágenes que animen la explosión. Agregue esas a una UIImageView e inicie la animation. Algo como esto:

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

Para un juego de pelota que rebota, el juego Cocos2D y la física Box2d (incluidos con Cocos2D) son una excelente manera de jugar.

Ray Wenderlich tiene tres excelentes tutoriales sobre exactamente lo que quieres hacer:

  1. Introducción a Box2D con Cocos2D Tutorial: Bolas rebotando
  2. Cómo crear un juego de ruptura con Box2D y Cocos2D Tutorial: Parte 1
  3. Cómo crear un juego de discusión con Box2D y Cocos2D Tutorial: Parte 2

Una vez que pasas los conceptos básicos de trabajar con objects Box2d, el paso key es crear un oyente de contacto (como se describe en los tutoriales) que te dirá cuándo tienes una colisión. Comtesting (al repetir iterando sobre los contactos en tu método de tick) si los objects que colisionan son los que deseas para la explosión, y si es así, agrégalos a un vector de objects que se destruirán (no podemos hacerlo mientras se itera sobre contactos). invalidará el iterador). Recuerde las coorderadas de la colisión y establezca una bandera para la explosión.

Después de salir del loop, destruye los cuerpos y ejecuta el efecto de explosión en la position guardada.

Cocos2D tiene algunos muy buenos efectos de explosión incorporados, y el que estoy usando para mi proyecto es CCParticleSun. Puedes encontrar algunas capturas de pantalla de alguien que usa este efecto aquí . (El curiosamente llamado CCParticleExplosion acaba de dar un montón de confeti volando por la pantalla).

Aquí está la parte relevante de algún código preliminar que tengo funcionando, que es principalmente del tutorial. Todavía tendrá que hacer todo lo demás, por ej. cree y configure su mundo y sus cuerpos en su método init, actualice las posiciones, aplique fuerzas y dibuje en su método tick, aplique su class de escucha de contacto, etc. Para todo esto, consulte los tutoriales.

 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 shanetworkingTextureCache] 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]; } 

Lo que quiere, entonces, es una forma de crear un sistema de emisión de partículas. Mi sugerencia es utilizar un CAEmitterLayer. Ray Wenderlich tiene un gran tutorial: UIKit Particle Systems en iOS 5 Tutorial

Tutorial de progtwigción de iPhone: Animación de un juego Sprite

Si necesita hacer una explosión, otra alternativa sería utilizar Cocos2d y hacer lo siguiente:

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

En realidad no es una animation, también, de la pregunta no parece que estés usando Cocos2d, pero si comienzas a usarlo puedes hacer esto …