GrafickΘ aplikace ve Visual C++ (4.)
V dneÜnφ lekci si koneΦn∞ vytvo°φme p°ednφ a zadnφ buffer a ukß₧eme si,
jak p°epsat funkci Run() tak, aby prohazovala oba povrchy. V²sledkem aplikace
nebude nic sv∞tobornΘho, proto₧e oba povrchy budou prßzdnΘ, ale i tak se
posuneme o notn² kus dßl. 4.2. Vytvo°enφ p°ednφho a zadnφho bufferu
Minule jsme si °φkali, ₧e zapisujeme data pouze do zadnφho bufferu
(back buffer) tzn. ₧e musφme zφskat ukazatel na tento buffer. Aby jsme tento
ukazatel mohli zφskat musφme nejd°φve vytvo°it p°ednφ buffer
(front buffer), proto₧e zadnφ je souΦßst tzv. flipovacφ smyΦky
nebo takΘ °et∞zce (flipping chain). DirectDraw poskytuje funkci
HRESULT CreateSurface( LPDDSURFACEDESC lpDDSurfaceDesc, Tato funkce mß t°i nßsledujφcφ parametry :
DD_OK pokud je ·sp∞Ünß jinak n∞kterou z nßvratov²ch hodnot DirectDraw.Struktura DDSURFACEDESC2Tato struktura popisuje vlastnosti novΘho povrch. A¥ u₧ vytvß°φte p°ednφ, Φi pomocn² buffer, budete ji vyu₧φvat. Obsahuje mnoho atribut∙, ale my jich zatφm vyu₧ijeme jen mßlo. Zde p°edklßdßm ty nejd∙le₧it∞jÜφ:
P°φklad vytvo°enφ p°ednφho bufferuDo t°φdy CControl p°idejte dv∞ ΦlenskΘ prom∞nnΘ typu LPDIRECTDRAWSURFACE7 (IDirectDrawSurface7), jednu pojmenujte m_lpDDSFront a druhou m_lpDDSBack. Budou p°edstavovat ukazatele na p°ednφ a zadnφ povrch. Pomocφ t∞chto ukazatel∙ budete pracovat s povrchy.Dßle p°idejte nßsledujφcφ k≤d do funkce DDInit().
Nynφ mßme ukazatel na p°ednφ buffer : m_lpDDSPrimary
Postup :
K zφskßnφ ukazatele na zadnφ buffer je zde ovÜem jinß funkce, kterß poΦφtß s tφm, ₧e je zadnφ buffer ve flippovacφ smyΦce :
HRESULT GetAttachedSurface( LPDDSCAPS2 lpDDSCaps,
D∙le₧itΘ je, ₧e tato funkce je Φlenskß funkce rozhranφ IDirectDrawSurface7 a nikoliv (jak tomu bylo dosud)
IDirectDraw7 .P°φklad vytvo°enφ zadnφho bufferu
DDSCAPS2 ddscaps;
Postup :
4.2. P°epsßnφ funkce Run()
Minule jsme si ve t°φd∞ aplikace (CDirectDrawApp) p°ipravili funkci
Run(). V dneÜnφ lekci ji upravφme tak, aby volala funkci
UpdateFrame()
t°φdy CControl, kdy₧ smyΦka zprßv nep°ijφmß ₧ßdnΘ zprßvy.
Objekt CControl mßte vytvo°en² bu∩ p°φmo jako Φlenskou prom∞nnou
ve t°φd∞ aplikace nebo ji m∙₧ete vytvo°it
globßln∞ a funkci UpdateFrame() vytvo°it takΘ jako globßlnφ
funkci.
PotΘ bude vypadat funkce
int CDirectDrawApp::Run()
Nesmφte zapomenout vymazat p∙vodnφ jeden °ßdek tΘto funkce. Funkce nynφ bude volat funkci UpdateFrame()
jak nejrychleji to p∙jde û pokud nemß co na prßci.4.3. Funkce UpdateFrame()Jako poslednφ v tΘto lekci jeÜt∞ n∞co napφÜeme do funkce UpdateFrame() , aby se povrchy skuteΦn∞ prohazovaly.
void CControl::UpdateFrame()
Zatφm zde nemßme ₧ßdnΘ ochrany proti ztracenφ povrchu atd. Druh² parametr funkce Flip() znamenß,
₧e funkce poΦkß a₧ se ostatnφ blitovacφ akce dokonΦφ. P°φÜt∞ funkci dßle rozÜφ°φme.4.4. Zßv∞r
Pokud dneÜnφ aplikaci zkompilujete, m∞lo
by se vßm p°epnout rozliÜenφ a obrazovka je zatφm bφlß.
Prohazovßnφ povrch∙ probφhß, ale nenφ vid∞t jeliko₧ majφ
oba buffery stejn² obsah. N∞kdy se m∙₧e stßt, ₧e v zadnφm
bufferu zbudou n∞jakΘ zbytky oken z Windows, proto₧e p°i
vytvß°enφ povrchu se m∙₧e alokovat pam∞¥, kterou p°edtφm
pou₧φvaly Windows a nechaly ji "prasßcky" nevymazanou.
P°φÜt∞ si vytvo°φme pomocnΘ buffery (off-screen surfaces) v systΘmovΘ pam∞ti,
do kter²ch ulo₧φme bitmapy, kterΘ potom budeme vykreslovat do zadnφho bufferu. |
|
© 2001 Vogel Publishing, design by ET NETERA