|
|
DirectX programozása Delphi-ből
DirectX 1. rész
|
|
Példaprogram letöltése
7614 bájt
|
Most induló cikksorozatunkban egy igen nagy témát veszünk szemügyre közelebbről, mely nem más, mint a DirectX használata, lehetőségei. Cikkeink az alapoktól, az első kezdeti lépésektől indulnak, így megértésükhöz elegendő csupán a Delphi ismerete, így bárki nyugodtan nekifoghat a DirectX-szel való ismerkedésnek.
Mielőtt belevágnánk, egy fontos lépést meg kell tennünk: ahhoz, hogy a DirectX-et tudjuk Delphi-ből programozni szükségünk lesz a DirectX DLL-jeiben lévő függvények, interfészek deklarációjára, méghozzá Delphi-ben, vagyis Pascal nyelven. Ha rendelkezünk a Microsoft DirectX SDK-val, akkor ugyan rendelkezésünkre állnak ezek a deklarációk, de csak C nyelven. A probléma leküzdésében nagy segítséget kapunk a http://www.delphi-jedi.org/DelphiGraphics/ web címen (a cikk írásakor a cím még létezett!). Itt találunk egy olyan ingyenesen letölthető ZIP-et, melyben rendelkezésre állnak a DirectX-hez szükséges Delphi-s Pascal állományok. Cikksorozatunk mellékelt példáihoz is ezeket használjuk, de nem mellékeljük őket minden cikkünkhöz, így ezek kipróbálásához is szükséges lesz ezen állományok letöltése.
Szükség van persze még egy fontos előkészítő lépésre: a gépünkre legyen feltelepítve a DirectX.
A cikkek készítésekor a DirectX 8.1-es verziója volt a legfrissebb, így ezt használtuk. A cikkek jellegénél fogva viszont bármely más DirectX verzióval is használhatók a példák, szükség esetén igen kis változtatásokra van csak szükség, például TD3DAdapter_Identifier8 struktúra nevében lévő 8-as szám nyilván más verzióban változik.
A DirectX-ről nagyon sok és hosszú elméleti cikket készíthetnénk, mesélhetnék róla, hogy mi is az, mire jó. Ezt a részt viszont hagyjuk ki és álljunk neki rögtön a gyakorlati példák készítésének. Későbbiek folyamán, amikor szükséges elméleti anyag ismerete az adott probléma megoldásához, akkor ott majd teszünk egy kis kitérőt, most viszont nézzük a gyakorlatot.
A delphi-jedi.org letöltött unit-okat célszerű elhelyezni egy olyan könyvtárba, ahonnan minden projektből elérhetjük azokat. Másoljuk be például a Delphi Lib könyvtárába (C:\Program Files\Borland\Delphi6\Lib).
Amire szükségünk lesz még az az, hogy a saját unit-unkban a DirectXGraphics unit-ra hivatkozzunk.
Ahhoz, hogy saját alkalmazásunk kapcsolatot létesítsen a DirectX-szel, szükségünk lesz egy IDirect3D8 interfészre.
Első példánkban csupán annyit teszünk, hogy a kapcsolat létrehozása után lekérdezzük az aktuális képernyő felbontást és még egy-két jellemző adatot. Ehhez szükségünk lesz egy TD3DDisplayMode típusú struktúrára.
FDisplayMode: TD3DDisplayMode;
A lekérdezést a Button1 OnClick-nél végezzük el.
procedure TForm1.Button1Click(Sender: TObject);
begin
Kapcsolatot a Direct3DCreate8 függvény meghívásával tudunk létrehozni. Ez elvégzi helyettünk a szükséges műveleteket, majd visszatérési értékként egy IDirect3D8 interfészt ad, amennyiben az inicializálás sikeres volt.
FD3D:=Direct3DCreate8(D3D_SDK_VERSION);
Ezt célszerű is ellenőriznünk, mivel hiba esetén amúgy sem tudjuk a DirectX-et programozni. Ha a Direct3DCreate8 függvény null értéket ad vissza, akkor hiba történt a DirectX inicializálása közben, így nem tudjuk azt használni.
if Assigned(FD3D) then begin
Az IDirect3D8 interfész rendelkezik egy GetAdapterDisplayMode függvénnyel. Ennek segítségével kérdezhetjük le a számítógépben lévő monitorkártyák információit. Első paraméterként egy számot kell megadni, mely a monitorkártya sorszámára utal. Ha itt a D3DADAPTER_DEFAULT konstanst használjuk, akkor az elsődleges monitorkártya adatait kapjuk meg. Hogy hány monitorkártya van a gépben, azt a GetAdapterCount függvény adja meg. Második paraméterként egy TD3DDisplayMode típusú változót kell megadni, melyben az eredményt kapjuk vissza.
if not Failed(FD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, FDisplayMode)) then begin
Ha a lekérdezés sikeres volt, akkor már csak a TD3DDisplayMode struktúra adatait kell értelmeznünk. A Width és Height mezőből megtudjuk a képernyő aktuális méretét pixelben.
ListBox1.Items.Add('DisplayMode.Width: '+IntToStr(FDisplayMode.Width));
ListBox1.Items.Add('DisplayMode.Height: '+IntToStr(FDisplayMode.Height));
A RefreshRate a képernyő frissítési frekvenciáját adja meg Hz-ben.
ListBox1.Items.Add('DisplayMode.RefreshRate: '+IntToStr(FDisplayMode.RefreshRate));
Végül a Format-ból megtudhatjuk a színmélységgel kapcsolatos információt. Ha például 32 bites színmélységet állítunk be, akkor a visszatérési érték 22 lesz, mely a D3DFMT_X8R8G8B8 konstansnak felel meg, amiből viszont következik, hogy egy olyan 32-bit RGB pixel forma áll rendelkezésünkre, melynél 8 bit van fenntartva minden szín csatornához. Az itt található értékekhez tartozó konstansokat az alábbi táblázat foglalja össze.
ListBox1.Items.Add('DisplayMode.Format: '+IntToStr(FDisplayMode.Format));
end;
end;
end;
D3DFMT_UNKNOWN 0
D3DFMT_R8G8B8 20
D3DFMT_A8R8G8B8 21
D3DFMT_X8R8G8B8 22
D3DFMT_R5G6B5 23
D3DFMT_X1R5G5B5 24
D3DFMT_A1R5G5B5 25
D3DFMT_A4R4G4B4 26
D3DFMT_R3G3B2 27
D3DFMT_A8 28
D3DFMT_A8R3G3B2 29
D3DFMT_X4R4G4B4 30
D3DFMT_A2B10G10R10 31
D3DFMT_G16R16 34
D3DFMT_A8P8 40
D3DFMT_P8 41
D3DFMT_L8 50
D3DFMT_A8L8 51
D3DFMT_A4L4 52
D3DFMT_V8U8 60
D3DFMT_L6V5U5 61
D3DFMT_X8L8V8U8 62
D3DFMT_Q8W8V8U8 63
D3DFMT_V16U16 64
D3DFMT_W11V11U10 65
D3DFMT_A2W10V10U10 67
D3DFMT_D16_LOCKABLE 70
D3DFMT_D32 71
D3DFMT_D15S1 73
D3DFMT_D24S8 75
D3DFMT_D16 80
D3DFMT_D24X8 77
D3DFMT_D24X4S4 79
D3DFMT_VERTEXDATA 100
D3DFMT_INDEX16 101
D3DFMT_INDEX32 102
D3DFMT_FORCE_DWORD 0xFFFFFFFF
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 547. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|