Tempo di giocare

Ricordo tempo fa di giochi che se eseguiti su sistemi piu' recenti rispetto al loro anno di nascita' schizzavano a velocita' pazzesche fino ad essere ingiocabili. Il problema risiedeva in una dimenticanza o non curanza dei programmatori di un aspetto molto importante.
Il "timing", in italiano si potrebbe tradurre letteralmente in temporizzazione.

Un qualsiasi programma per quanto semplice sia, verra' eseguito alla velocita' massima consentita dalla macchina e dal sistema ospitante, cio' vuol dire che piu' il nostro pc sara' veloce piu' veloce sara' la nostra applicazione nell'elaborazione dei dati e del suo lavoro.
I giochi essendo di base "applicazioni" come un qualsiasi altro programma, possono essere composti da cicli tipo for o while che verranno eseguiti alla massima velocita' fornita dal processore.

Un gioco tipo ha uno schema di base simile al seguente:

int main()
{
//main game loop
while()
{
//meccanismi di gioco
muoviGiocatore();
aggiornaPunteggio();
Disegna();
}
return 0;
}

Una funzione da cui parte tutto e un ciclo principale detto "main game loop", entro cui il gioco vive.
In questo ciclo vengono ripetute sistematicamente tutte le funzioni relative ai vari aspetti del gioco, tipo il movimento dei personaggi e assegnazione punteggi o il semplice disegno sullo schermo delle immagini.
Nell'entrare nella funzione di "muoviGiocatore()" si effettua un controllo sulla tastiera per controllare se un dato tasto e premuto, nel caso lo sia si muove il nostro personaggio di 1 pixel nella direzione voluta, in caso contrario si continua il ciclo.
Tenendo conto che il ciclo verra' eseguito N volte in base alla velocita' del processore, la pressione del tasto nell'arco di un appena un secondo verra' letta piu' di quanto ci si aspetti. Si vedrebbe il nostro personaggio schizzare letteralmente fuori dal campo di gioco ad una velocita' pari quasi a quella del processore. Impossibile seguire l'azione ad occhio nudo.

Per ovviare a questo semplice problema, si dovrebbe campionare "1 secondo" reale nel programma ed eseguire le azioni una volta per ogni secondo "reale".
I computer gia' a livello di hardware sono dotati di sistemi per il conteggio del tempo, in elettronica tutto cio' e' detto "cloacking" e molti linguaggi di programmazione mettono a disposizione strumenti per campionare il clocking e gestire il tempo.

Esistono funzioni nei linguaggi di programmazione che ci permettono di sapere quanti millisecondi sono passati dall'avio del programma, e' il caso della funzione clock_gettime() presente nella glibc ed utilizzato anche nella libreria SDL per fornire supporto nella gestione del tempo nei nostri giochi. L'esempio qui di seguito utilizza la funzione SDL_GetTicks(), questa funzione ci restituisce il numero di millisecondi passati fin da quanto la libreria e' stata inizializzata. In altre parole ci restituisce il tempo passato in millisecondi dalla partenza del programma

int fps_sync (void)
{
static int t, tl = 0, frequency = 1000 / 100, temp;

t = SDL_GetTicks (); //Tempo trascorso dall'inizio del programma

if (t - tl >= frequency)
{
temp = (t - tl) / frequency;
tl += temp * frequency;
return temp;
}
else
{
sleep (frequency - (t - tl));
tl += frequency;
return 1;
}
}

La funzione qui sopra aggiorna la variabile T (Tempo atutale) con il numero di millisecondi restituiti da SDL_GetTicks() e controlla che tra T e TL (Tick last) vi sia una differenza di almeno 10 millisecondi, rappresentati dalla frequenza e viene restituita una variabile che successivamente verra' usata nel main game loop.
Se non vi e' questa differenza tra T e TL, viene messo a dormire il processo sulla macchina per un tempo variabile tra 0 e 10 millisecondi e succesivamente si incrementa TL di 10 millisecondi in modo da recuperare il conteggio perduto nello sleep.

Questa funzione torna utile nel nostro main game loop in quanto ci permettera' di limitare l'uso della cpu in modo dinamico.

while()
{
repeat = fps_sync ();

for (i = 0; i < repeat; i ++)
{
muoviGiocatore();
aggiornaPunteggio();
}
Disegna();
}

In un lasso di tempo (frequenza) verranno eseguite le azioni di gioco all'interno di un ciclo limitato dalla variabile temp rilasciata dalla funzione fps_sync().
Il tutto in modo dinamico, garantendo la stessa velocita' su diversi computer a discapito della velocita' del processore.
Questo modo di gestire gli FPS rispetto a molti altri vanta la possibilita' di poter limitare solo alcune parti del programma garantendo allo stesso tempo la massima velocita' nella resa grafica, a differenza di molti altri metodi usati da molti che mettono a dormire l'intero programma indistintamente.

Questo articolo prende spunto dall'articolo presentato dal sito di Loser Juegos da cui si trova ben poco riguardo i dettagli di funzionamento dell'algoritmo intero, qui ho provato a spiegarlo ed esporlo al meglio.
Se non vi sara' chiaro al primo colpo, non vi scoraggiate, provate a pacioccare un po' con le varie variabili e vedere i vari effetti sul gioco.

And you call your self Messiah?

Uno dei giochi piu' particolari e strani a cui abbia mai giocato. Ricorda molto vagamente titoli come MDK o Quake 2 per le sue ambientazioni tetre e futuristiche.

Il gioco ci mette nei panni (in questo caso solo mutandoni) di un angelo cicciottello di nome Bob, il cui scopo e' quello di salvare la terra dalle grinfie di un perfido dittatore.
Ci sara' possibile prendere possesso di ogni creatura vivente semplicemente saltandogli nella schiena o addosso nel caso di piccoli esseri.
La possessione degli individui ci permettera' di raggiungere aree particolari senza correre rischi o di passare inosservato tra i nemici. Non meno importante ci dara' anche la possibilita' di affrontare altri nemici in combattimenti a mani nude o armi da fuoco.

La giocabilita' e' abbastanza accettabile anche se svariati bug presenti nel gioco possono rendere l'esperienza ludica un vero tormento, come anche la compatibilita' con il sistema operativo o le schede grafiche. Pare comunque che gli sviluppatori della Shiny Entertainment abbiano provveduto a correggere questi errori rilasciando due patch differenti per risolvere questi screzi.

Se volete provare di vostro pugno il gioco, pare che ora sia disponibile come abandonware (anche se molto difficile da trovare sui siti specializzati in materia) quindi totalmente libero da vincoli. Un consiglio che posso dare pre partita e' quello di creare un piccolo file bat con il seguente contenuto " MESSIAHD3D.EXE -i -x +! " per eseguire il gioco impostando in precedenza i parametri video e la compatibilita' con sistemi windows superiori al 2000, anche eliminare il video pubblicitario introduttivo tanto che ci siamo. Altri parametri sono disponibili nel readme del menu' di installazione.

Buon divertimento con Bob :]

Mario bros are back!

Trovato questo video fra le pagine di kotaku, una raccolta di gameplay di un Grand Theft Auto convertito in stile Mario, personaggi, oggetti e riferimenti al regno dei funghi come fosse il mondo reale (cioe' virtuale, ma avete capito...).
Visti tanti di video umoristici di questo genere ma questo per ora secondo me e' il migliore fra tutti :D

We cant' stop here. This is Bat Country!

Bat Country e' un gioco flash dal look retro, molto minimale a livello grafico ma molto ricco di divertimento!
Il gioco ci mettera' al comando di un piccolo elicottero elicottero che sorvola i cieli del fantomatico "Bat Country" e manco a dirlo dovremmo fronteggiare orde di pipistrelli erranti e ostacoli tra cui farsi strada.
Le musiche di gioco sono rilassanti e di compagnia, potra' capitare di sentire nel bel mezzo del gioco la simfonia della Ghost House di Super Mario World fra le tante.
Di compagnia sono anche i vari dialoghi fra pilota e coopilota che molto spesso ci saranno di aiuto con suggerimenti su come affrontare le nuove minacce incombenti nel gioco.
Il gioco si gioca con mouse e tastiera, Mouse e tasto sinistro per movimento e sparare, spazio per rilasciare bombe e farle esplodere.
Il gioco ha un tema di base molto cartoonesco, la violenza e' minima per non dire quasi inesistente.
Consigliato a tutti!

Analisi di un videogioco

Capire come si realizzi un videogioco e' cosa semplice, richiede solo una mente fresca e creativa, nulla di piu'. Per comprendere i concetti alla base del discorso non serve avere conoscenze particolari di programmazione o altro, bastano poche nozioni di matematica e logica.

Andando per ordine, un gioco puo' essere suddiviso in piu' strati come una torta.
Ogni gioco che si rispetti ha un campo di gioco, un'area in cui avviene l'azione e si vedono le varie figure. Questo potra' essere il nostro primo strato, lo strato visivo.

Ogni azione o quant'altro avviene nello strato visivo e' frutto di calcoli e attivita' svolte dal programma in background, questo potremmo chiamarlo strato di fondo.
Questo strato puo' esistere e funzionare anche senza lo strato visivo, in quanto lo strato visivo e' solo una rappresentazione grafica e piu' gradevole di quello che potrebbe essere espresso in solo testo dallo strato di fondo.

Ripensiamo quando a scuola, nei primi anni dell'apprendimento ci venivano posti problemi matematici di semplice svolgimento, il classico problema delle mele che si aggiungono e si sottraggono ad esempio.
Ci veniva chiesto, se abbiamo 3 mele e ne compriamo 2, quante mele abbiamo?
Si ragionava su cosa volesse dire visivamente averne 3, si aveva in testa una figura di 3 mele accostate fra loro.

Si ragionava poi su quante mele si sarebbero dovute aggiungere al gruppo, magari si metteva scritto nero su bianco 3 + 2 = 5. Mentre nella nostra testa si aveva ben chiara l'immagine di 5 mele rispetto alle 3 di partenza.



La parte logica e' di calcolo e' paragonabile a quanto avviene nello strato di fondo di un gioco, il programma tiene conto di vari valori e ne mostra una rappresentazione sullo strato visivo, in questo caso potrebbe essere la pagina adiacente su cui per aiutarci ci era facile disegnare l'oggetto in questione mano mano che si procedeve nello svolgere i problemi.
Ovviamente il tutto e' espresso in un linguaggio di programmazione e sotto una logica piu' articolata di quella appena presentata, ma questo e' solo un esempio di facile appendimento che si avvicina molto all'idea di base di gioco.

Andando piu' avanti in logiche piu' specifiche e articolate, troviamo il piano cartesiano, sistemi di coordinate orizzontali e verticali. Lo strato visivo e' paragonabile ad un piano cartesiano in tutto e per tutto.
Immaginate di dover rappresentare una delle mele di prima in un foglio a coordinate X e Y specifiche, il valore delle coordinate sara' tenuto in memoria dal sistema di fondo.



Di partenza mettiamo caso di aver deciso di mostrare la nostra mela alle coordinate 5,3 , il nostro strato di fondo provvedera' a disegnare a tali coordinate come nostra volonta' l'oggetto sullo strato visivo. Su richiesta del giocatore deve anche essere possibile spostare l'oggetto, magari su pressione di un tasto o tasti.
Cio' che e' presente nello strato di fondo puo' essere cio':

Mela {coordinate(5, 3) - immagine(mela.gif) }
Tasto "freccia_destra" premuto? Mela->coordinate(8, 7)
Disegna l'oggetto "Mela" sullo strato visivo

Il programma tiene conto di svariate cose, la posizione della mela e la sua immagine.
Controlla eventualmente la pressione di tasti specifici e ne esegue una o piu' azioni in caso di avvenimento dell'evento. Questo e' un semplice esempio di cosa potrebbe essere successo nel programma.
Volendo aggiungere altre funzionalita' al nostro programma, gli si potrebbe dire di cancellare tutto cio' che si vede nel campo visivo per poi ridisegnarlo con le nuove indicazioni.
Come ogni gioco, anche il piu' semplice, la grafica viene disegnata nella finestra di gioco e ridisegnata nuovamente a seconda degli avvenimenti scaturiti nel programma.

Il tutto funziona come una pellicola cinematografica, da bambino mi piaceva realizzare piccoli cartoni animati nei block notes disegnando in ogni pagina un fotogramma diverso di poco dal precedente e poi scorrerlo vedendolo prendere vita.

Ad ogni pagina, corrispondeva un campo completamente vuoto e pulito, l'immagine disegnata era una trasposizione di circa una capocchia di spillo rispetto alla precedente.

In un videogioco la cosa e' al quanto simile, non abbiamo fogli virtuali in sequenza ma un unico foglio su cui viene disegnato, cancellato e ridisegnato il tutto in maniera ciclica per tutto il ciclo di vita del programma.








Il ciclo di vita del programma puo' essere esemplificato in maniera analoga:

Inizio
Dati e assegnazione valori
Ciclo di vita
Azioni del giocatore
Eventi
Cancella e Disegna
Fine ciclo di vita
Fine

All'interno del ciclo di vita risiedono le logiche del gioco, come si e' visto prima, gestione di eventi quali pressione di tasti specifici o avvenimenti logici/matematici particolari ed infine il disegno sullo strato visivo.
Il ciclo di vita ha durata infinita a meno che un determinato evento non accada e vi ci ponga termine, per cui tutte le sue azioni inglobate verrano eseguite all'infinito. Di conseguenza, quello che succede dietro le quinte verra' visto graficamente dando l'idea di interattivita'.

Questo articolo ha posto le basi, semplificate al massimo di come un videogioco lavori e si possa intendere a livello astratto. Ovviamente con la sola lettura di questo articolo non sarete in grado di creare il vostro gioco, a meno che non sappiate mettere a frutto i concetti esposti in ambito di programmazione.
La pratica e la creativita' sono gli strumenti piu' utili per queste cose.

Geometry Wars Galaxies DS


Un titolo eccezionale, una sorta di retro game ma che in sostanza non è. Pubblicato dalla Sierra nel 2007, sviluppato dalla Bizarre Creations e Kuju Entertainment, Geometry Wars Galaxies e' un gioco all'apparenza retro, uno shooter mozzafiato e frenetico come pochi.

In questo gioco saremo al comando di una navicella spaziale accompagnata da un "drone" che ci aiutera' in vari momenti del gioco. Nel gioco semplici forme geometriche rappresenteranno astronavi e creature dello spazio, ognuna con le proprie caratteristiche, se ne possono vedere gia' alcune in copertina.

Compito della nostra astronave e' resistere all'incessante ondata di nemici in campi di gioco dalle forme sempre piu' diverse e accattivanti raccogliendo quante piu' geom possibili (la moneta locale) e raggiungendo il punteggio piu' alto e di conseguenza aggiudicarsi le medaglie al valore.
Nel gioco e' possibile acquistare vari pianeti con le geom ottenute nei vari livelli, ogni pianeta a sua volta contiene un numero cospicuo di piccole galassie in cui giocare, ognuna con le proprie caratteristiche proprio come i nemici.

Il gioco anche se puo' sembrare ripetitivo e' capace di tenere incollati alla console per ore e ore senza nemmeno accorgersene, piu' si va avanti e piu' l'azione diventa frenetica. La colonna sonora e i suoni di gioco sono molto orecchiabili e tengono assai compagnia durante l'avventura.

Il gioco e' disponibile per Nintendo DS e Wii, il suo prezzo e' abbastanza contenuto, si parla di non piu' di 20 euro. Io l'ho acquistato usato da gamestop per 8 euro e devo dire che ne e' valsa proprio la pena.
Fra le versioni per le due console, le differenze dovrebbero essere minime, si parla forse di solo qualche effetto grafico off da quanto ho visto su youtube in vari gameplay e del controllo ovviamente.

La versione per DS offre due modalita' di controllo customizzabili dal giocatore su sua volonta', si puo' guidare l'astronave sfruttando lo stilo nel touch screen del DS e vederla muoversi nello schermo superiore (molto scomodo imo...) oppure usare il dpad per il movimento e i tasti XYAB per sparare nelle direzioni cardinali in cui sono posti.

Esistono anche varie versioni non ufficiali del gioco per PC, la piu' famosa e' sicuramente Grid Wars, disponibile per Linux, Mac e Windows. Io personalmente consiglio la versione per DS, sia per la sua qualita', sia per il gameplay nettamente migliore rispetto al clone per PC.

In sostanza consiglio questo gioco a tutti gli amanti dei retro games, degli sparatutto o anche ai semplici curiosi che vogliano passare molte giornate di svago.