Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - DirectX e C++ :  2D vecchio stile
Forum - C/C++ - DirectX e C++ : 2D vecchio stile

Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 23:29
Sabato, 20/02/2010
E' da molto che voglio imparare le DirectX però purtroppo in rete si trova poco e quel poco che si trova non l'ho mai capito chiaramente, limitandomi a fare un copy&paste che manco funzionava egregiamente. Dunque chiedo qui sperando di ricevere risposte chiare :).
Il mio obiettivo finale è di realizzare l'engine di un piccolo videogame 2D. Voglio far basare tutto al vecchio stile del Super Nintendo e Sega Megadrive, cioè col sistema delle tiles e palette. Ad esempio ho recentemente finito di creare un programma che tramite un set di 8 palette che contengono a loro volta 16 colori diversi, si può disegnare una tiles 8x8, tiles 16x16 che sono formate da 4 tiles 8x8 ruotati e "palettizzati" nel modo giusto, tiles 128x128 che sono formati da blocchi da 16x16 con i giusti attributi e che vengono disposti in una mappa con dimensioni da me definite formando un vero e proprio livello (credo che qualcuno che conosce bene la struttura di uno dei giochi a vecchio stile ha capito perfettamente quello che mi passa per la testa :rofl: ). Ok, tutto funziona, sono riuscito a importare alcune tiles di Sonic the Hedgehog e di Megaman X con succeso con un formato particolare che ho creato io.
Dunque arriviamo al problema principale che mi ha fatto aprire questa discussione ovvero il rendering delle immagini 2D su una finestra con le DirectX. Sò che l'ultima versione delle DirectDraw che gestiva la bidimensionalità è stata la 7.0 che comunque usava la CPU per visualizzare tutto su schermo e se si vuole la bidimensionalità con le DX9 bisogna "emularla" (e me ne vorrei approfittare per scaricare tutto su GPU e magari applicare anche qualche effetto carino sul 2D..) ma tutto questo come? Su tutti i tutorial che ho visto in rete c'è poco e niente che sia comprensibile e gli esempi nell'SDK sono molto difficili e tutti che fanno vedere il funzionamento del 3D.
Aspetto vostre risposte :)

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 0:30
Domenica, 21/02/2010
se vuoi utilizzare il 3D per "emulare" (come dici tu) il 2D, puoi continuare a mantenere i tuoi tileset, ma dovrai cambiare il pixel format.

Invece di lavorare su palette, ti conviene convertire tutto a 16 o 24 bit e creare così dei veri e propri sprite true color.
Una volta ottenuti questi sprite, potrai visualizzarli in 3D in modo abbastanza semplice:
- Imposti la proiezione come ortho, e la viewport uguale alla finestra
- Illuminazione globale attiva
- Crei un quad (o una coppia di triangoli)
- Mappi come texture lo sprite di prima
- Lo renderizzi nelle coordinate desiderate, usando una matrice di sola traslazione
- Per flippare un tile, puoi applicare una matrice di rotazione a 180° lungo uno o più assi.

Questa tecnica ha il vantaggio di essere leggera per la CPU, ma lo svantaggio di perdere il controllo delle palette animations che andavano tanto di moda nei vecchi giochi (e che ancora si usano sul mio amato Nintendo DS!).

Puoi ovviamente creare tanti layers di tileset a tuo piacimento, e farli scorrere e ruotare semplicemente concatenando le matrici di trasformazione dei layers con quelle dei singoli tiles appartenenti a tale layer.

Infine per applicare "effetti" fighi, puoi fare uso dei pixel shaders per applicare i filtri di post processing che più ti aggradano (bloom, motion blur, lens flare, heat distortion, (de)saturation, edge marking, ecc...).

Se qualche cosa non ti è chiara, almeno adesso sai come si chiamano le cose, e ti verrà più semplice cercare del materiale specifico in rete... ti consiglio 2 siti: www.gameprog.it e www.gamedev.net

ciao ;)

PM Quote
Avatar
xeeynamo (Normal User)
Pro


Messaggi: 66
Iscritto: 14/03/2008

Segnala al moderatore
Postato alle 12:24
Domenica, 21/02/2010
Grazie mille per la risposta ^^.
Per le tiles uso il metodo getImage(Palette) così da convertire il tile in una bitmap in 16bit con la palette che voglio io, mantenendo quell'effetto carino con le palette tipo delle luci animate o cascate tipo i classici di Sonic. Per adesso comunque stò provando a seguire un tutorial su www.notjustcode.it anche se spiega tutto in ambiente .Net. Darò anche un'occhiata ai due siti che hai detto tu anche perchè mi interessa sviluppare il gioco o parte di esso in C++.
Comunque ci sono due cose che non mi sono chiare al 100%: per creare ad esempio una sprite 2D bisogna convertirla in una texture che deve essere applicata su un quadrato (formato da 2 triangoli) giusto? E per la telecamera dovrei usare solo le coordinate X e Y lasciando la Z a zero o no?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 13:32
Domenica, 21/02/2010
1) esatto, gli sprite li puoi creare esattamente così. Se la camera è di tipo Ortho e la viewport è settata per tutta la finestra in modo corretto, le dimensioni in pixel degli sprite coinciderano alle dimensioni unitarie nello spazio view (quindi un quad largo 16.0x32.0 potrà contenere senza alcuna deformazione una sprite da 16x32 pixel).
2) la Z della camera non lasciarla mai a zero, altrimenti potresti avere problemi strani in fase di projection (alcune righe della matrice potrebbero diventare nulle).
Ti consiglio di usare una prospettiva di tipo Ortho e di settare la camera alle coordinate (0.0, 0.0, 1.0) con target a (0.0, 0.0, 2.0) e di settare near e far clip plane rispettivamente a z=100 e z=1000. Per fare lo scrolling dei layers, modifica le loro matrici di traslazione, anzichè modificare la camera, così potrai riprodurre fedelmente anche il parallax scrolling, usando valori diversi per la velocità di scrolling dei vari layers.

Ultima modifica effettuata da TheKaneB il 21/02/2010 alle 13:36
PM Quote