feb
22
2012

Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Logica di gioco

Prefazione: Questi tutorial sono stati tradotti dall’Inglese all’Italiano sotto gentile concessione di
ray Wenderlich. Il link originale e i crediti li trovate a fondo di ogni articolo.
Per una comodità di impaginazione i tutorial sono stati divisi in più parti


Scriviamo la logica del gioco

Siamo finalmente pronti per scrivere il codice del nostro gioco. Quindi torniamo sul progetto in Xcode e iniziamo a divertirci realmente.

Prima assicuriamoci di avere incluso nel nostro progetti la nuova parte grafica (mouse.png), in questo punto la nostra cartella resource dovrebbe somigliare a qualcosa del tipo raffigurato in figura.

Per controllare il movimento continuo e permettere al giocatore di saltare, abbiamo bisogno di alcune variabili che puntano agli oggetti creati da LevelHelper. Aggiungere queste righe in HelloWorldScene.h all’interno della definizione di classe.

LHParallaxNode* paralaxNode;
LHSprite*   player;
b2Body*     playerBody;
LHSprite*   rocketFlame;

Poi al di fuori della definizione di classe, proprio prima della fine e dopo @end e subito dopo +(id)scena; aggiungere il seguente metodo:

-(void) retrieveRequiredObjects;

All’interno HelloWorldScene.mm, definire il nuovo metodo, in qualsiasi punto, ma assicurarsi che sia all’interno della dichiarazione della classe.
Nel mio caso, l’ho scritto subito dopo il metodo init.

-(void) retrieveRequiredObjects
{
    //Retrieve pointers to parallax node and player sprite.
    paralaxNode = [lh paralaxNodeWithUniqueName:@"Parallax_1"];
    NSAssert(paralaxNode!=nil, @"Couldn't find the parallax!");
 
    player = [lh spriteWithUniqueName:@"player"];
    NSAssert(player!=nil, @"Couldn't find the player!");
 
    playerBody = [player body];
    NSAssert(playerBody!=nil, @"Error taking the body from the player LHSprite.");
 
    rocketFlame = [lh spriteWithUniqueName:@"flame"];
    NSAssert(rocketFlame!=nil, @"Couldn't find flame sprite!");
 
    [rocketFlame setVisible:NO]; //You can do it in LH, but I do it here so you guys can see it in LH
}

Qui stiamo prendendo puntatori della parallasse ( il background in movimento ), dando il nome univoco della parallasse assegnato in LevelHelper.

Poi ci stiamo prendendo il puntatore dello sprite principale, dando il nome univoco. Potrebbe essere necessario modificare il nome univoco per leggere “player” come mostrato nello screenshot qui sotto se non è già impostata.

Allo stesso modo, è necessario modificare il nome univoco della fiamma di “flame” in modo che corrisponda il codice.

Quando si utilizza spriteWithUniqueName per cercare uno sprite, si ottiene un’istanza LHSprite *, che è una classe derivata da CCSprite. Da questo esempio *LHSprite prendiamo il puntatore del body di Box2D del giocatore, perché avremo bisogno di fare il salto più tardi.

Prendiamo poi il puntatore dello sprite flame e rendiamolo invisibile. Abbiamo solo bisogno di vedere la fiamma quando il giocatore è in volo. (Potevamo fare questa azione anche all’interno LevelHelper deselezionando l’opzione Visibile nella sezione Proprietà generali.)

Ora che abbiamo definito questo nuovo metodo, chiamiamolo (dopo che abbiamo caricato il livello).

lh = [[LevelHelperLoader alloc] initWithContentOfFile:@"level03"]; // o level02 se non lo hai cambiato
 
[lh addObjectsToWorld:world cocos2dLayer:self];
 
if([lh hasPhysicBoundaries])
    [lh createPhysicBoundaries:world];
 
if(![lh isGravityZero])
    [lh createGravity:world];
 
// Add this
[self retrieveRequiredObjects]; // Retrieve all objects after we’ve loaded the level.

Compilare il progetto e se la fiamma è invisibile tutto è andato a buon fine.

Prendiamo il volo

Ora la nostra missione è quello di far volare il nostro personaggio principale.

Aggiungiamo il seguente codice all’interno delle definizioni di classe del file HelloWorldScene.h

float  playerVelocity;
bool   playerWasFlying;
bool   playerShouldFly;

Useremo questi per far volare il topolino quando verrà premuto lo schermo.

Ora all’interno del file HelloWorldScene.mm replichiamo il metodo touch con quanto seguer

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{    
 
    playerVelocity = 0.5f;
    playerShouldFly = true;    
    [rocketFlame setVisible:YES];
    [player startAnimationNamed:@"mouseFly"];
}
////////////////////////////////////////////////////////////////////////////////
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
 
}
////////////////////////////////////////////////////////////////////////////////
-(void) cancelPlayerFly
{
    playerShouldFly = false;
    [rocketFlame setVisible:NO];
    playerWasFlying = true;
    playerVelocity = 0.0f;
}
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{       
    [self cancelPlayerFly];
}
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self cancelPlayerFly];
}

All’interno del metodo ccTouchesBegan, stiamo dicendo che quando l’utente tocca lo schermo, il giocatore dovrebbe iniziare a volare, la fiamma razzo dovrebbe diventare visibile e l’animazione di volo dello sprite principale si avviano.

Quindi avviamo l’animazione “mouseFly” sull’istanza player LHSprite* che recuperiamo sul metodo retrieveRequiredObjects

Quando il giocatore toglie il dito dallo schermo, o il tocco viene annullato, smettere di volare chiamando il metodo “cancelPlayerFly.” Nascondiamo anche la fiamma poiché il topo ha smesso di volare.

Ma questo non è sufficiente. Abbiamo detto al codice quando mostrare le animazioni per il volo, ma non abbiamo implementato il volo reale. Ciò richiede l’aggiunta del seguente codice all’interno del metodo “tick”:

if(playerShouldFly)
{
    playerBody->ApplyLinearImpulse(b2Vec2(0, playerVelocity), playerBody->GetWorldCenter());        
 
    playerVelocity += 0.01f;
 
    if(playerVelocity > 1.5f)
        playerVelocity = 1.5f;
}

Qui, controlliamo se il nostro personaggio dovrebbe volare e se risulta vero, si applica un impulso lineare, con una direzione orizzontale (su Y) sul corpo del topo.

Dobbiamo poi aumentare sempre di più la velocità, quindi lo sprite sarà come stanno decollando da terra, guadagnando velocità con il tempo.

Se la velocità raggiunge una certo limite (1,5), blocchiamo un ulteriore aumento.

Compiliamo ed eseguiamo il gioco, e ora si può fare al volo del nostro personaggio quando andiamo a toccare lo schermo con il dito!

Nei prossimi tutorial

Attueremo pienamente le collisioni, animeremo il volo del personaggio principale e gli atterraggi e andremo ad aggiungere i suoi.
Faremo morire il nostro sprite quando verrà a contatto con i cani, gatti o il laser e aggiungeremo una schermata di riavvio

Infine nell’ultima parte aggiungeremo dei conigli che corrono per dare al giocatore, aggiungeremo un display per il punteggio e infine creeremo una scena di sfondo a scorrimento che sarà visibile attraverso le finestre

Download RocketMouse Completo Parte 1

Loggati per scaricare il file

Sommario tutorial

1. Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Preparazione

2. Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. uso di Level Helper

3. Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Il livello

4. Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. lasers e coins

5. Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. aggiungiamo il personaggio principale

6. Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Logica di gioco

7. Creiamo un gioco simile a Jetpack usando LevelHelper e SpriteHelper. Le collisioni

8. Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: Il sound

9. Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: collisioni con gli animali e aggiustamenti del gioco

10. Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: rotazione laser e coniglietti

11. Creiamo un gioco simile a jetpack usando LevelHelper e SpriteHelper: punteggio e display layer


Questo è un articolo scritto da Bogdan Vladu, uno sviluppatore di applicazioni IoS e aspirante programmatore di videogiochi, vive attualmente a Bucharest in Romania.

Un ringraziamento speciale va a Ray Wenderlich che ci ha dato il permesso di tradurre in Italiano i suoi tutorial

http://www.raywenderlich.com/8183/how-to-make-a-game-like-jetpack-joyride-using-levelhelper-spritehelper-part-2

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.

5 Commenti + Aggiungi commento

  • Ciao, ho appena finito il tutorial. Devo dire che è davvero eccezionale! :) Comunque ho ancora qualche problemino, quando tocco lo schermo dell’iphone parte l’animazione del volo (infatti compare la fiamma), ma il topo non si alza da terra. Poi quando annullo il tocco la fiamma scompare, ma il topo resta sempre con le zampe unite (cioè non riparte l’animazione che c’era all’inizio, per farlo camminare).

  • Ho notato che nella compilazione compare un warning: ‘paralaxNodeWithUniqueName’ is deprecated

  • Io non ho notato quel warning, non dico che non c’è, dovrei riprovare…
    invece ti assicuro che il mio prende il volo.

    tra poco verrà pubblicata la terza parte del tutorial

  • Quando uscirà la continuazione del tutorial? :)

  • è in lavorazione, pubblicheremo presto la nuova parte

Non mi offendo, lascia pure un commento

Devi essere loggato per lasciare un commento.

Log In

Advertising

Entra nel forum

apri »