ott
30
2011

Esplosione con cocos2D

In questo tutorial vi illustrerò come realizzare un’esplosione al tocco del dito sullo schermo.

Partiamo quindi con il creare un nuovo progetto cocos2D

Qui i file necessari per l’esplosione, un .plist e un immagine .png

Download Grafica esplosione

Loggati per scaricare il file

Aggiungere la chiamata nel file helloWorldScene.h subito sotto la chiusura del blocco @interface

-(void)Explosion:(CGPoint)newPosition;

Questa è la dichiarazione della nostra funzione. Tornerà la posizione del touch, se si omette questa chiamata tornerà questo errore: “‘hello world’ may not respond to ‘-Explosion’”

Ora passiamo al file .m

Per prima cosa dobbiamo dire al programma che il touch è valido, per fare questo aggiungiamo al metodo init la seguente dichiarazione

self.isTouchEnabled=TRUE;

ora l’applicazione è pronta a ricever il touch.

Ora i metodi che definiscono il tocco, per questa app useremo solo la chiamata a fine tocco. Da inserire sempre nel file .m

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
 
   UITouch *touch = [touches anyObject];
 
   CGPoint location = [touch locationInView:[touch view]];
 
   location = [[CCDirector sharedDirector] convertToGL:location];
 
   [self Explosion:location];
 
}

Nel codice precedente viene dichiarato che ogni tocco è valido, poi localizza il dito e infine chiama il nostro metodo Explosion, che ora andiamo a creare.

-(void) Explosion:(CGPoint)newPosition{
 
   [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Explosion.plist"];
 
   CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"Explotion1.png"];
 
   sprite.position = newPosition;
 
   [self addChild:sprite z:3];
 
   NSMutableArray *animFrames = [NSMutableArray array];
 
   CCSpriteFrame *frame1 = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"Explotion1.png"];
 
   [animFrames addObject:frame1];
 
   CCSpriteFrame *frame2 = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"Explotion2.png"];
 
   [animFrames addObject:frame2];
 
   CCSpriteFrame *frame3 = [[CCSpriteFrameCache sharedSpriteFrameCache]    spriteFrameByName:@"Explotion3.png"];
 
   [animFrames addObject:frame3];
 
   CCAnimation *animation = [CCAnimation animationWithName:@"dance" delay:0.2f    frames:animFrames];
 
   [sprite runAction:[CCSequence actions:[CCAnimate actionWithAnimation:animation restoreOriginalFrame:YES],
 
   [CCCallFuncN actionWithTarget:self selector:@selector(spriteDone:)],nil]];
 
   [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
 
}

Ecco qua la nostra creazione.

La prima riga richiama il plist che è scaricabile all’inizio del tutorial

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Explosion.plist"];

la seconda è un array mutabile, cioè che possono essere aggiunti spostati eliminati o modifica elementi all’interno dell’array, objective-c ne ha di diversi tipi.

NSMutableArray *animFrames = [NSMutableArray array];

Le righe che seguono creano la sequenza di frame per l’animazione e le deposita nella cache, cosi facendo vengono caricate prima e non vi saranno ritardi all’apertura del programma.

infine il tutto viene richiamato per creare una vera e propria animazione e vengono rimosse le immagini dalla cache.

[sprite runAction:[CCSequence actions:[CCAnimate actionWithAnimation:animation restoreOriginalFrame:YES],

 

Attenzione che in un gioco completo un animazione di questo genere è sconsigliato in quanto avrebbe bisogno di molta memoria, è più consigliabile utilizzare un file plist, vedremo nei prossimi tutorial come fare.

Ultimo passo: questa funzione pulisce il tutto alla fine dell’animazione

- (void)spriteDone:(id)sender {
 
CCSprite *sprite = (CCSprite *)sender;
 
[self removeChild:sprite cleanup:YES];
 
}

 


 

Per qualsiasi dubbio, problema o se hai bisogno di un aiuto:
Fai una domanda nella sezione answer

Articoli correlati

Info sull'autore: Gabriele Carbonai

Sono un appassionato di programmazione. Ho iniziato a scrivere i primi codici con visual basic per poi passare a Java. Mi sono specializzato in php e jquery prima di scoprire un mondo ancor più affascinante... objective-c.

20 Commenti + Aggiungi commento

  • la cartella con il file plist e le foto contiene solo 2 file:
    explotion.plist
    explotion.bmp
    sicuro sia giusto?

  • Dovrebbe essere png il file ma ora non ricordo.. Comunque sia è corretto..

  • Confermo… Uno è plist e l’altro png. Perché questo dubbio? Cosa non ti è chiaro?

  • Che nella cartella ci sono i file:
    explotion.plist
    explotion.png
    e nel codice sono citati:
    Explosion.plist
    Explotion1.png
    Explotion2.png
    Explotion3.png
    E’ giusto lo stesso?
    Perché a me il codice non da errori però nella simulazione esce la scritta di hello world come se non avessi scritto niente.

  • explotion1.png 2 e 3 non esistono realmente.
    si ha un immagine explotion.png grande contenente diciamo le altre tre immagini.
    poi si ha un file plis che mappa l’immagine explosion.png.
    all’interno del file plist ci sono le diverse mappature che hanno il nome explotion1.png e cosi via con delle coordinate per prelevare solo la parte di immagine interessata.

  • all’interno di init togli tutto il codice che stampa hello world.. deve essere cosi:

    -(id) init
    {
    // always call “super” init
    // Apple recommends to re-assign “self” with the “super” return value
    if( (self=[super init] )) {

    self.isTouchEnabled=TRUE;
    }
    return self;
    }

    con il touch valido… ora appena tocchi lo schermo partono tutti gli eventi e vedi l’esposione

  • Lo schermo resta nero tranne i numeri che si muovo in basso a destra ma non mi da nessun errore. Prova a dare un occhiata. http://imageshack.us/photo/my-images/194/schermata112455893alle1.png/

    grazie

  • è giusto che vedi una schermata nera.. devi cliccare sopra lo schermo per vedere l’animazione.

    tutti i codici tutorial di questo blog vengono prima realizzati e testati con xcode, dopo di che vengono fatti i tutorial con il copia e incolla in modo da non sbagliare

  • ho provato ma dopo il click xcode mi restituisce il tipico errore
    http://imageshack.us/photo/my-images/683/schermata112455893alle1.png/

  • ti ho caricato il progetto completo cosi che puoi provarlo e capire dove c’è l’errore

  • Grazie, l’errore era proprio nel nome dei file

  • Ciao,
    innanzitutto complimenti per l’iniziativa, devo dire che il blog mi sta tornando molto utile…
    Sono arrivato a questa esercitazione ma non riesco a capire dove sbaglio, mi spunta la videata nera ma toccando lo schermo nn mi spunta nulla..dove posso sbagliare??

  • hai aggiunto le immagini?
    la schermata nera è normale ma quando tocchi dovresti vedere un esplosione

  • si le immagini le ho aggiunte!!

  • ma non mi spunta nulla

  • http://imageshack.us/photo/my-images/685/schermata012455942alle1.png/

    Ecco l’errore che mi spunta!!!

    Grazie mille
    Dario

  • strano… hai provato a scaricare il progetto?

  • Continua a darmi l’errore su ccanimation puoi inoltrarmi la stringa corretta?
    la mia è:

    CCAnimation *animation =[CCAnimation animationWithName:@"dance" delay:0.2f frames:animFrames];

  • che tipo di errore ti da?

  • ecco l’errore:
    Class method + animationWhitName:delay:frames:’not found (return type defaults to ‘id

Non mi offendo, lascia pure un commento

Devi essere loggato per lasciare un commento.

Log In

Advertising

Entra nel forum

apri »

Warning: gethostbyaddr() [function.gethostbyaddr]: Address is not a valid IPv4 or IPv6 address in /home/gomonkey/public_html/stats/php-stats.recphp.php on line 282