Grafické aplikace ve Visual C++ (3.) V této lekci si konečně povíme o základních pojmech a principech DirectDraw. V první části si rozebereme důležité pojmy jako jsou například povrchy (surfaces) a v druhé části vám vysvětlím, jak vlastně DirectDraw pracuje. Nakonec si ukážeme konkretní příklad, jak vytvořit objekt DirectDraw a nastavíme další vlastnosti aplikace. Popisuju zde jen režim fullscreen (celoobrazovkový režim), ale DirectDraw samozřejmě pracuje i v okně. 3.1. Základní pojmyZákladem každé aplikace založené na principu DirectDraw je jeden objekt typu IDirectDraw7 (je to vlastně ukazatel na rozhraní COM), pomocí kterého vytvoříte všechny ostatní objekty potřebné pro kreslení apod. Takže první, co musíte udělat je, že vytvoříte tento objekt. Sprite je vlastně vámi vykreslovaný obrázek. Sprite je většinou vytvořen z bitmapy, kterou načtete z externího souboru. Pokud budete mít pohybující se letadlo, právě letadlo bude sprite. Další velmi důležitou součástí je tzv. povrch (surface). Povrch je vlastně buffer tzn. kousek paměti, buď ve video paměti nebo v systémové RAM. Je to něco podobného jako kontext zařízení (DC - viz minulá lekce). Do tohoto bufferu zapisujete data, které posléze vidíte na monitoru v podobě obrázku. Pokud budete používat 8-bitovou barevnou hloubku tzn. 256 barev, měli byste vytvořit objekt palety. Pak je tento objekt velice důležitý, jinak se bitmapy zobrazí chybně (mají proházené barvy a některé barvy dokonce chybí). Program, který pracuje v 16-bitech (65 tisíc barev) žádnou paletu nepotřebuje, ale běží pomaleji, takže pokud nevlastníte moc vykonný počítač doporučuji používat 8-bitů. Dalším užitečným objektem je tzv. clipper. Abyste pochopili jak pracuje musíte znát následující látku. Prozatím vám musí stačit, že zajišťuje tzv. clipping, což už jste možná slyšeli. Jednoduše řečeno Clipper zabraňuje vykreslování spritů mimo monitor. 3.2. Základní principy DirectDrawJak jsem se již zmínil DirectDraw, dokáže vykreslovat pouze ve 2D tzn., že všechny povrchy jsou ploché (mají dvě souřadnice x a y). Bitové kopírování mezi povrchy, což je vlastně kopírování jednotlivých bitů vašich bitmap, se v terminologii DirectDraw nazývá blitting (bit block transfer - přenos bloku bitů). Máme dva základní povrchy :
Front surface (přední povrch) je, jak napovídá název, ten povrch, který je právě vidět na monitoru. Back surface (zadní povrch) je ukryt někde v paměti jakoby za FS. Důležité je, že vždy zapisujete jen do BS nikdy do FS. Kdybyste totiž zapisovali do FS přímo, docílili byste podobného efektu jako u GDI.
Takže vy zapíšete nějaké data do BS, ale co dál? Tomuto systému prohazování povrchů se říká flipping. Flipping totiž prohazuje ukazatele na oba povrchy a nepoužívá běžný blitting, který se používá pro přenos bitů mezi povrchy a který je časově mnohem náročnější. Velikost těchto dvou bufferů záleží na rozlišení, které právě používáte. Tyto buffery se zásadně vytváří ve video paměti, která je rychlejší než systémová RAM, zvláště u moderních grafických karet. Dále si většinou vytváříte tzv. OffScreen surfaces, což jsou povrchy, které jsou mimo flipovací smyčku. Tyto povrchy používáme pro bitmapy, které teprve budeme chtít zobrazit tzn. jako pomocné buffery. Z těchto povrchů se pak blitují data do BS. Tyto buffery se vytvářejí v RAM a tudíž mohou být větší než FS a BS. Ve skutečnosti se vám nepodaří ve video paměti vytvořit buffer, který je větší než FS. Ledaže máte grafickou kartu, která má hodně paměti a podporuje funkci Wide surfaces (široké povrchy).
Celý systém vypadá následovně : Pokud budete mít rozlišení 640x480 a 8-bitů barev (256 barev) FS vám zabere přesně 640 x 480 (plus nějaké informace o povrchu), což je asi 300 kB paměti tzn. že když vytvoříte FS a BS musíte mít alespoň 600 kB video paměti na grafické kartě. Pokud tomu tak není, budete muset vytvořit BS v RAM, ale to se silně nedoporučuje. Samozřejmě pokud zvýšíte rozlišení nebo hloubku barev, paměťové nároky se rovněž zvýší, takže na to pozor. Dnešní grafické karty mívají běžně alespoň 16 MB paměti a tam se vám to vejde s přehledem. Dále je možno vytvořit více BS například dva, pak se systému říká Triple buffering (máme celkem tři buffery : dva back + jeden front) a to už jste určitě slyšeli. Každá aplikace DirectDraw pracuje tak, že se snaží prohazovat oba povrchy jak nejrychleji to jde a přitom se občas něco zapíše do BS. Prohazovací funkce čeká až se dokreslí všechny blittovací operace, takže se nemusíte bát, že by se něco nedokreslilo nebo snad dokonce problikávalo! Čím více toho vykreslujete, tím je prohazování pomalejší.
Jak ale zařídit toto rychlé prohazování? 3.3. Objekt DirectDraw
Takže teď již víme, že každá
aplikace založená na DirectDraw má jeden objekt
typu Poznámka: Pro níže uvedenený kód musíte mít nainstalované DirectX SDK 8.0, které bylo na řijnovém ChipCD. Dále zkontrolujte v Options VC++, že na kartě Directories, je cesta k hlavičkovým souborům naistalovaného SDK, pokud ne, musíte položku přidat sami. Nyní můžeme použít globální funkci DirectDrawCreateEx() k vytvoření objektu DirectDraw.
Funkce má následující deklaraci :
HRESULT DirectDrawCreateEx( GUID FAR *lpGUID, LPVOID *lplpDD, REFIID iid, IUnknown FAR *pUnkOuter );
3.4. Nastavení dalších vlastností aplikace
Pomocí ukazatele na objekt DirectDraw nastavíme, jak se bude naše
aplikace chovat vůči jiným programům Windows a
jaké rozlišení a hloubku barev budeme používat.
HRESULT SetDisplayMode(DWORD dwWidth,
Tato funkce má pět parametrů:
3.5. Příklad
Nyní dáme všechny nové poznatky dohromady.
Ve třetím kurzu o VC++ jste vytvořili třídu CControl, kde vytvořte členskou funkci třeba
4 . Závěr
Aplikace z dnešní lekce akorát přepne rozlišení, nic víc.
Přístě si vytvoříme front a back buffer a vytvoříme flipovací smyčku.
|
|
© 2001
Vogel Publishing,
design by
ET NETERA