GrafickΘ aplikace ve Visual C++ (6.) V tΘto lekci se posuneme o velk² krok kup°edu, proto₧e vßm ukß₧u zdrojovΘ k≤dy, kterΘ vßm velmi usnadnφ prßci s Direct Draw objekty. VeÜker² k≤d je souΦßstφ SDK. Dßle se blφ₧e podφvßme na funkci Blt(). 6.1.T°φdy CDisplay a CSurfaceBylo napsßno pßr jednoduch²ch funkcφ, kterΘ vßm vÜak velmi usnadnφ ₧ivot s DirectDraw. ZdrojovΘ k≤dy t∞chto funkcφ jsou souΦßstφ SDK, kterΘ jste instalovali na zaΦßtku naÜeho povφdßnφ. KonkrΘtn∞ byste je m∞li najφt v adresß°i SDK na disku. Pokud je tedy chcete pou₧φvat, je asi nejlepÜφ si do projektu zkopφrovat soubory ddutil.h, ddutil.cpp a dxutil.h. Jako celΘ DD i tyto soubory proÜly celkem radikßlnφm v²vojem. Na poΦßtku obsahovaly pouze globßlnφ funkce, nynφ obsahujφ dv∞ t°φdy, kterΘ se kompletn∞ starajφ o grafick² interface a povrchy. Vlo₧te tedy oba soubory do vaÜeho projektu, nejlΘpe ve FileView p°es popup menu, kde vyberte polo₧ku Add files to project. V ClassView by se m∞li objevit dv∞ novΘ t°φdy: CDisplay a CSurface. Aby Üel projekt zkompilovat, musφte vypnout pro soubor ddutil.cpp p°edkompilovanΘ hlaviΦky, nebo do souboru vlo₧it stdafx.h vaÜeho projektu. DoporuΦuji ud∞lat to prvnφ. To ud∞lßte v menu Project Settings..., kde v levΘm okΘnku najdete po₧adovan² soubor a vpravo vyberete druhou kartu, kde zvolφte Precompiled header, kde zvolφte prvnφ volbu Not using precompiled header. Pro snazÜφ orientaci jsem vßm stßhl tento obrßzek:
Nynφ si zkuste, zdali vßm p∙jde projekt zkompilovat.
Cel² systΘm je velice jednoduch². StaΦφ do souboru control.h
vlo₧it hlaviΦkov² soubor ddutil.h a m∙₧ete
zaΦφt. Vlo₧te tedy nßsledujφcφ °ßdek n∞kam na zaΦßtek souboru
control.h: A nynφ ji₧ budete jen mazat k≤d, kter² jsme vytvo°ili v minul²ch lekcφch, proto₧e vÜe obstarß t°φda CDisplay a CSurface. 1. Vytvo°te objekt m_theDisplay (typu CDisplay) ve t°φd∞ CControl. PotΘ vlo₧te do funkce DDInit() volßnφ funkce CreateFullScreenDisplay(), jen₧ je Φlenskß funkce t°φdy CDisplay. Funkce p°ijφmß celkem 4 parametry. za prvΘ je to HANDLE naÜeho okna, kter² p°ijφmß i naÜe funkce DDInit(), dßle jsou to rozm∞ry obrazovky v pixelech, vy m∙₧ete zadat konstanty definovanΘ v²Üe. Jsou to RES_X, RES_Y a RES_BITDEPTH. To je vÜe, zbytek funkce a₧ na poslednφ °ßdek vyma₧te. 2. Vytvo°φme pozadφ. Ve t°φd∞ CControl deklarujte prom∞nnou typu ukazatel CSurface m_surBackground. Ve funkce DDInit() vytvo°te dynamicky objekt CSurface a zavolejte funkci CreateSurfaceFromFile() objektu m_theDisplay. Funkce mß op∞t 4 parametry. Prvnφ je ukazatel na ukazatel na objekt povrchu, druh² je °et∞zec bitmapy, kterß se nahraje do povrchu a poslednφ dva parametry jsou po₧adovanΘ rozm∞ry povrchu, pokud zde zadßte 0, vytvo°φ se povrch o velikosti bitmapy. Dejte pozor aby na konci funkce DDInit() z∙stal °ßdek, kter² aktivuje smyΦku zprßv! Funkce DDInit() vypadß po ·prav∞ takto:
void CControl::UpdateFrame() 6.2 DalÜφ mo₧nosti t°φdy CDisplay6.2.1 PaletaNynφ si povφme n∞co o paletßch. T°φdy CDisplay samoz°ejm∞ podporuje i palety. Nejprve musφte deklarovat objekt LPDIRECTDRAWPALETTE, kter² m∙₧e b²t lokßlnφ. PotΘ zavolßte funkci CreatePaletteFromBitmap(), kterß mß pouze dva parametry. Prvnφ je objekt LPDIRECTDRAWPALETTE, kter² jsme ji₧ deklarovali a druh² je °et∞zec bitmapy, ze kterΘ se paleta vytvo°φ. D∙le₧itΘ je, ₧e funkce vytvo°φ objekt palety podle palety bitmapy a ne podle barev bitmapy! ╚asto se toti₧ stßvß, ₧e si vytvo°φme bitmapu, kterß obsahuje vÜechny barvy, kterΘ pot°ebujeme, ale paleta tΘto bitmapy z∙stane standardnφ tzn. paleta zßkladnφch 256 barev (jako ve Windows). Tak₧e musφte vytvo°it bitmapu v n∞jakΘm externφm rastrovΘm editoru (nap°. Malovßnφ, Photoshop) a ulo₧it s 256 barevnou paletou. Tento externφ editor pak vytvo°φ adaptivnφ paletu, kterß p°esn∞ odpovφdß vaÜφ bitmap∞. Kdy₧ ho pak importujete do Visual C++, m∙₧ete klidn∞ bitmapu palety zmenÜit na 1x1 pixel s libovolnou barvou, aby nezabφral cennΘ kB v .exe souboru. Takovß bitmapa si ovÜem uchovß svojφ paletu (vytvo°enou externφm editorem) a ta se takΘ pou₧ije v naÜφ funkci. Dßle musφte zavolat Φlenskou funkci rozhranφ Nßsleduje jednoduch² p°φklad nastavenφ bitmapy:
Pokud pracujete v 16-bitech (65 tis. barev), je nastavenφ palety zbyteΦnΘ. To
znamenß, ₧e paletu mß smysl nastavovat jen v 8-bitech (256 barev) - ni₧Üφ
barevnou hloubku ani neuvßdφm, kdo by cht∞l pracovat s 16 barvami. Naopak pokud
pracujete v 8-bitech je paleta nutnß, proto₧e jinak se pou₧ijφ zßkladnφ
barvy Windows a bitmapa se dost znehodnotφ (pokud se zrovna netrefφte). 6.2.2. Nastavenφ pr∙hlednΘ barvy neboli nastavenφ Color KeyNastavenφ pr∙hlednΘ barvy je velmi d∙le₧itß vlastnost povrch∙ DirectDraw.
Color key neboli barevn² klφΦ, oznaΦφ barvu v povrchu, kterou nechceme
vykreslovat to znamenß, ₧e v²sledn² obrßzek bude v tomto mφst∞ pr∙hledn².
Color key nastavujete pro ka₧d² vytvo°en² povrch zvlßÜ¥. My zatφm nemßme
₧ßdn² obrßzek, kter² bychom pot°ebovali vykreslovat transparentn∞. Princip
color key spoΦφvß v oznaΦenφ pr∙hlednΘ barvy pomocφ makra RGB. Ve
t°φd∞ CSurface objevφte funkci
SetColorKey(), kterß p°ijφmß jeden parametr prßv∞
jako barvu.
6.3. Funkce Blt()Jist∞ jste si vÜimli, ₧e funkce Blt() je i
ve t°φd∞ CDisplay, to je ale funkce, kterß je
zjednoduÜenß a jen mßlo vyu₧φvß mo₧nosti pravΘ funkce Blt(). O tΘto funkci jsem
se ji₧ n∞kolikrßt zmi≥oval, ale nikdy jsem po°ßdn∞ ne°ekl,
co vÜechno vlastn∞ umφ. U₧ je vßm asi jasnΘ, ₧e slou₧φ ke kopφrovßnφ - blittovßnφ - dat (bit∙) mezi povrchy. V souboru
Jak vidφte mß spoustu parametr∙ a my si je te∩ koneΦn∞ vÜechny probereme.
Funkci vßm osv∞tlφ nßsledujφcφ obrßzek: Tak u₧ je vßm to aspo≥ troÜku jasnΘ? Doufßm, ₧e ano. Nynφ si podrobn∞ vysv∞tlφme poslednφ dva zßhadnΘ parametry. 1. dwFlagsTento parametr m∙₧e nab²vat mnoha hodnot, kterΘ se navφc dajφ kombinovat.
Nßsledujφcφ tabulka vysv∞tlφ, co kterß hodnota d∞lß:
Hodnot je samoz°ejm∞ jeÜt∞ vφc, ale nßm budou tyto bohat∞ staΦit. Hodnoty se
mohou mezi sebou kombinovat pomocφ operßtoru | (nap°. DDBLT_WAIT | DDBLT_COLORFILL).
Na konci tΘto Φßsti bude n∞kolik p°φklad∙, jak je mo₧no pou₧φt uvedenΘ hodnoty.
Druhß struktura ji₧ nenφ tak d∙le₧itß, ale p°esto s jejφ pomocφ m∙₧eme nastavit
zajφmavΘ efekty. 2. lpDDBltFxPrincip pou₧itφ je troÜku odliÜn², proto₧e musφte nejd°φve vytvo°it strukturu
typu DDBLTFX, kterou pak p°edßte funkci
Pokud pou₧φvßme parametr dwDDFX, musφme funkci Pou₧itφ ostatnφch efekt∙ je analogickΘ, p°esto pokud byste m∞li n∞jakΘ
specißlnφ po₧adavky, napiÜte mi. Poznßmka: Pokud nenastavφte color key pro povrch, kter² pak kopφrujete s
parametrem DDBLT_KEYSRC, funkce Poznßmka: Abyste mohli pou₧φt p°φmo tuto funkci s pou₧itφm t°φdy CSurface a CDisplay musφte vyu₧φt funkcφ CSurface::GetDDrawSurface() a CDisplay::GetBackSurface(), kterΘ ob∞ vracφ ukazatele na pravΘ povrchy DirectDraw. 6.3. Zßv∞rA je tu zase konec. Doufßm, ₧e se vßm dneÜnφ lekce lφbila a ₧e vßm p°inesla
zase n∞co novΘho. U₧ jsme se urΦit∞ dostali za p∙lku celΘ teorie DirectDraw.
P°φÜt∞ si vytvo°φme t°φdy CSprite, kterß bude
p°edstavovat jak²koliv kreslen² obrßzek. © 2001 Vogel Publishing, design by ET NETERA
| ||||||||||||||||||||
| ||||||||||||||||||||
|