Visualizzazione post con etichetta SDL. Mostra tutti i post
Visualizzazione post con etichetta SDL. Mostra tutti i post

SDL Scavenger

SDL Scavenger è l'evoluzione del defunto XScavenger, ottimo clone open source del mitico Lode Runner della Brøderbund.

La versione per X11 del gioco, da cui questa ha avuto origine, è stata scritta nel lontano 1997, ad opera di un programmatore giapponese Xdr, di cui attualmente però, non ho trovato informazioni al riguardo.
Successivamente il progetto è stato portato alle librerie SDL nel 1999 ad opera di Dave Ashley, attuale mantenitore del progetto.

L'effetto fade-in nei nostri giochi

Di recente ho cercato di realizzare un effetto Fade-in in uno dei miei giochi, ovvero quel nero che avvolge tutto lo schermo diventando sempre più fitto durante il passaggio da un livello ad un altro.

Ho trovato dozzine di tutorial in giro per la rete, anche esempi al quanto bizzarri e assurdi sul come ottenere questo effetto, e tutti con un punto in comune, l'uso di un'immagine completamente nera da rendere trasparente in un primo tempo e man mano eliminarne la trasparenza gradualmente.
Quello che però nessuno ha proposto, e addirittura in molti hanno reputato "impossibile", è quello di usare una semplice superficie di disegno completamente nera al posto di caricare un'immagine.

Blob Wars: Metal Blob Solid

Un pianeta invaso da una razza aliena, e un piccolo blob giallo senza macchia e senza paura, pronto a rompere un po' di culi per salvare la sua gente.

Questa è la premessa alla base di Blob Wars: Metal Blob Solid, primo capitolo di una serie di giochi open source, sviluppato dai Parallel Realities nel 2003.

Mappe da file

Fino ad ora abbiamo visto come realizzare semplici livelli di gioco basati sui tiles e con una grafica molto semplice.

Riprendendo l'argomento del tile mapping di cui si e' gia' parlato, implementeremo in questo articolo un pratico sistema di gestione delle suddette mappe da file.

Lo scrolling nei nostri giochi

Una caratteristica fondamentale di un buon gioco, e' quella di presentare livelli esplorabili in lungo e in largo, senza costringere il giocatore ad una schermata fissa.

Questa caratteristica e' detta Scroller, per l'appunto scorrimento, si tratta della possibilita' di avere livelli che scorrano orizzontalmente e verticalmente a seconda del movimento del personaggio, permettendo cosi' di avere livelli di gioco non limitati alla dimensione della finestra di gioco.

Facciamo quattro salti

Nei precedenti articoli, abbiamo avuto modo di affrontare diverse tematiche, tra cui quelle relative a giochi basati sui tiles.

In questo articolo riprenderemo il discorso dei tiles, gia' affrontato con un semplice gioco di labirinto, implementando la possibilita' di avere un giocatore che si muova liberamente in un livello molto poco simmetrico e restrittivo, saltando a piacimento.

Voxatron

Di sicuro a molti di voi sara' passato per la testa di chiedersi, come aspetto avrebbero una manciata di pixel nel loro equivalente 3D?

Girando in rete non e' difficile trovarne esempi grafici, ma forse piu' raro trovarne esempi di utilizzo pratici a livello di videogioco.

Voxatron ne e' un esempio molto ben riuscito, esso si rifa' ad un concetto vecchio di almeno una decina d'anni, quello dei Voxel, ovvero pixel voluminosi.

Animiamo i nostri giochi

Abbiamo imparato come caricare e mostrare porzioni di un immagine su schermo, per i nostri giochi, grazie all'articolo precedente sui font bmp.

Ora parliamo anche di come possiamo animare la grafica dei nostri giochi, dando maggior vita alle nostre creazioni.

Rocks'n'Diamonds

Tra i vari cloni di Boulder Dash, questo sicuramente e' il migliore fra tutti, senza ombra di dubbio.

Sviluppato dalla software house indipendente Artsoft nel 1995, e lo si nota bene dal look grafico molto retro, che ricorda i vecchi giochi per Amiga, e nonostante tutto il progetto è ancora attivo.

Questo titolo si presenta come un clone di Emerald Mine, della Kingsoft, clone a sua volta di Boulder Dash e di tanti altri giochi sulla stessa linea di gameplay, come ad esempio Supaplex.

BurgerTime

Ricordo bene la prima volta che vidi questo gioco, era in bella mostra al supermercato nel reparto videogames sotto natale, vedevo le immagini girare sullo schermo mentre un ragazzino giocava, dividendo lo sguardo tra il suo e lo schermo accanto dove girava Mighty Bomb Jack, un altro classico senza tempo.

Sebbene quest'ultimo fosse incluso in una console nes pirata insieme ad altri 500 e passa giochi, BurgherTime era l'unico disponibile in cartuccia sia per NES che Game Boy.
Devo ammettere che mi facevano molta gola entrambi dopo aver visto il gameplay, eppure optai per l'acquisto di un gioco per Game Gear vista la scarsa scelta di cui disponevo nel mio parco titoli.

Gestire le immagini nei nostri giochi

Fino ad ora, abbiamo utilizzato e imparato a disegnare semplici forme geometriche.
Purtroppo disegnare da codice non e' cosi' comodo come magari puo' esserlo disegnare in appositi programmi come Paint e affini, decisamente meglio preparare la propria immagine e utilizzarla nel programma come parte secondaria.

In questo articolo, voglio introdurre un semplice metodo per gestire le immagini, piu' specificamente dei font disegnati.
Dalla stessa base si potrebbe anche ricavare un comodo metodo per disegnare mappe e quant'altro, il tutto partendo da una semplice immagine BMP popolata di elementi di egual misura.
Piccoli passi per arrivare pian piano a cose sempre piu' complesse, come animazioni e tanto altro.

Le basi del tile mapping

La maggior parte dei giochi esistenti, basa la sua struttura su un concetto tanto semplice quanto d'effetto, i Tiles.

Si pensi a giochi come Zelda, Pokemon, Super Mario Bros ed anche Pacman, in un modo o nell'altro basano la loro concezione del campo di gioco sui tiles.

In sostanza, si rappresenta il campo di gioco su una struttura matriciale, composta da svariate tessere.

Crea il tuo Tetris in 30 minuti

Lo scorso mese ho introdotto l'utilizzo delle matrici in un semplice gioco di campo minato, in questo articolo estenderemo quel concetto realizzando un completo clone del tetris.

Realizzare un clone del tetris non e' poi cosi' difficile, una volta capito il concetto lo si realizza molto in fretta, bastano solo 30 minuti per realizzarne un clone completamente funzionante!

Breakout, come estendere il Pong

In un precedente articolo, abbiamo realizzato un semplice clone del Pong, sfruttando le tecniche apprese.
Da questa base possiamo espandere il gameplay del nostro gioco e realizzare un clone del mitico Breakout, il tutto con pochissime modifiche al codice.
Se non conoscete Breakout, e ne dubito fortemente, e' un gioco sviluppato originariamente da Atari in cui il giocatore muovendo una racchetta sullo schermo doveva far rimbalzare una pallina contro dei mattoni posti nella parte alta di esso per eliminarli tutti.
In questa versione, mi sono ispirato molto all'edizione per atari2600, qualcuno notera' una leggera somiglianza con il classico :]

Il mio primo gioco, il Pong

Retropong, un semplice remake realizzato da Pix3l.Nel precedente articolo, abbiamo trattato l'argomento collisioni semplici ed implementato una sorta di mini gioco che le sfruttasse.

Partendo da quella stessa base, possiamo dare vita ad uno dei piu' classici dei giochi, il Pong!
Per chi non lo conoscesse (mi metto le mani nei capelli!), il Pong e' un semplice simulatore del gioco del Ping Pong.
In questo gioco, due giocatori con relative racchette rappresentate da due semplici rettangoli, devono cercare di mandare una pallina oltre la racchetta dell'avversario per effettuare un punto. Semplice!

CloneKeen

Ricordare il famoso Commander Keen della ID Software?

Uno dei piu' grandi successi plattform di quegli anni, un gioco molto simile a Super Mario Bros per certi versi e a molti altri titoli del nes.

Il nome del protagonista e' per l'appunto il titolo del gioco, in questa fantastica avventura al comando di Keen, viaggeremo nello spazio su pianeti abitati da strane e curiose creature facendo scorpacciata di Pepsi e caramelle a volonta' tra un salto e un colpo di pistola laser lungo il tragitto.

Possiamo gioire e rivere le emozioni di questa fantastica avventura rigiocandola su sistemi moderni grazie al progetto CloneKeen!

Imparare a disegnare da codice

Molto spesso la grafica dei giochi puo' essere composta da forme geometriche molto semplici, si pensi al Pong, il Breakout e il Tetris. Sono tutti giochi in cui gli elementi grafici sono semplici forme geometriche quali cerchi, rettangoli e quadrati.

Questi elementi grafici sono realizzati dal programma per mezzo di funzioni specifiche, che molto spesso sono la semplice conversione in linguaggio informatico di quelle formulette di geometria analitica che ci insegnavano a scuola.

Come nella realta', per disegnare dobbiamo disporre di una qualche superficie idonea.
Nel precedente tutorial "Datti una mossa" ho introdotto molto velocemente un tipo di superficie idoneo e adatto alla nostra causa, la SDL_Surface. Nello specifico, una superficie all'interno del programma di un videogame e' un'area di memoria (ram o video) grande quanto serve, atta a contenere le informazioni che si visualizzeranno sullo schermo quali pixel, grandezza e altezza.

Un pixel e' un quadratino sullo schermo composto dai tre colori primari, Rosso, Blue e Verde (RGB), che insieme ad altri compone le immagini sullo schermo.
Piu' nello specifico e' una struttura dati, contenente i valori cromatici di base del colore che vogliamo utilizzare nelle gradazioni volute. Si possono avere pixel da 8 a 32 bit, nell'ultimo caso sono divisi in 8 bit per colore primario. I primi 8 sono riservati alla trasparenza dell'immagine, spesso questi bit vengono ignorati.

La superficie e' un buffer (array monodimensionale) contenente svariate informazioni come gia' detto, le piu' importanti oltre i pixel sono la grandezza, l'altezza e il pitch.


La zona azzurra e' la nostra finestra di gioco, la zona arancione e' l'area rimanente dello schermo.
Il driver video in uso sul sistema crea un buffer che usa per la gestione della grafica sullo schermo, grande quanto la larghezza di risoluzione scelta sul sistema, questo buffer e' detto Pitch (in italiano Campo).
Se la risoluzione di sistema e' 800x600 mentre quella della finestra di gioco e' 320x200, la nostra superficie sara' un buffer di ampiezza [320*200] (Larghezza per altezza) ed avra' una sua posizione nel pitch che sara' grande [800*600].

Questi due buffer pur essendo di base array monodimensionali possono essere intesi come tabelle formate da righe e colonne.
Se per esempio volessimo disegnare un pixel alle coordinate (10,20), ci arriveremo sapendo la lunghezza dello schermo in primis. Moltiplicando la lunghezza dello schermo per il numero di colonne, sapremo in che punto nel pitch inizia la riga che vogliamo (scorriamo l'asse Y con 320*20), ora che siamo alla riga voluta ci basta sommare il valore della coordinata X per il numero di bit per pixel (Bpp, scorriamo l'asse X di un numero di byte corretto) per muoverci alla colonna desiderata (320*20+10).

Si puo' riassumere il lavoro teorico in una pratica funzione:

void drawPixel(int x, int y, int color)
{
Uint32 bpp, ofs;

bpp = screen->format->BytesPerPixel;
ofs = screen->pitch*y + x*bpp;

SDL_LockSurface(screen);
memcpy(screen->pixels + ofs, &color, bpp);
SDL_UnlockSurface(screen);
}

Le Avventure della Cava!

Cave Story (aka Doukutsu Monogatari), è un fantastico platform game 2D ambientato in un mondo futuristo e fantasioso popolato da umani, robot e altre simpatiche creature.
Ricorda molto alla lontana quei giochi a piattaforme per snes, un vero capolavoro da giocare e rigiocare nel tempo.

Il gioco è disponibile per una gran varietà di piattaforme, tra cui anche Linux, DS, Wii e Xbox visto il suo cuore basato sulla libreria SDL. Il gioco si presenta in un veste grafica molto vivace e allo stesso tempo semplice, come anche il gameplay. I livelli di gioco sono praticamente immensi, ci si potrebbero perdere delle giornate per esplorarli completamente tutti alla ricerca di oggetti nascosti o alla scoperta di stanze segrete dalla misteriosa utilità.

Vi sono presenti anche molti enigmi da risolvere, l'azione e il fattore divertimento sono sempre costanti ed alti livelli, complice anche la musica incalzante che ci accompagna nell'avventura e i simpatici dialoghi con gli abitanti di questo fantastico mondo.

Il gioco è sviluppato da un certo Pixel degli Studio Pixel, esistono una moltitudine di siti dedicati a questo piccolo gioiellino della scena indie, tra cui vi segnalo:
  • Studio Pixel Fanpage - Ottima pagina intermediaria per chi non mastica il mandarino, qui vi sono presenti i link alle varie versioni del gioco per i principali sistemi operativi e qualche altro programma disponibile dal sito degli Studio Pixel.
  • Cave Story (Doukutsu Monogatari), A Tribute Site - Questo sito presenta svariato materiale, dalle guide al gioco fino alle piu' svariate versioni del gioco stesso per PC e Console. Sono presenti anche extra per i fan del gioco come immagini ufficiali e curiosità di ogni genere.

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.

Game developers resources

Sviluppare videogiochi non e' cosi' difficile come puo' sembrare, si possono usare tool pratici anche se un po' vincolanti detti "click tool" quali Game Maker o The Games Factory, oppure per chi ha gia' qualche rudimento di programmazione l'ottimo Game Editor che ci danno una base gia' pronta su cui lavorare.

Per chi volesse farne proprio a meno, puo' sempre scrivere direttamente il suo gioco da zero, realizzare l'intero programma dall'inizio alla fine con l'ausilio di librerie quali SDL, Allegro o XNA di Microsoft. Utilizzare questo metodo al posto di quelli prima citati non vuol dire farsi volutamente del male, risulta essere un ottimo esercizio didattico e ci dara' la possibilita' di non essere vincolati a limiti del programma o di piattaforma (Escluso per XNA che e' disponibile solo per sistemi Windows). E' anche possibile utilizzare piattaforme indipendenti dal sistema operativo, come Flash (Flex) o Java che possono vantare un loro gestore grafico e una compatibilita' pressoche' universale.

In supporto a programmi o librerie, in giro per il web possiamo trovare una miriade di risorse come l'italiano Game Programming Resource Faciity, che fra le sue pagine virtuali tratta argomenti relativi ai click tool e le librerie piu' utilizzate dai game programmers con tutorial e articoli pratici.
In lingua inglese ci sono community storiche come Gamedev, Gamasutra oppure la piu' piccola e forse meno conosciuta FreeGameDev. Quest'ultima e' una delle mie preferite, una piccola comunity di sviluppatori veramente graziosa, la gente che vi ci ho trovato e' stata molto cordiale e professionale.

Tuttavia per cominciare, nel bagaglio culturale di un game programmer devono esserci nozioni basiche di matematica e trigonometria, programmazione e volendo anche grafica. Ovviamente grazie ai click tool molte di queste cose possono essere lasciate al caso dato che provvederanno loro il piu' delle volte a gestire il tutto.

Giochi piu' complessi possono richiedere conoscenze piu' specifiche della materia e non parlo solo della matematica o della programmazione, concetti propri della programmazione dei videogiochi come collisioni, scrolling, fisica etc... Per fortuna molti esempi pratici su come gestire questi particolari aspetti nei nostri giochi li si possono trovare su molti siti o blog come quelli gia' citati oppure come GPwiki e LoserJuegos, ricchi di esempi e tutorial per ogni livello o preparazione e articoli teorici, anche se l'ultimo dei due peccato sia in spagnolo.
Per quelli gia' piu' afferrati in materia di programmazione e affini ci sono Coke & Code, Game Programming Snippets in genere piu' orientati verso linguaggi quali Java.

Io personalmente consiglio di cominciare a realizzare giochi partendo dalla scrittura di codice, volendo anche con tool quali Game Maker o Game Editor per poter avere una base semplice e intuitiva da cui partire per chi ha meno esperienza in programmazione.
Per chi ha gia' quache rudimento di programmazione, magari in C, con piccole nozioni base e' decisamente consigliato il sito SDLGamer, passo passo e con esempi pratici correlati di immagini spiega i concetti della programmazione di videogiochi utilizzando le librerie SDL. Una volta appresi i concetti base si puo' passare a quelli piu' specifici di un gioco come spiegano i tutorial di Aaron Cox e di Sol. Tutti e due i siti vi accompagneranno passo passo con esempi pratici alla realizzazione di un semplice e completo gioco coprendo vari aspetti della programmazione di esso. Le nozioni che si apprendono da questi tutorial sono facilmente spendibili sui svariati linguaggi programmazione e alle volte nei vari click tool con i giusti accorgimenti.

Altri tutorial molto validi li si possono trovare sul sito di Lazy Foo molto conosciuti e apprezzati, e sui siti SDL Tutorials e Ubuntu-gamedev wiki. Altrettanti tutorial molto validi o esempi di giochi completi si trovano su svariati siti di game programmer amatoriali, come questo blog oppure il sito Pix3lworkshop (del sottoscritto u.u) .

Anche se il C++ e le SDL siano predonimanti nei tutorial non si preclude il fatto che i giochi possano essere realizzati in altri linguaggi o librerie, quali C (come i giochi presenti sul mio sito) o QBasic come si fa nella piccola community di Pete, persino in Java seguendo i tutorial di zetcode.
Utilizzare altri linguaggi o librerie quali Allegro o XNA richiede solo al programmatore di comprendere le logiche base di funzionamento di gestione della grafica, input etc...

Tutto il resto viene con la pratica e tanto gioco!