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

Game Design, questo sconosciuto

Questo mese invece del classico articolo sul game programming, affrontiamo un tema leggermente piu' soft e alla portata di tutti, il Game Design.
Un argomento molto vasto e complesso, ma che cerchero' di spiegare al meglio e nei punti essenziali.

Prima di tutto diciamo che il Game Design e' una parte fondamentale della produzione di un videogioco, in cui vengono gettate le basi ideologiche di esso, come ad esempio la grafica e la storia di gioco per dirne alcune.

Un semplice gioco di Snake

Lo abbiamo visto ovunque, sui cellulari, in regalo con i detersivi, persino nei decoder per digitale terrestre!

Snake e' un giochino tanto scemo quanto elegante allo stesso tempo, realizzarlo non richiede nemmeno troppo lavoro.
Per chi non lo conoscesse (ne dubito fortemente), si tratta di un semplice giochino in cui un serpente muovendosi a intervalli regolari per lo schermo, deve cercare di crescere raggiungendo delle mele piazzate casualmente nel campo di gioco, senza toccare i bordi dello schermo ne se stesso.
Al giocatore viene semplicemente chiesto di dare la direzione di movimento al serpente, cercando di entrare in sincronia con il suo movimento perpetuo, niente di particolare.

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.

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.

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!

Come funziona Campo Minato

Campo minato e' uno dei piu' semplici ed interessanti che ci sia a mio parere.
Ci vogliono circa 10 minuti per realizzarne un clone da console, si puo' imparare molto da un gioco cosi' banale.

Fino ad ora abbiamo visto solo esempi grafici e interattivi che sfruttavano le librerie SDL per l'input e la grafica, ora facciamo un passo indietro.

Linux Game Master 2

Ho gia' avuto modo di parlare di questo fantastico gingillo e di come farlo funzionare su un sistema Linux molto grossolanamente, ironia della sorte vuole che abbia dovuto fare pulizia sul computer e di conseguenza rimboccarmi le maniche.

Dopo un aggiornamento generico del sistema e del kernel ad una versione piu' recente, ho notato con grande stupore dopo qualche tempo che il pad non funzionava come mi aspettassi.

Non sono sceso troppo nei meandri della questione, ma giusto per evitare che anche a voi succeda la stessa cosa, vi do qualche dritta sul come cercare di risolvere eventuali problemi di configurazione di joystick e gampad sul vostro amato sistema Linux.

Ovviamente questa guida non copre ogni singolo modello presente sul mercato e non, ma di certo potra' indirizzarvi nella giusta via per rendere operativo l'apparecchio.

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!

Giocare con le collisioni

Molti videogiochi, spesso e volentieri presentano un gameplay basato sul contatto dei vari oggetti di gioco, tipo il contatto tra il giocatore e un muro che ne impedisca l'avanzare.
Per questa ed altre situazioni esistono svariati metodi, ognuno specifico per uno o piu' tipi di situazioni o comunque molto piu' indicati da utilizzare per semplicita' in casi specifici.

Il metodo piu' semplice da utilizzare per gestire delle collisioni e' sicuramente il Rectangular Collision (Collisione rettangolare), conosciuto anche come Box Collision. Il presupposto e' che un qualunque oggetto sullo schermo occupa un'area quadrata o rettangolare nel campo di gioco, a discapito dello sprite (l'immagine dell'oggetto).

Si tiene conto delle coordinate di tre angoli di quest'area, segnati in verde nell'immagine.
Tenendo conto delle loro rispettive posizioni sul piano, si puo' fare un confronto fra le loro coordinate, larghezze e altezze.

Ad esempio, nel primo caso vogliamo controllare un'eventuale collisione nel lato basso del nostro giocatore, questo lato e' definito con la coordinata h1 data dalla somma del valore di Y + H dell'oggetto.
Per prima cosa controlliamo se h1 e' maggiore di y2, se si ha questa condizione successivamente si controlla che la coordinata w1 (data da X + W) sia maggiore di x2 (coordinata dell'altro oggetto).
Avendo entrambe le condizioni soddisfatte come si puo' vedere nell'immagine a destra, si ha una collisione! Se anche una sola delle due condizioni non viene soddisfatta, non si puo' parlare di collisione, questo ragionamento puo' essere applicato con facilita' a tutti e 4 i lati del rettangolo.

Datti una mossa

Nell'ultimo articolo (Tempo di giocare) ho introdotto il concetto di timing nei giochi, in questo articolo voglio introdurre i concetti base del disegno e del movimento di oggetti sullo schermo utilizzando le librerie SDL.

Iniziamo definendo alcune costanti, la larghezza e l'altezza di un nostro ipotetico personaggio sullo schermo:


#define PLAYER_W 10 //Larghezza
#define PLAYER_H 10 //Altezza


In questo caso il nostro personaggio avra' una forma prettamente quadrata, possiamo passare ora alla definizione di una struttura atta a contenere altre informazioni utili.
Creiamo il tipo di dato "Player" ad esempio, nel modo che segue:

struct _Player
{
int x, y; //Coordinate del giocatore
} Player;

Due semplici variabili di tipo integer per gestire separatamente le coordinate del nostro giocatore nella finestra di gioco, queste coordinate saranno incrementate e decrementate dalla pressione dei tasti sulla tastiera.

Sulle coordinate del nostro personaggio verra' disegnata la sua immagine, io per comodita' ho racchiuso il tutto in una funzione:

void DrawRect(int x, int y, int width, int height, int color)
{
rect.x = x;
rect.y = y;
rect.w = width;
rect.h = height;
SDL_FillRect(screen, &rect, color);
}

Questa funzione sfrutta delle strutture gia' dichiarate all'interno delle libreria SDL, tra cui SDL_Surface ed SDL_Rect.
Possiamo dichiarare come globali delle variabili di questo tipo in cima al nostro sorgente:


SDL_Surface *screen; //L'intera area di gioco
SDL_Rect rect; //Un area per il disegno

All'interno della superfice "screen" verranno piazzate come in un collage le varie immagini rappresentate da "rect", il tutto viene effettuato dalla funzione "SDL_FillRect()".
Ora ci bastera' richiamare la funzione DrawRect in modo analogo per disegnare il nostro personaggio sullo schermo:

DrawRect(Player.x, Player.y, PLAYER_W, PLAYER_H, 0xffffff);

L'argomento color e' un semplice valore esadecimale come quelli che si usano nelle pagine html proprio per i colori, in questo caso il nostro personaggio sara' bianco.
Questa funzione verra' richiamata nel main game loop ad ogni ciclo disegnando un rettangolo colorato delle dimensioni specificate alle coordinate "attuali" del giocatore.

Per incrementare e decrementare le coordinate del nostor giocatore scriviamo quindi passo passo la nostra funzione getInput()" che verra' anch'essa usata successivamente nel main game loop:


int getInput()
{
while(SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT ||
(event.type == SDL_KEYDOWN &&
event.key.keysym.sym == SDLK_ESCAPE)) quit = 1; /* Window closed */
}

Questo ciclo esegue un "polling" su una struttura contenente una lista di eventi, ovvero controlla la presenza di un qualunque evento in questa lista, lo esegue e lo toglie dalla coda.
In questo caso controlla se vi e' la volonta' di uscire dal programma controllando l'eventuale pressione del tasto ESC, in caso di positivita' assegna ad una variabile quit il valore di 1, ritroveremo questa variabile piu' avanti nel corso del sorgente.

// Controlla lo stato della tastiera
keystate = SDL_GetKeyState( NULL );
/* Gestisce la pressione dei tasti */
if (keystate[SDLK_LEFT])
Player.x = -1;

if (keystate[SDLK_RIGHT])
Player.x = 1;

if (keystate[SDLK_UP])
Player.y = -1;

if (keystate[SDLK_DOWN])
Player.y = 1;
}

Qui troviamo la variabile "keystate" associata alla funzione SDL_GetKeyState(), questa funzione ci ritorna lo stato di un dato tasto passatogli come argomento.
I valori "SDLK_" sono delle costanti numeriche definite all'interno della libreria SDL riferiti ai valori ASCII dei tasti.
In questo caso viene controllato se un determinato tasto e' premuto, in caso positivo viene incrementata una coordinata del giocatore.
Se gli input qui elencati fossero gestiti nel ciclo di polling come per il tasto ESC, si dovrebbe continuamente ripremere il tasto per incrementare o decrementare le coordinate del giocatore.
Questo metodo di gestire gli input ci permette di avere un controllo "continuo" sulla pressione di un eventuale tasto ad ogni ciclo.

Si noti bene che le variabili keystate, quit ed event non sono definite nella funzione, andranno definita in maniera globale nel modo seguente:

SDL_Event event; // Struttura per eventi
Uint8 *keystate; // Stato della tastiera
int quit=0, repeat;

Ora che abbiamo sia la funzione di disegno che quella per la gestione dei movimenti del nostro giocatore, possiamo assemblare il tutto, inseriamo la nostra funzione di gestione del timing come nel precedente articolo:

int fps_sync ()
{
t = SDL_GetTicks ();
if (t - tl >= frequency)
{
temp = (t - tl) / frequency;
tl += temp * frequency;
return temp;
}
else
{
SDL_Delay (frequency - (t - tl));
tl += frequency;
return 1;
}
}

Ora implementiamo il nostro main game loop in una funzione apposita, successivamente lo richiameremo all'interno di un ciclo.

int mainLoop()
{
//main game loop
while(!quit)
{
repeat = fps_sync ();
for (i = 0; i < repeat ; i++){
getInput();
}

Come gia' visto nell'articolo "Tempo di giocare", limitiamo il numero di azioni di gioco eseguite al secondo. Si nota anche la presenza di un !quit come argomento nel while, finche' quit sara' uguale a 0 il ciclo continuera'.

// Cancella tutto lo schermo di gioco
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
// Disegna il personaggio
DrawRect(Player.x, Player.y, PLAYER_W, PLAYER_H, 0xffffff);
// Aggiorna lo schermo di gioco
SDL_Flip(screen);
}
}

Qui ho usato la funzione SDL_FillRect() per riempire lo schermo di nero, se non si facesse cio' si continuerebbero a vedere i disegni del giocatore nelle varie posizioni passate. Diamo come un colpo di gomma e ridisegniamo successivamente con la funzione DrawRect() il nostro personaggio.
Con SDL_Flip() aggiorniamo interamente lo schermo e lo rendiamo pronto per la visualizzazione, su superfici software in alternativa viene richiamato SDL_UpdateRect().

Ora non ci rimane che popolare la nostra funzione principale e testare il nostro prodotto.

int main()
{
// Inizializziamo la libreria SDL
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_SWSURFACE);
if(screen == NULL)
{
fprintf(stderr, "Can't initialize SDL: %s\n", SDL_GetError());
exit(-1);
}

SDL_WM_SetCaption("Esempio", "Esempio");

// Posizione di partenza del nostro giocatore
Player.x = 64;
Player.y = 64;

//main game loop
mainLoop();
SDL_Quit(); // Terminiamo l'utilizzo della libreria in modo corretto
return 0;
}

Il nostro gioco di base e' pronto, al momento non fa molto a parte muovere un quadrato bianco sullo schermo ma come base per capire i concetti di un videogame va piu' che bene.
Salvate il tutto come game.c e compilate il vostro gioco con gcc -o game game.c -lSDL, oppure impostate il vostro IDE preferito e divertitevi!

Corso di diploma in game programming con XNA

Se abitate nella provincia di Torino, piu' precisamente a Grugliasco, potreste frequentare un fantastico corso di game programming presso l'istituto "Majorana".
Il corso nominato Interactive Graphics & Gaming e' un percorso di studi di scuola superiore con possibilita' di conseguimento di diploma Statale valido a tutti gli effetti.
Il corso presenta nel suo percorso tematiche relative all'utilizzo di Blender, Flash e programmazione di un gioco 2D con XNA per xbox 360.
Il tutto e' disponibile per il download e la consultazione presso la pagina del corso.

Un percorso di studi veramente interessante, mi pare gia' che dalle parti di Roma ci fosse stato qualcosa del genere ma a livello di master universitario. Speriamo che anche in Italia si comincia a dare la giusta importanza a certe cose e non a continuare a vedere l'informatica sempre e solo come un gioco.

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.

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.