GrafickΘ aplikace ve Visual C++ (1.)


1.1. ┌vod do problematiky

Snad ka₧d² programßtor-hrßΦ jednou zatou₧il v∞d∞t, jak se programujφ hry. Jß vßm nevysv∞tlφm p°esn² postup, ale pomohu vßm pochopit zßkladnφ principy programovßnφ 2D grafiky ve Windows pomocφ DirectX. Myslφm, ₧e pokud to s programovßnφm tohoto typu myslφte vß₧n∞, dß vßm tento kurz dobr² zaΦßtek a kdo vφ t°eba jednou budete psßt opravdovΘ hry.

Co musφte znßt abyste mohli zaΦφt programovat?

Abyste mohli ihned zaΦφt psßt k≤d musφte znßt objektovΘ programovßnφ ve Visual C++ tzn. vΦetn∞ zßkladnφch t°φd MFC (Microsft Foundation Class) jako CString, CPoint nebo CRect. Programy se sice dajφ psßt pouze ve Win32, ale k≤d psan² v MFC je sna₧Üφ prßv∞ o v²Üe uvedenΘ t°φdy. Programovat grafiku lze samoz°ejm∞ i v jin²ch jazycφch (nap°. Visual Basic Φi Java), ale myslφm si, ₧e C++ je na programovßnφ grafiky nejlepÜφ, jak kv∙li v²konu, tak kv∙li programßtorskΘ volnosti, kterß t°eba ve Visual Basicu nenφ. Dßle musφte mφt na svΘm poΦφtaΦi nainstalovanΘ Visual C++, minimßln∞ verzi 4.0. NejlepÜφ bude, kdy₧ si koupφte verzi 6.0. Pokud vlastnφte verzi ni₧Üφ m∙₧e se stßt, ₧e k≤d nep∙jde zkompilovat. OΦekßvßm, ₧e mßte alespo≥ zßkladnφ znalosti v²vojovΘho prost°edφ Visual C++, nicmΘn∞ soub∞₧n∞ s tφmto kurzem b∞₧φ i kurz prßv∞ o IDE VC++, kter² vßm m∙₧e pomoci. Samoz°ejm∞ musφte mφt nainstalovanΘ DirectX minimßln∞ verzi 8.0. Zkontrolujte si zda-li mßte na disku tyto soubory : ddraw.dll, dxguid.dll, dxerr8.dll. Jako dalÜφ nadstandardnφ Φßst je pot°eba tzv. DirectX SDK 8.0 (Standard Development Kit). Ve vaÜem prßv∞ naistalovanΘm VC++ je pravd∞podobn∞ verze SDK 1.0 nebo 2.0 (zßle₧φ na verzi VC++). To by nßm sice staΦilo, ale proΦ psßt program pro starou verzi, kdy₧ mßme k dispozici verzi novou! SDK si bu∩ m∙₧ete stßhnout p°φmo od Microsoftu nebo poΦkßte na p°φÜtφ ChipCD, kde (snad) bude k dispozici. Pokud mßte vytßΦenΘ p°ipojenφ p°es modem, m∙₧e tu nastat problΘm, proto₧e SDK mß p°es 40MB (stßhnout se to z vlastnφ zkuÜenosti dß asi za 3 a p∙l hodiny). Po instalaci SDK vßm na poΦφtaΦφ p°ibydou knihovny import∙ pot°ebnΘ pro kompilaci k≤du s DirectX 8.0. Jsou nap°φklad tyto knihovny: ddraw.lib, dxerr8.lib, dxguid.lib a nebo hlaviΦkov² soubor ddraw.h. Uvedl jsem vßm jen ty, kterΘ zatφm budeme pot°ebovat. SDK takΘ obsahuje p°φklady vΦetn∞ zdrojov²ch k≤d∙ a r∙znΘ pom∙cky pro vytvß°enφ multimedißlnφch aplikacφ.

Poznßmka ke kurzu

V kurzu jsou barevn∞ odd∞leny n∞ktrerß klφΦovß slova nap°. t°φda (class) CMainFrame, funkce (function) InitInstance(), prom∞nnß (variable) m_hWnd a soubor (file) ddraw.h. Toto barevnΘ odd∞lenφ jsem zvolil pro vyÜÜφ p°ehlednost v textu a aby bylo na prvnφ pohled vid∞t co je fuknce a co t°φda. Ostatnφ d∙le₧itß slova budou tuΦn∞ nap°. ClassWizard. N∞kterΘ nßzvy budou v kurzφv∞ zvlßÜt∞ jsou-li v textu poprvΘ nap°. MFC a za anglick²m nßzvem bude pokud mo₧no rozepsßno, co nßzev znamenß v ΦeskΘm p°ekladu. U zkratek bude uveden v²znam jednotliv²ch pφsmen nap°. MFC (Microsoft Foundation Class). Funkce poznßte podle zßvorek na konci nßzvu nap°. InitInstance(). Obecn∞ platφ, ₧e p°ed ΦlenskΘ prom∞nnΘ (tzn. jsou deklarovßny uvnit° t°φdy) se dßvajφ znaky m_ (m jako member (Φlen)).

1.2. ZaΦφnßme

1.2.1. GDI versus DirectX

Sna₧ili jste se n∞kdy kreslit do standardnφho okna pomocφ grafickΘho rozhranφ Windows (GDI - Graphics Device Interface) ? Pokud ano, jist∞ dob°e vφte, ₧e slo₧it∞jÜφ scΘny pon∞kud problikßvajφ. Pokud ne, tak to rad∞ji ani nezkouÜejte. Jestli pot°ebujete obΦas nakreslit Φßru nebo obdΘlnφk, pak je samoz°ejm∞ zbyteΦnΘ psßt slo₧it² k≤d DirectX, ale jestli chcete, aby se n∞co opravdu h²balo pak vßm nic jinΘho nezb²vß.

GDI vyu₧φvß tzv. kontext za°φzenφ (DC - device context), co₧ si m∙₧ete p°edstavit jako kousek pam∞ti na vaÜφ grafickΘ kart∞ p°φpadn∞ v RAM. Ka₧dΘ okno ve Windows mß sv∙j kontext za°φzenφ a krom∞ toho m∙₧ete vytvo°it tΘm∞° libovolnΘ mno₧stvφ doΦasn²ch kontext∙ za°φzenφ (vytvo°en²ch podle DC vaÜeho okna v RAM). Do tΘto pam∞ti pak Windows zapisujφ data a vy vidφte nap°φklad Φßru nebo obdΘlnφk na monitoru. Toto opravdu jednoduchΘ °eÜenφ mß, ale jednu zßkladnφ nev²hodu. Jak jist∞ vφte vßÜ monitor se obnovuje mnohokrßt za vte°inu a prßv∞ to je kßmen ·razu, proto₧e Windows mohou zapisovat do DC prßv∞ v okam₧iku, kdy grafickß karta obnovuje obraz a proto monitor zachytφ vykreslovßnφ, kterΘ se projevuje jako problikßvßnφ. Nenφ to v₧dy pravidlem, proto₧e se vykreslovßnφ m∙₧e trefit do kratiΦkΘ doby, kdy se paprsek monitoru p°esouvß z pravΘho dolnφho rohu do levΘho hornφho, ale pravd∞podobnost je velice malß a tak navφc vaÜe aplikace nab²vß dojmu nahodilosti, co₧ nenφ dobrß vlastnost dob°e napsanΘho softwaru. A Φφm je vetÜφ vykreslovanß Φßst, tφm je v∞tÜφ pravd∞podobnost problikßvßnφ. Podrobn∞ji si o GDI povφme v p°φÜtφ lekci, jeliko₧ je dobrΘ znßt, co pou₧φvajφ Windows.

1.2.2. DirectX

Samoz°ejm∞ tohoto jevu jsi byli v²vojß°i Microsoftu dob°e v∞domi a proto vytvo°ili standard DirectX (nebo lΘpe DirectDraw), aby bylo mo₧no programovat nßroΦnΘ grafickΘ aplikace zejmΘna pak hry. DirectX obsahuje mno₧stvφ mocn²ch nßstroj∙ pro tvorbu multimedißlnφch aplikacφ ve Visual C++ p°φpadn∞ Visual Basicu nebo Jav∞.

Co obsahuje DirectX ?

  1. DirectDraw - ve verzi 8.0 DirectDraw zaniklo a nynφ je souΦßstφ Direct3D

  2. Direct3D

  3. DirectSound - i DirectSound je ve verzi 8.0 pod DirectMusic

  4. DirectMusic

  5. DirectInput

  6. DirectPlay
    a dalÜφ...

StruΦn² popis jednotliv²ch komponent

  1. DirectDraw - je soubor t°φd a funkcφ schopnß rychlΘho vykreslovßnφ do grafickΘ pam∞ti a je to prßv∞ ta Φßst, co nßs bude zajφmat. D∙le₧itΘ je, ₧e DirectDraw umφ zobrazovat pouze ve 2D. Ve verzi 8.0 ji₧ DirectDraw neexistuje a bylo spojeno s Direct3D. NicmΘn∞ je stßle pln∞ pou₧itelnΘ, ale vyu₧φvßme DirectDraw verze 7.0. Naproti tomu Direct3D bylo mohutn∞ p°epsßno, tak₧e v n∞m lze vytvß°et i 2D scΘny.

  2. Direct3D - zßkladnφ princip je podobn² s DirectDraw, ale umo₧≥uje modelovßnφ objekt∙ v prostoru tzn. ₧e je 3D. Direct3D jist∞ znßte z her. U d°φv∞jÜφch verzφ D3D si v²vojß°i st∞₧ovali na slo₧itost a neefektivnost k≤du oproti OpenGL, kterΘ bylo mnohem jendoduÜÜφ a tudφ₧ i rychlejÜφ. Ve verzi 8.0 se vÜak v²voja°i Microsoftu plßcli p°es ruce a kompletn∞ D3D p°epsali tak, ₧e se vyrovnß OpenGL (koneΦn∞ n∞co pozitivnφho). O D3D zatφm povφdat nebudu, proto₧e sßm s nφm nemßm ₧ßdnΘ zkuÜenosti (zatφm). Podpora technologie T&L (Transforamtion&Lighting) je samoz°ejmostφ.

  3. DirectSound - jak nßzev napovφdß, DirectSound zab²vß oblastφ zvuku neboli jak relativn∞ jednoduÜe implementovat do vaÜeho programu zvukovou kulisu. Jde to opravdu jednoduÜe. Ve verzi 8.0 je lepÜφ vyu₧φt DirectMusic, kterΘ je jeÜt∞ jednoduÜÜφ.

  4. DirectMusic - tato komponenta p°ibyla do DirectX ve verzi 7.0, kde ovÜem m∞la malou podporu. A₧ nynφ ve verzi 8.0 je schopnß b²t opravdu u₧iteΦnß. M∙₧ete s nφ p°ehrßvat hudbu i zvuky, prost∞ vÜe na co si vzpomenete. Podpora EAX (Enviromental Audio Extension) a 3D zvuku je samoz°ejmostφ.

  5. DirectInput - je souΦßst, kterß pomßhß pou₧φvat ve vaÜφ aplikaci vstupnφ za°φzenφ tzn. klßvesnice, myÜ nebo t°eba joystick. Nenφ na tom nic slo₧itΘho a vytvo°φte tak krßsn² animovan² kurzor, kter² dokonce b∞hß plynule. Touto Φßstφ se budeme zab²vat hned po DirectDraw.

  6. DirectPlay - poslednφ Φßst je pro spojenφ vaÜφ aplikace s jin²m poΦφtaΦem nebo s Internetem (pomocφ protokolu TCP/IP).

Jak jste si jist∞ vÜimli vÜechny komponenty obsahujφ sl∙vko Direct neboli P°φmo, co₧ je p°esn∞ to, co DirectX d∞lß. DirectX toti₧ zapisuje p°φmo do grafickΘ pam∞ti a p°φmo do zvukovΘ pam∞ti atd. DirectX opravdu pracuje na nejni₧Üφ ·rovni tzn. na ·rovni hardwaru a prßv∞ proto je o tolik rychlejÜφ ne₧ GDI. Samoz°ejm∞ DirectDraw mß spoustu dalÜφch fint (nap°φklad double buffering nebo je libo tripple buffering?), jak nejlΘpe vyu₧φt vßÜ hardware.