lunedì 9 gennaio 2012

Jumping Jump

Ecco a voi uno dei miei più grandi progetti. Si tratta di un clone del gioco DoodleJump. E' stato programmato in XNA 4.0 e C#.
Piccola introduzione: questo articolo è stato riscritto il 31/03/2013 per migliorarne la forma e i contenuti. Dato che ora è in versione quasi finale, ho ritenuto meglio aggiornare...
 Per chi avesse visto il post nella vecchia versione (che lascio disponibile a questo indirizzo) ecco un changelog:
- Supporto al mouse
- Salvataggio della classifica e delle statistiche di gioco
- Implementate quelle che chiamavo tabelle (le spiego più giù...)
- Aggiornata la funzione che fa rimbalzare il doodle
- Migliorata la grafica e la "schermata" iniziale
- Aggiunti i nemici
- Aggiunti gli oggetti bonus
- Aggiunti vari tipi di piattaforme
- Aggiunto file di configurazione
- Aggiunto menu di pausa
- Rewrite completo del codice e rimosse le inutili librerie che avevo messo per separare le funzioni
- E forse altro ancora...

Ok come ho già detto si tratta di un gioco clone di DoodleJump sulla piattaforma PC. Non avendo trovato questo gioco per computer ho pensato di iniziare a programmarlo io...
Per creare JumpingJump ho utilizzato:
- Microsoft Visual Studio 2010 Express
- Microsoft XNA 4.0
- Programmi di grafica  (Paint.net e altri...)
- Mia cugina (grazie Anna!)
- Tanta pazienza e voglia di pensare ed impegnarsi (e di sbattere la testa sulle funzioni matematiche....)

Bene, chi non avesse mai giocato a DoodleJump l'obbiettivo è quello di raggiungere un punto più alto possibile. Per farlo bisogna spostare il personaggio a destra e a sinistra per farlo saltare su delle piattaforme sempre più rare e difficili da raggiungere. Come se non bastasse ci sono anche dei mostri alieni che ostacolano il percorso, bisogna ucciderli per non rischiare di morire... fortunatamente il nostro doodle spara delle micidiali palline di gomma (lo so, ho una grande fantasia.... xD ). Ci sono vari tipi di nemici, da quelli più semplici, per cui basta un proiettile, a quelli più impegnativi, ai quali ne servono di più. Ad ulteriore difficoltà i blocchi non sono tutti uguali. Ci sono vari tipi di blocchi: quelli solidi, dove ci si può saltare quanto si vuole, quelli meno solidi, ci si può saltare solo un numero limitato di volte, quelli falsi, sui quali è inutile provare a saltare, quelli che si spostano orizzontalmente e verticalmente, e quelli fragili, ci si può saltare solo una volta.
La grafica non è ai livelli dell'originale, ma rimane comunque interessante, tutto merito del team grafico (io e mia cugina...). Ci sono anche dei bonus che si possono incontrare durante il gioco: un cappellino che ti permette di volare per brevi tratti, un piccolo jetpack che ti fa risalire in fretta, una molla che ti fa compiere un balzo verso l'alto, ed infine un mega razzo, con il quale puoi percorrere molta più strada...

Dopo questa spiegazione teorica passiamo ai fatti: come funziona?
Ovviamente se spiegassi passo per passo tutto il funzionamento diventeremmo tutti vecchi, parlerò quindi delle strategie più interessanti e delle funzioni clou.
Il primo problema che mi si è presentato quando ho iniziato a programmare la prima versione di questo gioco è stato quello di far saltare il nostro doodle. Mi serviva una funzione matematica che mi facesse muovere fluidamente e come volevo il personaggio. Quello che mi interessava era farlo salire partendo da una certa velocità fino ad una certa altezza, farlo poi scendere con velocità sempre maggiore. Quando ho programmato questa funzione ero ancora in prima superiore e non conoscevo bene le parabole e le loro applicazioni, quindi il metodo che ho usato è abbastanza sbagliato. Vabbè. Allora, ho diviso il movimento in due parti. La prima è la salita, la seconda la discesa. Per salire avevo usato un pezzo della funzione seno (in realtà coseno...). Precisamente un quarto di quella funzione, quella di risalita. Ripensandoci era meglio usare anche qui una parabola... Ok, non è difficile adesso, arrivarci alcuni anni fa invece lo è stato un po' di più. Per la discesa non potevo usare ancora il seno, se lo avessi usato avrei ottenuto un movimento fluido ma che si sarebbe fermato in caduta per poi risalire e continuare ciclicamente. Allora ho dovuto cambiare funzione. Per la discesa ho utilizzato la funzione della parabola. Il suo funzionamento è abbastanza ovvio e non mi dilungherò. Per quanto riguarda i salti penso che basti così, non c'è molto altro da dire.
Un altro grande problema che dovevo risolvere era quello di evitare che il player possa uscire dalla parte superiore dello schermo. Per fare ciò mi sono messo a giocare a DoodleJump e ho cercato di capire come i creatori possano aver risolto questo grande problema. Devo dire che hanno avuto un'idea veramente geniale. Ci ho messo un po' a capirla dato che è stata realizzata veramente benissimo. Il concetto è semplice, far salire il giocatore, se non c'è spazio allora facciamo scendere il resto... Quando l'ho capito sono rimasto veramente stupefatto, è assolutamente un'idea geniale... Applicare questa soluzione è stato abbastanza facile. Appena il giocatore arriva ad una quota limite il suo spostamento viene reindirizzato al mondo che lo circonda con segno opposto. Il risultato è un'illusione ottica veramente ottima.
Il problema più grande che affliggeva la versione precedente era quello delle piattaforme che si sovrapponevano e che si mettevano come gli pareva... Per risolvere ho dovuto adottare una strtegia un po' scomoda. Dentro la cartella Content/Data/Posizioni ci sono dei file in formato pck che contengono delle informazioni riguardo le piattaforme e i nemici. Se ci fossero molti di questi file il le posizioni delle piattaforme apparirebbero come generate a caso dato che non sarebbero facilmente distinguibili. Per generare questi file è necessario un altro programma che ho scritto, si tratta di "JumpingJump Piattaforme". Questo editor si aggancia all'eseguibile del gioco per creare e visualizzare i livelli. Forse il programma non è proprio intuitivo e forse non funziona troppo bene, ma il grande del suo lavoro la fa bene (si spera...). Devo ancora ringraziare mia cugina che mi ha dato una mano a creare un po di file di piattaforme... Se vi dovesse interessare come sono strutturati i file pck non vi preoccupate, il funzionamento è banale. In realtà sono file zip che contengono un file omonimo in un formato diverso. Il file decompresso è un XML generato da JumpingJump Piattaorme... Li ho compressi per due ragioni: risparmiare spazio (falso! hanno un peso irrisorio!) e per avere dei file impacchettati e difficilmente modificabili...
Ho scritto anche un altro programmino per i devloper di questo gioco, si chiama JumpingJumpIniEditor, è solo un editor che permette di editare il file settings.ini con un GUI... praticamente inutile ma utile (xD)
Per gli appassionati del cheating ho inserito anche un file (GodMode.bat) che permette di avviare il gioco in modalità immortale (easteregg anche qua...). Praticamente quando si cade sotto il limite inferiore non si perde ma si viene teletrasportati più in alto. Ha solo un misero e insignificante problema... quando si avvia questa modalità non carica le posizioni dei blocchi e quindi è totalmente inutile.... xD

Mi sembra di aver detto tutto quello che era importante sapere, ovviamente vi do anche l'intero codice sorgente. I commenti non sono completi, tutte le funzioni ed i campi pubblici hanno un commento che ne descrive la funzione.
Ah si la cosa più importante... 8300 righe di codice!!!! xD xD

DOWNLOAD:
Dropbox - Google Drive

SCREEN:
Schermata principale

In gioco


Nel menu della classifica

Nel menu delle statistiche



Nessun commento:

Posta un commento