Cerca Totem's Lair su Facebook



An Infinite World


"An Infinite World" è il nome di un progetto che sto portando avanti da qualche settimana nel tempo libero. È sostanzialmente un esperimento che ho fatto con XNA per vedere cosa sarei riuscito a tirarne fuori con le mie scarse competenze di grafica. Questo progetto mira a creare un semplice giochino in stile platform, dove una pallina si muove e salta da una piattaforma all'altra per arrivare alla fine del livello: un concept molto semplice per una semplice prova di programmazione. Dato che ho implementato diverse interessanti features in quello che definire un game engine è decisamente eccessivo, ho voluto dedicare una sezione separata a questo progetto, sperando che, magari, qualcuno mi aiutasse a scrivere qualche nuovo livello. Ecco una breve anteprima delle funzionalità che ho integrato.

Download


Fisica di base
Il progetto comprende una piccolissima parte dedicata alla fisica di base (ma proprio base base). Dopo aver implementato semplici metodi di collision detection tra bounding spheres e bounding boxes di tipo axis-aligned, ho scritto qualcosa di molto banale per gestire le forze del mondo di gioco. La pallina viene spinta da una forza applicata dal giocatore tramite i pulsanti WASD. Essa è anche dotata di massa, perciò agisce una forza peso verso il basso. Ogni piattaforma ha un proprio coefficiente di attrito ed esercita una forza di attrito in verso opposto al movimento della pallina. I campi di forza, i buchi neri ed altri oggetti di gioco esercitano a loro volta altre forze in altre direzioni sul giocatore. La risultante di queste forze dà luogo ad un'accelerazione; la velocità e la posizione della pallina vengono calcolate di conseguenza.
Dopo svariate e disperate riscritture, sono riuscito a perfezionare le fisica con queste features:

Oggetti di gioco e livelli
Quasi ogni oggetto di gioco è rappresentato da una classe GameObject. Modificandone le proprietà è possibile spostare, ruotare, muovere, trasformare o disabilitare l'oggetto.


Oltre alla pallina, sono definiti come oggetti di gioco anche piattaforme, gemme, monete, campi di forza, checkpoints, buchi neri. Ecco un breve elenco delle classi definite: Tutto il livello viene scritto in xml, secondo un dato schema. Viene poi letto da un level manager, il quale provvede a caricare ed inizializzare tutti gli opportuni oggetti. In questi file è possibile anche specificare gli effetti fisici del livello (come, ad esempio, l'accelerazione di gravità o un coefficiente che determina la quantità di moto conservata negli urti), modificare la grafica, sia dell'ambiente (la skybox e la sua texture), sia degli oggetti (si può cambiare modello e/o texture).


I modelli, poiché molto semplici, li ho fatti io con blender; anche la mappatura delle coordinate texture è stata fatta con blender. Le texture sono prese dalla rete. Ringrazio particolarmente Hipshot per le sue magnifiche sky-textures.


Sistemi di particelle
Nell'engine è anche implementato un semplice sistema di gestione degli effetti particellari, che permette di gestire effetti grafici come fumo, fuoco e semplici animazioni particellari. E' possibile determinare il moto di ogni particella grazie ad alcuni delegati:


Le particelle vengono disegnati come point sprite con una semplice texture semitrasparente a punto, e la loro dimensione viene scalata con la distanza dalla telecamera. Il colore, il movimento, la texture e le modalità di emissione possono essere cambiate a piacimento. Ad ogni sistema è associato un oggetto Emitter che gestisce il refresh e il rendering delle particelle.


Post-processing
È possibile abilitare alcuni effetti di tipo bloom, creati grazie agli shader forniti da Microsoft in alcuni esempi.




Se sei interessato a partecipare al level design di questo piccolo gioco, puoi scaricare il gioco (sorgente + eseguibile) da qui. Requisiti minimi:

Istruzioni editor livelli
Potete accedere all'editor di livelli dal menù principale, o premendo T in qualsiasi momento di un livello (questa funzionalità verrà rimossa presto). In modalità editor, la pallina è di dimensioni minori e indica il cursore. Per spostare il cursore si usano i pulsanti WASD, mentre per spostare la telecamera di usano le frecce direzionali. Altri pulsanti: Una volta premuto Invio, apparirà la scritta Command sotto le coordinate del cursore. Inserite un comando valido per eseguirlo: Qualsiasi altra stringa immessa viene intepretata come nome di una proprietà dell'oggetto selezionato. Dopo di essa è possibile specificare un qualsiasi valore per modificare la proprietà. Ad esempio "rotation 0 90 0" imposta la rotazione dell'oggetto a 90 gradi attorno all'asse y. Tutti gli oggetti hanno queste proprietà: Altre proprietà potete vederle dal codice. Per impostare un valore vector3 si indicano le coordinate, separate da uno spazio. Per impostare un modello o una texture, si specifica il nome del file del modello (senza estensione *.xnb) o il nome del file della texture (con estension): solo il nome, non tutto il percorso, poiché tutte le textures sono in content\textures e tutti i modelli in content\models.
In questa versione la gestione degli errori è pressoché assente, quindi... state attenti XD

Per pubblicare un livello in questa sezione, mandatemi un'e-mail con allegato il file xml e le eventuali risorse aggiuntive usate.