Programmazione di Giochi con le DirectX
Copyright (C) David Joffe 1997-1998.
Menu:
Disclaimer
Questo documento e tutti i files e il codice dati insieme ad esso sono forniti "così com'è" e senza alcun tipo di garanzia, nemmeno la garanzia implicita td'uso per qualsiasi scopo particolare. Io NON sono responsabile per qualsiasi danno che può scaturire dall'uso o abuso sia di questo documento che di qualsiasi file disponibile per il download da questo sito. Non c'è nemmeno la garanzia che le informazioni contenute in questo file siano corrette. Se non accettate queste condizioni, allora lasciate ora questo sito.
Introduzione
Target audience: Programmatori C/C++ in Windows che vogliano imparare a scrivere applicazioni che utilizzano le confuse API della Microsoft, le DirectX. Il tutorial utilizza MFC, ma la maggior parte degli argomenti sono indipendenti da MFC.
Contributi: Se qualcuno è interessato a contribuire a questo tutorial (mi piacerebbe renderlo migliore, ma non posso per limiti di tempo/energie) allora vi prego di farmelo sapere (feedback.html.)
Bugs: Sono consapevole di un paio di bugs presenti nel codice di esempio. Un giorno lontano nel futuro, quando troverò tempo, li toglierò.
Vi prego di farmi sapere se trovate qualche errore negli articoli.
1999/04/20: Ho aggiunto un nuovo esempio non proprio completo, ddsamp (non MFC, phew!). Questo spiega il metodo PutPixel descritto in 5.1.2. L'ho fatto con Visual C++ 6, ma se avete un compilatore incompatibile dovreste essere in grado di adattare il codice sorgente in qiualsiasi progetto creiate.
Alcune parole sulle DirectX:
I prossimi pochi paragrafi costituiscono il mio commento e critica alle DirectX. Sono solo mie considerazioni, quindi potete saltare il resto di questa sezione se non volete ascoltare le mie chacchiere.
Ho scritto il paragrafo seguente in Dicembre 1998.
So che questo tutorial è un po' breve, piuttosto inadeguate e con qualche bug, ma al momento ho praticamente fermato ogni mio tentativo di programmare con le DirectX, quindi ho, per il momento, fermato ogni update per questo tutorial. la mia antipatia per le API DirectX cresce; sono grosse, sono eccessivamente complicate, sono proprietarie, sono progettate male, e non esiste una ragione tecnica per l'esistenza di una grande parte di queste, come le Direct3D (un lavoro molto migliore può essere fatto con le API 3D standard esistenti, come le OpenGL, per esempio). Oltre a ciò, la ragione principale per cui ho smesso di programmare è che non riesco a fare un programma con le DirectX che mi diverta (il vostro metro può variare); ho cominciato a programmare perché per me era divertimento, e non mi piace programmare se non mi diverto. Con questo non voglio dire che non dovete imparare le DirectX. Industrialmente, la loro esistenza è estremamente utile, e la quantità del supporto di driver per le periferiche è ineguagliato. Generalmente è anche la migliore (meglio dire la sola) scelta se volete creare giochi per la piattaforma Windows, che è probabilmente la ragione per cui state leggendo ciò. Il numero di grandi giochi che utilizzano la tecnologia DirectX è anche la testimonianza dell'esattezza di quanto detto. Per come stanno le cose ora nell'industria, potrebbe non essere sbagliato imparare le DirectX. Non lasciatevi scoraggiare solo perché a me non piacciono.
Bene, per una serie di ragioni, ho ripreso a lavorare con le DirectX. Ancora non mi piacciono le API. Voglio che i programmatori inesperti capiscano che le DirectX non sono un esempio decente di programmazione API. Non capitemi male - quello che fanno le DirectX è buono, e c'è un vuoto che le DirectX colmano. Ma il loro progetto è tremendo. Le cose nell'industria dei computer vanno così, la Microsoft non ha bisogno di preoccuparsi che i suoi prodotti siano decenti - la gente userà qualsiasi cosa metterà in circolazione e loro lo sanno. Questa mancanza di competizione ha un effetto negativo sulla qualità del codice prodotto. Il mio consiglio ai programmatori inesperti è di essere critici su qualsiasi software design - dovete imparare come riconoscerne pregi e difetti. Non accettate mai che qualcosa è migliore solo perché è lo standard corrente. Proprio adesso, stiamo imparando le DirectX, e le utilizzeremo per molti anni a venire; ma in futuro, gli sviluppatori dovrebbero levarsi contro la cattiva progettazione e chiedere qualità. Se volete esaminare varie alternative alle API per la programmazione di giochi, vedete la mia sezione sulla programmazione con X/Linux alla pagina xprog.html. Niente di disponibile è, comunque, ricco di caratteristiche come le DirectX.
Per essere equi nei confronti della Microsoft, hanno fatto alcuni giusti tentativi per migliorare le DirectX - per esempio, l'aggiunta delle DirectPrimitive. Comunque, non credo nell'iniziare con spazzatura cercando di migliorarla più che si può. Come si dice, "Garbage In, Garbage Out". Il bagaglio di pezze messe lì rimarrà anche con la release delle DirectX 3000.
Il Tutoriall
Download
Sono stufo di visitare siti che rendono il più difficile possibile ottenere le informazioni che hanno per la lettura offline. Nel mio Paese le telefonate vengono pagate in base al tempo, quindi sono convinto di non sedermi ore e ore, cliccando link dopo link, solo per ottenere uno stupido articolo mentre banner pubblicitari escono da tutte le parti. Questo è offuscamento di informazione.
Quindi, alla luce di ciò, potete downloadare una copia zippata del mio tutorial per la consultazione offline. E nemmeno banners.
dj.zip (168K) L'intero tutorial zippato, inclusi i programmi di esempio.
Risorse
The DirectX eXperience http://www.geocities.com/SiliconValley/Way/3390/.
Numerosi articoli raccolti da varie parti.
The official DirectX homepage http://www.microsoft.com/directx/.
Qui potete trovare info sulle DirectX ed anche scaricare l'ultima versione
delle SDK e/o release end-user delle DirectX. Vi prego di non chiedermi
come installare o settare le DirectX! Non faccio parte del supporto oecnico
della Microsoft e non voglio farne parte.
CDX: Free C++ DirectX class library http://www.maidex.demon.co.uk/.
Una vasta C++ class library contenente le funzionalità DirectX. Free,
con codice sorgente. Include alcune simpatiche caratteristiche extra, come
un AVI player.
ClanLib: Cross-platform graphics library http://www.clanlib.org/.
Questa è un'API per giochi C++ che rende possibile la scrittura di
giochi sia per Linux che per Windows con facilità. Utilizza le DirectX
dal lato Windows. Sembra veramente facile da usare, e può tornare
utile perfino se non siete interessati a fare applicazioni cross-platform.
The Delphi Games Creator http://www.ex.ac.uk/~PMBearne/DGC.html.
Libreria per la programmazione di giochi basata sulle DirectX, per Delphi.
un po' come CDX, soltanto per Delphi.
DirectX with Borland C++ http://www.geocities.com/SiliconValley/Pines/7268/.
Informazioni sull'uso delle DirectX sotto Borland C++. Interessante pezzo
di informazione, cioè la Microsoft ha "dimenticato" di
includere del materiale sulla versione della Borlanddi dxguid lib. (semplicemente
succede che il Borland C++ è in competizione con MS Visual C++.)
DirectX with Visual Basic http://members.xoom.com/vba51/.
Alcune informazioni sull'uso delle DirectX con VisualBasic.
Microsoft DirectX Initialization Library http://www.research.microsoft.com/graphics/directxlib/.
Questa piccola libreria, potenzialmente utile, tocca alcune degli orribili
e sabbiosi particolari che sono caratteristica delle applicazioni DirectX,
come l'elenco delle periferiche DirectDraw, profondità di colore
dello schermo, etc.
FAQ (Frequently Asked Questions)
Se mi postate una domanda che è già trattata qui, la ignorerò. In effetti, se mi mandate una domanda probabilmente la ignorerò, perché è la sola possibilità che ho. Non sono una sorta di supporto tecnico.
Ottengo un errore del linker che dice "external symbol main
not found". Cosa sbaglio?
Cerca "main" perché pensa che stiate cercando
di scrivere una applcazionea console mode (DOS-style) (command-line). Le
funzioni Win32 hanno WinMain
al posto di main
.
Create un progetto con piattaforma target Win32.
Qual è la mia opinione sulle wrapper class libraries per DirectX?
Se volete scrivere il vostro codice proprio, bene, ma ma ne esiste già una chiamata CDX. E' free, con codice sorgente. Come tale, è qualcosa che viene sviluppata dalla comunità degli sviluppatori di software per la comunità di sviluppatori software. Non spezzettate ulteriormente lo sviluppo del software con l'introduzione di diverse centinaia di class libraries differenti. usate CDX; se non è proprio quello che vi serve, allora non fatene di nuove, piuttosto aggiungetele a CDX.
Come faccio a caricare una bitmap usando le DirectDraw?
Arriverà "presto".
Come comincio a programmare giochi?
Fammelo sapere quando lo scoprirai.
Come creo dei files .x?
il programma conv3ds.exe distribuito con le DirectX SDK (SDK\BIN directory) converte i files 3d studio (.3ds) in files .x. Potete ottenere un sacco di files 3ds su Internet; un buon punto di partenza è http://www.3dcafe.com/.
SetSceneBackgroundRGB.
Il tuo codice si pianta quando lo provo in modalità 256 colori. A cosa è dovuto?
Sono un bambino pigro. Lo correggerò presto, sebbene io ritenga che la modalità a 256 colori debba morire (e tra sofferenze atroci).
Cos'è questo stdafx.h
che trovo #included
nei tuoi sirgenti?
Il file stdafx.h
è un file .h che viene
creato con ogni progetto fatto con MFC AppWizard. Dovrebbe essere incluso
in ogni file .cpp del vostro progetto, e qui c'è un suggerimento
pratico: includetelo *prima* di ogni altro include.
Come creo gli esempi (e/o i miei programmi) da command-line, con NMAKE?
Blah blah. Arriverà presto. Nel frattempo, c'è un suggerimento (per utenti Visual C++): controllate il file batch VCVARS32.BAT nella vostra directory VC\BIN.
Non ho domande. Dimmi qualcosa.
*Mai* codificare con directory/filename assoluto. E' noioso scaricare codice con un makefile o project workspace che specifica una directory assoluta, così che bisogna cambiarla per far compilare il codice.
Dimmi altre cose.
Potete davvero intrecciarvi le dita quando digitate, perciò *state attenti*. Non "correte" quando digitate; prendetevela comoda. Procuratevi una di quelle tastiere "naturali", sono veramente buone. Se le vostre dita o i vostri polsi cominciano a farvi male, fermatevi e andate da un medico.
Dimmi ancora qualcosa.
Date un'occhiata a Linux e X-Windows. Sono grandi.
Il tutoriaò fa veramente schifo (suxxa! :) ), specialmente il codice, quando hai intenzione di migliorarlo?
Sono impegnato a lavorare su una versione nuova e migliore, con del codice decente che sarà downloadable, e probabilmente anche utilizzabile nelle vostre applicazioni.
La tua funzione TraceErrorDD è tipo una specifica MFC. Che schifo.
E' vero. E' stata una svista iniziale. La cambierò molto presto.
Cos'è l'argomento D3DVAL?
Un D3DVALUE è molto simile ad un float; infatti, D3DVALUE è definito come float. Comunque, è scorretto usare float e D3DVALUE in modo intercambiabile, dato che non ci sono garanzie che il vostro codice funzionerà con le nuove versioni di DirectX che potrebbero cambiare D3DVALUE , ad esempio, in un double. Perciò dovrete usare dall'inizio alla fine D3DVALUE. C'è una macro (#define) per convertire floats e doubles in D3DVALUE, chiamato D3DVAL. Quindi: D3DVAL(3.4);
Potresti spiegare un po' meglio la creazione e la distruzione di oggetti DirectX, così come l'accenno all'argomento count?
Si.
Perché ottengo un certo errore di palette quando provo a creare una device dalla superficie?
Probabilmente siete in modalità 256 colori, in questo caso c'è bisogno di attaccare una palette alla superficie. io raccomando di eseguire Windows in modalità colore a 16 o superiori.
Qual è la differenza tra il Direct3D Retained Mode e l'Immediate Mode?
Immediate mode sono delle API 3Da basso livello, nel quale
dovete controllare un elenco di vertici e facce, generalmente facendo la
cernita da soli etc. Il rendering è fatto tramite l'"execute
buffers" Immediate Mode che contiene una lista delle istruzioni sul
rendering da dare all'hardware 3D. Il rendering può anche essere
effettuato utilizzando una delle 17 funzioni DrawPrimitive
,
che vi fanno tracciare triangoli etc senza passare per gli execute buffers.
Il Retained Mode è costruito sopra l'Immediate Mode, e copre tantissime
funzionalità in classi per manipolare l scena 3D, gli oggetti 3D,
etc.
Perché l'area attorno la finestra nell'esempio DirectDraw è confusa?
Perché non mi dava fastidio il solid-color-blit del back buffer nero quando lo feci. Accadde che sulla mia macchina era nero, così non feci mai caso al bug. Consideralo un "esercizio".
Quali libri posso raccomandare?
Nessuno, dal momento che non ne ho mai usato uno. Mi dispiace.
Quando finirò il tutorial?
Non sono sicuro di finirlo mai..
Quando metterai il codice di esempio qui?
Smettila di rompere, va bene? :)
Cosa devo fare per iniziare a programmare giochi 3d / grafica 3d?
Presto ci saranno dei link come risposta a questa domanda.
Quale compilatore consiglio?
Quello che preferisci. A me piace Visual C++; ha un IDE veramente carina, un *greande* debugger, e il compilatore è davvero buono. DJGPP è una eccellente opzione per i più poveri: è free.
Posso usare DJGPP con le DirectX?
Penso di si (non ne sono sicuro) ma quando avrò tempo cercherò e metterò qui delle informazioni a riguardo. DJGPP è un compilatore C/C++ free; in questo modo non dovete spendere soldi per un compilatore costoso.
b
Animating
?
E' la Notazione Ungherese. L'idea è di rendere il codice più leggibile includendo il tipo della variabile nel nome, come una b per boolean o un dw per DWORD. In questo modo una variabile booleana indica se il programma sta facendo una animazione sarà bAnimating. "m_" davanti ad una variabile significa 'member'. Ci vogliono solo una o due ore per fare l'abitudine, e realmente rendono il codice più leggibile. Ve le raccomando.
E sulla Collision detection?
C'è un documento piuttosto lungo che tratta la collision detection disponibile da qualche parte. Metterò presto l'URL, appena la troverò.
Video/AVI player con le DirectX?
Ack. Chiedetemelo un'altra volta. Ho ancora gli incubi.
E' un unsigned int
.
Cos'è l'Afx nell' AfxMessageBox?
Penso significhi "application framework" e fa parte delle specifiche MFC.
Non è stupido aver chiamato la funzione che crea sia la primary
che la back surface CreatePrimarySurface
?
Si. Lo cambierò presto, con il nuovo esempio che è in sviluppo.
Qual è il tuo indirizzo e-mail? Posso mandarti posta?
Ad essere proprio onesti, *non* mi piace ricevere email, specialmente una serie di domande noiose. Il mio RSI è abbastanza cattivo così com'è, senza questo lavoro extra da fare. inoltre, non sono proprio capace di rispondere alle email; alcune volte impiego 6 mesi, se mai rispondo. La posta elettronica mi fa schifo.
Da fare: Coding style, Overlays, Lock, enumerating drivers,
enumerating display modes, Cleaning up, Palette, COM Objects, Handling WM_ACTIVATEAPP,
WM_MOVE, WM_PAINT, BltFast, Using GDI sulle superfici DD, Mostrare il frame
rate, semplici tecniche di animazione di bitmap & tecniche tile-based game
in DD, conv3ds e .x files, animazione della telecamera in 3d, matematica 3d
e basi di programmazione 3d, settaggio della finestra in MFC, meshbuilder stuff;
spiegare i driver ramp/RGB/altri, così come caps, in dettaglio; sprites
(decals), Thanks to section; altri compilatori come Borland e Watcom e DJGPP,
OpenGL.
URL of this document: http://www.geocities.com/SoHo/Lofts/2018/djdirectxtut.html
---
Traduzione: Papero - IPG 1999
Eng?Ita! Team
http://www.ItaProGaming.com