|
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:
- {
- var xoff,yoff;
- xoff = x - (view_left + view_width/2); //offset per la visuale centrata
- xoff = x - ystart //offset per la posizione di partenza
- x += xoff * 0.015;//Gioca con questi valori
- y += yoff * 0.02;
- }
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.

Non sono presenti commenti
Per inserire commenti devi essere registrato ! | |
 | VOTI 12 |
|---|
|
|
|
|