contact contat contattaci mail scrivici write mailme email e-mail
Game Programming Italia
Giochi tridimensionali
di Mark H. Overmars gamemaker@wanadoo.nl http://www.gamemaker.nl/ | 07-07-2004 15:44:58 | tradotto da Ruggero "Ruj89" Russo | 13794 hit
Impariamo semplici tecniche per dare un look tridimensionale ai nostri giochi.
Scarica Download | Commenta/Vota | Segnala | Stampa | Aggiungi/Togli ai Preferiti | Cerca simili

Qui sono descritte e usate le principali tecniche per dare un tocco di tridimensionalità ai propri giochi senza usare complicati algoritmi.

Giochi tridimensionali
Copyright 2003, Mark Overmars
Ultima modifica: 9 Aprile 2003 (ultimato)
Necessaria: versione 5.0, advanced mode
Livello: Intermedio
Tradotto da: Ruggero "Ruj89" Russo

I giochi reali sono tridimensionali, non è vero? Beh, no. Attualmente tutti i giochi producono un'immagine bidimensionale sullo schermo del tuo computer. Essi danno l'effetto di essere tridimensionali (da ora in poi si parlerà di 2D e 3D) ma questo non implicherà il fatto che siano 3D. Perciò come fa un gioco a chiamarsi tridimensionale? E' difficile da rispondere. Deve essere una combinazione tra il modo in cui è creato, le immagini visive che il giocatore vede ed il modo in cui il giocatore controlla il gioco.

I moderni giochi 3D modellano il mondo di gioco con oggetti tridimensionali, usano l'hardware 3d grafico per renderizzare le scene, danno l'obiettivo, che è la posizione nella quale il giocatore ispeziona il mondo di gioco, l'hardware crea la corretta immagine tenendo in conto aspetti come luce, superfici nascoste (oggetti dietro altri non possono essere visti e non devono essere disegnati) ed effetti atmosferici. Questo può regalare spettacolari esperienze ma c'è per questo un prezzo da pagare: modellare un mondo 3D con oggetti 3D è molto difficile, porta via molto tempo e creare la logica di gioco, includendo aspetti come il comportamento delle entità di gioco, i movimenti dell'obiettivo ecc. è un compito molto difficile.

Per esempio il risultato della produzione di un moderno gioco 3D è un lavoro enorme che comprende un grande team di lavoratori specializzati e di solito costa milioni di euro ed ancora molti di questi giochi hanno errori, in particolare per quanto riguarda l'obiettivo, il movimento del personaggio e le collisioni.

Questo significa che i giochi 3D sono fuori dalla tua portata? Beh, sì e no. Game Maker non supporta mondi di gioco 3D e non è possibile utilizzare modelli 3D, perciò non aspettarti di creare uno sparatutto completo. Ma attualmente tutti i giochi che sembrano 3D prodotti fino al 1995 e molti giochi da allora non usano modelli tridimensionali. Per esempio giochi come Age of Empires e la serie Command and Conquer (escluso l'ultimo), non usano un mondo tridimensionale ma sono chiamati anche giochi isometrici. Infatti usano sprite per rappresentare il mondo di gioco ed i personaggi e usano dei relativi trucchetti per dare all'utente un senso di mondo tridimensionale.

In questo tutorial tratteremo un certo numero di queste tecniche che possono essere usate giochi in finto 3D con Game Maker. Questi giochi non sono i più semplici da fare perciò dovresti avere un po' di esperienza dell'uso di Game Maker prima di partire con questo, anche perchè dovremo utilizzare del codice per creare certi aspetti del lavoro.

Ingannando la tua mente

Come fare qualcosa che assomigli al 3D? L'idea base è di ingannare la mente in modo da far pensare che l'immagine vista sia 3D. Ecco perchè pensiamo che l'immagine è tridimensionale. Molti aspetti giocano un ruolo importante qui.

Oggetti che stanno sotto altri sono (parzialmente) invisibili

Questo è un aspetto importante. Normalmente non si può vedere attraverso oggetti solidi, per esempio se un personaggio è parzialmente nascosto da un albero, colui che vede sa che il personaggio è dietro l'albero. In questo modo colui che vede si rende conto del 3D. Per questo motivo per fare un mondo semi-3D dobbiamo solo mostrare gli oggetti che in quel momento sono visibili. Questo processo normalmente è chiamato rimozione delle superfici nascoste.

Gli hardware grafici 3D rimuovono le superfici nascoste automaticamente, ma visto che Game Maker interagisce con un mondo 2D, dobbiamo farcelo da noi. Il modo per fare ciò è di disegnare gli sprite che corrispondono agli oggetti nel corretto ordine. L'oggetto più lontano viene disegnato per primo. L'oggetto successivo viene disegnato su di esso, e così via. Dato che l'oggetto più vicino viene disegnato sopra a quello precedente, dobbiamo mostrare parzialmente gli altri oggetti. In Game Maker possiamo fare tutto questo settando il valore di depth (profondità) per ogni istanza. Le istanze con una profondità maggiore sono disegnate per prime, e dopo quelle con il valore di profondità minore.

Gli oggetti più lontani sono più piccoli

Chiaramente gli oggetti più lontani devono essere più piccoli. Questo dà una forte sensazione di distanza e una sensazione migliore del 3D.

Questo può essere fatto modificando il valore della dimensione dello sprite a seconda della distanza. Puoi fare sprite con diverse dimensioni oppure modificare il valore di scale (scala) dello sprite (tratteremo questo in seguito). Quando il giocatore si muove verso l'obiettivo, deve essere mostrato più grande. Questo dà una forte una forte sensazione di muoversi in un mondo 3D, quando però la scala è sbagliata, dà esattamente l'effetto opposto.

Gli oggetti più lontani appaiono sfumati

Quando un oggetto si allontana non si vede più in modo perfetto. Quando un'immagine appare sfumata, capiremo che è molto lontana. Perciò aggiungere un effetto di blur dà un ottimo senso di distanza. Questo può essere fatto, disegnando diversi sprite per la stessa istanza ed assegnandoli a seconda del valore di depth.

Gli oggetti più lontani sono più lenti

Un oggetto più lontano ci mette di più ad attraversare da sinistra a destra la visuale, mentre un oggetto più vicino si muove più veloce attraverso la visuale. Puoi usare questo per dare il senso di profondità a colui che guarda. Un aspetto particolare è lo scrolling della parallasse che tratteremo più tardi. Perciò normalmente, la velocità verticale sullo schermo (che corrisponde la movimento verso di te o l'allontanamento da te) dovrebbe essere più lenta di quella orizzontale.

Gli oggetti tendono ad avere un'ombra

Gli oggetti creano ombre. E' difficile avere ombre su di altri oggetti, ma è relativamente facile averne una sul pavimento. E anche se non ci sono ombre, è buona regola avere un piccolo punto scuro sotto all'oggetto. Questo dà la sensazione che l'oggetto stia sul pavimento. Sii sicuro che le ombre siano sempre presenti, cioè che tutti gli oggetti abbiano un'ombra (o no) e che sia della stessa dimensione e direzione. Per esempio nella figura sotto, nella figura a sinistra non si capisce dove sia, mentre in quella al centro chiaramente si trova al centro, mentre quella a destra sta saltando su di esso.

Le linee parallele sembra si incontrino in un punto

Come tutti saprete, le linee parallele in un mondo 3D si incontrano tutte in un punto. Per esempio le due sponde di una strada si uniscono in lontananza. Per essere più precisi, la nostra visuale crea una proiezione prospettica. Questo in qualche senso deforma gli oggetti a seconda della loro profondità, ma questa deformazione è ciò che dà una somiglianza al 3D. Considera per esempio queste due immagini:

La prima immagine mostra una proiezione senza prospettiva, le linee verticali sono parallele. Nell'immagine di destra si usa una trasformazione in prospettiva e di conseguenza le linee si incontrano da qualche parte in lontananza. Questo da un maggiore senso di 3D. Le proiezioni prospettiche sono importanti per i giochi 3D ma sfortunatamente non sono facili da fare con gli sprite, perciò giochi basati su sprite normalmente non usano la trasformazione prospettica. Per limitare l'effetto essi usano la proiezione ruotata di 45°, cioè con una visuale che non guarda dritto, ma leggermente sul lato, con un risultato che le linee parallele sono meno visibili e, inoltre, colui che osserva è meno distratto da esse. Questa è la base di un gioco isometrico. L'immagine seguente mostra la stessa immagine ma con una proiezione isometrica:

Se guardi bene le linee sono parallele (il che è sbagliato), ma dà un maggiore effetto 3D rispetto all'immagine sopra. Creare giochi isometrici con Game Maker è possibile e ti mostrerò come in seguito.

Lo scrolling della parallasse

Come detto prima, gli oggetti più lontani si muovono più lentamente di quelli più vicini. In questa sezione useremo questa affermazione, ma solo attuata in uno sfondo laterale con oggetti fermi.

Come dovresti sapere puoi inserire background nelle tue room con Game Maker. Molto spesso una room ha solo uno sfondo, ma è anche possibile che ne abbia multipli. Chiaramente per vedere questi background devono essere parzialmente trasparenti o coprire solo una parte della room. Dando allo sfondo più lontano una velocità minore rispetto a quello più vicino, si dà al giocatore l'impressione che questo sfondo sia più lontano. In questo paragrafo creeremo un piccolo esempio di una macchina guidata lateralmente su di una strada. Non guarderemo alla qualità grafica, vogliamo solo dimostrare l'effetto.

Prima di tutto ci servono due sfondi. Il primo è formato dalle montagne all'orizzonte:

Deve essere piazzato nell'alto della room e si deve muovere verso sinistra con una velocità davvero piccola (1). Lo tasselleremo orizzontalmente ma non verticalmente. Il secondo background raffigura la strada. E' molto piccola, è piazzata nel basso della room, si muove molto più velocemente (4) e anche questo lo tasselleremo solo orizzontalmente. Piazzeremo anche una macchina ma non ci sarà bisogno di muoverla perchè la strada si muoverà sotto di essa e darà l'illusione di movimento. Dato che la strada si muoverà più velocemente delle montagne, darà la sensazione che esse siano più lontane.

Per dare maggiore profondità alla demo, includeremo alcuni alberi. Ne useremo tre di diversa lunghezza:

Per ciascuno di essi faremo un oggetto. Per essere sicuri che l'albero piccolo sia dietro a quello medio e che a sua volta questo sia dietro quello grande, daremo agli oggetti profondità differenti (sotto parleremo di più a proposito della profondità). L'albero grosso deve essere piazzato vicino alla strada e deve avere come velocità 4, come quest'ultima. L'albero di mezzo deve essere piazzato un po' più lontano e daremo ad esso una velocità di 3. Infine al più piccolo daremo 2 di velocità. Piazzeremo un paio di essi nella room e controlliamo se, quando scompaiono sulla sinistra dello schermo, riappaiano sulla destra (con un po' di casualità per non renderlo troppo regolare). Il risultato sarà il seguente:

Puoi trovare la demo nel file parallax.gmd, chiaramente non sarà un gioco. Per trasformarlo in un gioco potresti dare al giocatore l'opportunità di sterzare con la macchina per esempio aggiungendo il traffico.

Proiezione parallela

Anche se i veri giochi 3D usano progetti prospettici, avremo prima a che fare con la proiezione parallela. In questa proiezione la grandezza dello sprite rimane uguale per ogni distanza e le linee rimangono parallele. Questo rende la costruzione degli sprite molto semplice perchè essi hanno una grandezza fissa. Chiaramente questa proiezione darà una distorsione della visuale, e per limitare questa distorsione, controlleremo che il giocatore non veda le cose più lontane. Perciò egli non noterà molto l'errore nella grandezza dell'immagine. Faremo tutto questo guardando il mondo dall'alto verso il basso con un'inclinazione (normalmente sui 45 gradi), perciò un mondo formato da quadrati assomiglierà ai rettangoli:

Per un'immagine di sfondo sarà così:

E' facile farlo come immagine, basta scalare l'immagine solo verticalmente.

Dimostreremo questo approccio con un demo dove il giocatore controlla un personaggio che potrà camminare in un mondo formato da qualche albero. Ci sono tre cose che dobbiamo tenere in considerazione in una applicazione come questa: dobbiamo essere sicuri che le superfici nascoste siano eliminate correttamente. Perciò quando il personaggio si trova dietro un albero deve essere disegnato prima dell'albero per renderlo parzialmente invisibile. In secondo luogo dovremo avere a che fare correttamente con la velocità del personaggio: il movimento verticale dovrà essere più lento rispetto a quello orizzontale. Infine, ed è la cosa più difficile, dovremo prevedere le collisioni correttamente.

Inizieremo prima con la rimozione delle superfici nascoste. Come dovresti sapere ogni sprite ha una origine, quella di default è il punto nell'angolo in alto a sinistra dell'immagine dello sprite. Quando piazziamo l'istanza di un oggetto in una posizione particolare noi attualmente metteremo lo sprite corrispondente con la sua origine nel punto. Quando abbiamo a che fare con un mondo 3D è facile capire che l'origine dello sprite è il punto in cui lo sprite tocca terra, perciò setteremo l'origine in quel punto. Per esempio per il personaggio che cammina attraverso la foresta setteremo lo sprite come segue:

Adesso, cos'è il depht (profondità)? Nella maggior parte dei casi l'ordine secondo il quale gli oggetti devono essere disegnati nello stesso ordine secondo il quale stanno sul piano. Così settando l'origine come sopra, la coordinata y dell'istanza determina l'ordine. L'istanza con una coordinata y minore, che si trova in alto della finestra, deve essere disegnata prima di una con il valore di y maggiore, perciò ad una maggiore coordinata y corrisponde una minore profondità. Questo può essere fatto settando il valore di depht a -y usando la seguente azione:

Per gli oggetti statici, come gli alberi nel nostro esempio, dovremo fare questo solo nell'evento creation, mentre per quelli dinamici, come il nostro personaggio, dobbiamo farlo in ogni step. Faresti bene ad usare l'evento end step per essere sicuri che tutti gli eventi siano attuati prima del calcolo della profondità.

In secondo luogo dobbiamo tenere in considerazione il movimento del giocatore. Possiamo farlo nel solito modo usando le frecce. In ogni evento freccia setteremo il movimento nella corretta direzione e lo sprite per l'istanza. Inoltre, per dare un'animazione del personaggio mentre si muove e non mentre non si muove useremo la variabile image_single. Questa variabile indica quale sottoimmagine deve essere disegnata e settando essa a -1 mostrerà l'intera animazione. Perciò quando il giocatore premerà una freccia, devi settare essa a -1, e quando rilascia un tasto o quando collide con un oggetto la setteremo a 0. Però tutto questo non ha niente a che fare con il 3D, è solo il modo più facile da seguire in tutti i giochi. L'unica cosa da tenere in considerazione è che in un gioco tridimensionale la velocità è differente, quindi nella velocità orizzontale useremo 3 mentre in quella verticale 2. Potresti cambiare questi numeri per rendere migliore l'effetto.

Infine avremo a che fare con le collisioni. Normalmente avviene una collisione quando lo sprite è parzialmente sovrapposto. Questo è corretto per i giochi 2D, ma non per quelli 3D, per esempio quando il personaggio sta davanti ad un albero, sovrappone lo sprite ma non ci sarà una collisione. Perciò ci servirà un'altra area per determinare le collisioni. Normalmente questa è l'area dell'istanza sul terreno. Solo quando i piedi del giocatore si sovrappongono alla base del tronco c'è una collisione. Il modo più facile per fare tutto ciò è usare un bounding-box molto piccolo per tutti gli sprite verso il basso e togliere il segno di spunta da Precise collision checking. Adesso avverrà una collisione solo quando il bounding-box è un po' sovrapposto, che è esattamente ciò che vogliamo.

Per forme più complesse un piccolo rettangolo in basso potrebbe non indicare la corretta area di collisione. In questo caso useremo un'altra opzione di Game Maker. Un oggetto potrebbe avere una maschera differente rispetto a quello dello sprite usata per rappresentare l'istanza. Perciò possiamo fare un'altro sprite che ha la forma dell'area di collisione richiesta e usa questa come maschera di collisione. Useremo questo approcci dopo quando creeremo un gioco isometrico.

Adesso abbiamo tutti gli ingredienti per il gioco tridimensionale che vogliamo fare. Per farlo più carino useremo un tileset di sfondo. Noi scaleremo questi come indicato sopra per ottenere 48x24 tasselli. Con questo abbiamo riempito lo sfondo. Aggiungeremo anche qualche muro come tassello nello sfondo. Per creare la collisione con questi useremo la tecnica standard, cioè definiremo un oggetto muro invisibile e solido e piazzeremo delle istanze di esso alla base dei muri allo sfondo. Perciò il personaggio dovrebbe fermarsi perchè in collisione con quest'oggetto invisibile mentre il giocatore vedrà solo il muro carino dietro ad esso.

Infine dovremo fare la room. Useremo una view nella room in modo che il giocatore veda solo parte del mondo. Per migliorare la percezione di profondità faremo la view grande 400x200, perciò ancora con lo scalo del fattore 2 sulla direzione verticale. In molti giochi questa proporzione è attuata aggiungendo vari pannelli di informazione sotto il mondo a scorrimento (è questo il motivo per cui faresti meglio a mettere i pannelli informativi alle estremità inferiore e superiore che ai lati per questo tipo di giochi). Il demo finale può essere trovata nel file parallel.gmd e dovrà essere come segue.

Scalare immagini

Nella scorsa sezione abbiamo trattato della proiezione parallela. Se usiamo una visuale abbastanza lontana dal pavimento in una orientazione fissa e mostriamo solo parte del mondo, è una cosa buona. Ma se vogliamo una visuale in prima persona o una visuale più vicina al pavimento dovremo usare la proiezione prospettica perchè in questo caso la dimensione degli oggetti dovrebbe essere minore quando l'oggetto si allontana. Ma come riuscire a fare ciò? Nel primo esempio di scrolling della parallasse abbiamo usato tre alberi di differenti dimensioni. Questo andrebbe bene quando gli alberi sono ad una distanza fissa, ma in gioco i vero 3D il giocatore dovrebbe avere un approccio con essi e la dimensione dovrebbe cambiare in continuazione. Dovremo creare un enorme numero di sprite, una per ogni dimensione, ma questo userà un sacco di memoria. Potresti fare questo per gli oggetti più importanti perchè dà loro maggiore qualità, ma per le altri istanze potresti usare la scala dello sprite. In questa sezione ti mostreremo come fare ciò usando un semplice esempio dove il giocatore deve evitare gli alberi mentre si muove dentro una foresta

Perciò ci serve uno sprite per l'albero. Useremo un solo sprite in questo caso

ATTENZIONE: Per alcune schede grafiche, la dimensione degli sprite deve essere multiplo di 4 per scalare correttamente. Per andare sul sicuro ti raccomando di dare ai tuoi sprite sempre dimensioni che sono multipli di 16!

Per lo sprite setteremo un piccolo bounding-box sul tronco dell'albero, come prima. Questa è l'unica parte in cui ci interessa la collisione con il giocatore. Setteremo anche l'origine ai piedi dell'albero. Perciò le proprietà dello sprite dovranno essere così:

Useremo di nuovo le montagne come sfondo, ma in questo caso ferme. In questo caso setteremo la larghezza della room di 2000. Piazzeremo il personaggio principale, per il quale ci serve un altro sprite, in mezzo ai piedi della room. Useremo una view di 480x320 e metteremo il personaggio al centro settando i bordi della view e dicendogli di seguire il giocatore come segue:

Il giocatore dovrebbe muoversi a destra e a sinistra quando il giocatore preme le frecce direzionali. Chiaramente dobbiamo evitare di muoverlo troppo lontano a destra o a sinistra. Come punteggio useremo il tempo durante il quale il giocatore sopravvive. Perciò nell'evento Step del giocatore aggiungeremo 1 al punteggio. Quando il giocatore collide con un albero dovremo mostrare la tabella dei punteggi migliori e ripetere il gioco.

Ciò che rimane sono gli alberi. Ci sono tre aspetti con cui avremo a che fare: la dimensione, la posizione sullo schermo e la profondità. Gli alberi appariranno nella posizione y 180. Nell'evento step useremo l'azione per settare lo sprite. Useremo sempre lo stesso ma nell'azione indicheremo anche la scala. Useremo uno scale factor (fattore di scala) che è vicino a 0 quando la posizione y è 180 e che incrementa quando l'albero si muove verso il basso, come segue:

Puoi giocare un po' con lo scale factor se ti va (assicurati che sia sempre positivo).

La seconda cosa è la profondità. Ancora nell'evento step la setteremo a -y. Questo significa che gli oggetti più lontani dalla base dello schermo (con una coordinata y maggiore e più lontani dalla visuale) hanno una profondità minore e sono disegnati prima degli altri, proprio come noi vogliamo. Ci serve anche dare al giocatore una profondità adeguata per dargli la giusta posizione davanti agli alberi.

Infine dobbiamo controllare i movimenti. Questo può risultare più difficile di quanto si pensi. Possiamo fare in modo che gli alberi si muovano con una velocità costante verso il basso ma, come noterai, questo li farà visibilmente rallentare (questo perchè gli oggetti più vicini sembreranno muoversi più veloci di quelli più lontani), perciò dobbiamo incrementare la velocità verticale. Poi gli oggetti si muovono verso i lati se sono vicini (questo perchè due linee parallele si incontrano in un punto nell'infinito). Perciò, basandoci sulla posizione dell'albero relativamente al centro della visuale, dobbiamo adattare la sua velocità orizzontale. Faremo questo usando il seguente pezzo di codice nell'evento step:



  1. {




  1. var xoff,yoff;




  1. xoff = x - (view_left + view_width/2); //offset per la visuale centrata




  1. xoff = x - ystart //offset per la posizione di partenza




  1. x += xoff * 0.015;//Gioca con questi valori




  1. y += yoff * 0.02;




  1. }


Nota l'uso delle variabili xoff e yoff. I numeri sono stati determinati sperimentalmente. Puoi anche cambiarli un po'.

Per finire il gioco dobbiamo aggiungere altre piccole cose, come distruggere gli alberi quando scompaiono sotto allo schermo e aggiungere un oggetto controllo che gestirà la comparsa degli alberi (sempre di più quando il punteggio cresce). Puoi trovare il gioco demo nel file scaling.gmd. Puoi usare esso come base per un tuo gioco. Per favore, impara che scalare sprite può essere lento, specialmente su macchine vecchie, perciò usalo con cura.

Attualmente puoi usare lo stesso procedimento per creare un gioco sparatutto in prima persona completo. In questo caso il giocatore ha una posizione ed un orientamento nel mondo di gioco. Per tutte le altre istanze nel mondo dovresti calcolare la posizione relativamente alla direzione verso cui sta guardando e la loro distanza. La distanza determinerà l'ordine di disegno e le dimensioni (Per non disegnare troppi oggetti normalmente dovresti solo disegnare istanze se sono abbastanza vicine). Non entrerò nei dettagli qui.

Giochi isometrici

Infine andremo a vedere un tipo molto popolare di gioco e creeremo un gioco isometrico. Molti dei giochi adesso in produzione sono isometrici. Tipici esempi sono Age of Empires, Diablo, Command & Conquer (escluso l'ultimo), SimCity e molti altri giochi strategici o di simulazione (per esempio guarda l'immagine sotto).

Questi giochi sono in principio possibili con Game Maker (ma realizzare cose come questi giochi commerciali prende diversi anni per essere realizzati da squadre di specialisti).

Il principio di un gioco isometrico è che il mondo 3D è visto sotto un angolo di 45 gradi. E' ancora usata la proiezione parallela, cioè non c'è prospettiva, perciò gli oggetti distanti non diventano più piccoli. Immagina che il mondo consista di quadrati come l'immagine sotto a sinistra. Una visuale isometrica assomiglia all'immagine a destra. Ogni cella ha una forma di diamante. Per allineare celle facilmente useremo un diamante 2x1, per esempio 32x16 pixel.

Facendo la stessa cosa con un'immagine di sfondo otterremo le seguenti due immagini

Queste immagini di sfondo possono essere fatte facilmente con Game Maker. Per prima cosa faremo uno sfondo tassellato. Dopo costruiremo lo sfondo. Dopo di ciò dovremo allargare la dimensione, ruotarla di -45 gradi e stringerla verticalmente del 50%.

Il vantaggio di una proiezione isometrica dalle altre proiezioni che abbiamo elencato è che la tua mente interpreta subito i diamanti come quadrati visti da un'angolatura. Questo dà all'immagine l'effetto 3D. Chiaramente daremo una distorsione della prospettiva perchè la dimensione degli oggetti non cambia con la distanza. Questa distorsione della prospettiva può essere limitata mostrando solo una parte del mondo. Perciò molti giochi isometrici usano una visuale limitata del mondo.

Una volta che hai uno sfondo carino dovresti piazzarci oggetti all'interno. Questi oggetti devono obbligatoriamente avere una forma 3D vista dall'angolo di 45 gradi. Creare oggetti isometrici non è molto facile e normalmente è la parte più lunga per creare un gioco isometrico.

Ogni oggetto ha un'ombra sul pavimento. Quest'ombra è cruciale. E' usata per le collisioni, o detta in modo differente, come mask di collisione. Perciò per ogni oggetto dovresti disegnare due sprite: l'immagine dell'oggetto attuale e la sua mask. Sarebbe sempre meglio mettere l'origine della mask e quella dello sprite al centro dell'ombra. Per esempio sotto puoi vedere un'immagine di un elemento del muro che dovremo usare in un gioco isometrico, e la corrispettiva mask (la croce è l'origine).

La mask in questo caso ha la dimensione di un tassello dello sfondo.

Per individuare le collisioni sull'ombra gli sprite possono sovrapposti fino a quando le loro ombre non si sovrappongono. E' questo precisamente che vogliamo. Quando per esempio una palla va verso un blocco gli sprite possono sovrapporsi. Ma la collisione con un muro avviene quando l'ombra della palla urta quella del muro.

Come nel caso della proiezione parallela setteremo la profondità a -y. In questo modo le istanze saranno disegnate nell'ordine corretto.

C'è ancora un problema. Quando crei la tua stanza gli sprite non sono disegnati in quest'ordine. Questo potrebbe rendere difficile la creazione delle scene giuste. Un avviso è di cominciare sempre a disegnare dall'alto per lavorare sempre più in basso. Oppure, nella tabella degli oggetti c'è un bottone per ordinare gli oggetti a seconda della loro coordinata y (Sort by y), che è proprio quello che ci serve.

L'ultime parole per quanto riguarda il movimento. A causa della proiezione i movimenti orizzontali devono essere due volte più veloci di quelli verticali. Oppure, quando per esempio usi le frecce per ordinare il movimento, è diffuso dare loro il corrispondente movimento diagonale (lungo i lati dei tasselli) piuttosto che i movimenti orizzontali e verticali.

Un esempio di labirinto

Come esempio faremo un semplice labirinto isometrico. Non è molto sofisticato ma ti mostrerà l'idea di base. Il gioco può essere trovato nel file isometric.gmd.

Come primo passo dovresti disegnare il labirinto su carta. Sarebbe molto difficile da fare mentre crei una stanza. Dopo creeremo un pavimento di sfondo per il labirinto che riempie l'intera area coperta dal labirinto.

Dopo creeremo gli sprite. Come indicato prima ci servono due sprite per ogni oggetto: l'immagine attuale e la mask usata per individuare le collisioni (nel nostro caso, per molti oggetti possiamo usare la stessa mask). Dobbiamo essere sicuri che ogni sprite sia disegnato in modo preciso sul pavimento me che le origini siano al centro dell'ombra.

Per fare le cose più interessanti ho aggiunto anche un cancello che consiste di tre parti. Le colonne di destra e sinistra sono semplicemente più alte e di diverso colore. Esse hanno la stessa mask del muro e faranno esattamente la stessa cosa (perciò lo renderemo figlio dell'oggetto muro). Il pezzo centrale del cancello è differente. Consiste in un blocco in aria. Non avrà bisogno della mask perchè la palla potrà muoversi sotto ad esso. Ma dovremo essere sicuri che l'origine sia al centro di esso (altrimenti potrebbe essere disegnato con una profondità sbagliata).

Per tutti gli oggetti statici setteremo la profondità nell'evento create. Per l'oggetto palla lo setteremo nell'evento end step. Per il resto il gioco sarà identico ad un gioco di labirinti semplice. Quando premi una freccia muoveremo la palla un poco nella corretta direzione diagonale, solo se la posizione dopo è libera. Come indicato prima la distanza orizzontale è due volte più grande di quella verticale. Quando la palla (che consiste nell'ombra) collide con la bandiera (che è sempre l'ombra), il labirinto è risolto.

Creare stanze è la cosa che ti prenderà al maggior parte del tempo. Dovresti piazzare tutti gli elementi del muro correttamente. Faresti meglio, come ho detto prima, a lavorare dall'alto verso il basso. Usa il bottone nella tabella oggetti per ordinare correttamente gli oggetti a seconda della loro coordinata y se fai un errore. Usa una griglia 16x8 per allineare correttamente le istanze. Potresti disattivare la casella "Delete underlying" (Cancella la sovrascrittura) perchè rende più facile il lavoro per piazzare i muri.

C'è un'altro trucchetto aggiunto al demo. Quando schiacci il pulsante <Spazio> potresti vedere la palla attraverso i muri. Questo è utile quando gli oggetti in movimento possono completamente scomparire dietro ad altri oggetti. Si può fare in questo modo. Un nuovo oggetto chiamato palla_trasparente è creato. Esso ha una profondità di -100000, in modo che sia di fronte a qualsiasi cosa. Nell'evento draw di esso metteremo un piccolo pezzo di codice che disegni la palla parzialmente trasparente al posto della palla. Questo dà l'effetto come se si vedesse la palla attraverso il muro.

Prova a giocare il demo. Aggiungi qualche muro e cancello carini, aggiungi qualche livello ecc.

Giochi isometrici più avanzati

I giochi isometrici sono molto adatti per molti tipi di gioco. La difficoltà maggiore è che ti servono tasselli ben fatti. Si possono trovare molte risorse attraverso Internet, inclusi alcuni programmi che ti aiutano. Usa per esempio Google e scrivi come parole chiave "isometric tiles" e potresti trovare molte pagine interessanti. Per il resto, come io ti ho indicato prima, è più facile di quanto potrà sembrare. Le uniche due cose che dovresti tenere in mente sono le collisioni con le mask e il settaggio corretto della profondità. Qui ci sono altre cose da tenere in mente:

1. Quando non puoi camminare dietro alcuni oggetti (come montagne o boschi) faresti meglio a disegnarli sul background. Dopo puoi usare alcuni oggetti invisibili per fare in modo che l'oggetto in movimento stia ai piedi di essi.

2. Quando un oggetto occupa differenti tasselli (come per esempio un cancello) dividilo in pezzi per risolvere il problema della profondità.

3. Ricorda di mettere sempre l'origine al centro della proiezione verticale dell'oggetto. Perciò per esempio un uccello che vola può avere il suo centro un po' al di sotto di esso. Nota che non è necessario fare l'oggetto più lungo, il centro può essere fuori dallo sprite.

4. In rari casi, la relazione di profondità tra due oggetti è più complicata di come ho indicato prima. In questo caso puoi settarlo in modo più complicato, ma può essere normalmente essere fatto con un piccolo pezzo di codice.

Conclusione

Penso che questo tutorial ti abbia convito che è possibile fare differenti tipi di gioco con Game Maker che hanno una netta somiglianza con il 3D. Come sempre, l'unico limite è la tua immaginazione.

 

Ogni marchio citato in questo documento è proprietà dei rispettivi proprietari.




Commenti

Non sono presenti commenti

Per inserire commenti devi essere registrato !
 
Valutazione x 
8VOTI
12


www.steo.it

TIPS: Luminance (scala di grigio)