Kurz2 - Kapitola4

17. června 2007 v 16:01 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

4.4 Funkce vykreslení kostky

Samotná kostka vytvořená v prvním dílu by nám nebyla příliš užitečná. Se znalostmi získanými v minulém dílu si proto vytvoříme funkci, která bude vykreslovat konkrétní kostku na přesně zadané pozici. Současně by se měla postarat o smazání zbytků minulé polohy kostky. Úkolem tedy bude zobrazení požadovaných kroků animace kostky při jejím pohybu.
Přípravy zahájíme zadáním počtu kroků (políček filmu), které se přehrají při posunu na novou pozici. V našem případě je 8 kroků dostatečné, vložíme tedy na úvod souboru definici konstanty:
#define KROKY 8
Vytvoříme si funkci, která bude vykreslovat kostku požadovaného čísla na dané pozici včetně "úklidu" zbytků předcházející kostky. Vložte na úvod programu prototyp kreslící funkce:
void MalujKostku(HDC hDC, int nNum, POINT ptPoz, int nX, int nY);
Jejími parametry budou:
  • - HDC hDC - handle DC, do kterého kreslíme
  • - int nNum - číslo na kostce
  • - POINT ptPoz - levý horní bod kam kostku nakreslit - "základna"
  • - int nX - směr posunu kostky ve směru X
  • - int nY - směr posunu kostky ve směru Y
Za upřesnění stojí pouze proměnné nX a nY. Jsou typu int a měly by nabývat pouze 3 možné hodnoty. Např. u nX znamená -1 pohyb vlevo, 1 pohyb vpravo a 0 statickou pozici na daném místě.
Vlastní funkce pro vykreslení kostky na displej bude trochu obsáhlejší. Můžete ji umístit např. na konec souboru Fifteen.cpp:
void MalujKostku(HDC hDC, int nNum, POINT ptPoz, int nX, int nY)
{
HBITMAP hBitmapa; // Pomocna bitmapa, do ktere maluju
HDC hDCAux; // Handle pomocneho DC
int nDelka; // Pocet znaku napisu na kostce
RECT rtKos, rtVyr; // Obdelniky vyrezu a umisteni kostky
TCHAR szTextKostky[MAX_LOADSTRING]; // Text zobrazeny na kostce

// Kostku ma vyznam malovat, kdyz ma na sobe cislo
if (nNum) {
// Urcim si obdelnik vyrezu a take obdelnik, kde se v nem nachazi kostka
rtKos.top=0;rtKos.left=0; rtKos.bottom=cyBitmap; rtKos.right=cxBitmap;
// Nejprve predpokladam staticke vykresleni Kosta=Vyrez
rtVyr=rtKos;
// Je-li posun ve smeru X zvetsim vyrez a posunu kostku
if (nX != 0) {
rtVyr.right += cxBitmap/KROKY;
if (nX > 0) {
rtKos.left += cxBitmap/KROKY;
rtKos.right += cxBitmap/KROKY;
}
}
// Je-li posun ve smeru Y zvetsim vyrez a posunu kostku
if (nY != 0) {
rtVyr.bottom += cyBitmap/KROKY;
if (nY > 0) {
rtKos.top += cyBitmap/KROKY;
rtKos.bottom += cyBitmap/KROKY;
}
}
// Vytvorim si pomocne DC - je velke pouze 1x1 bod
hDCAux = CreateCompatibleDC(hDC);
// Vytvorim pomocnou bitmapu a vlozim ji do pomocneh DC - tim se zvetsi
hBitmapa=CreateCompatibleBitmap(hDC,rtVyr.right,rtVyr.bottom);
SelectObject(hDCAux,hBitmapa);
// Vyplnim vse pozadim
FillRect(hDCAux,&rtVyr,hPozadi);
// Pomoci TransparentImage zkopiruji kostku na pozici
TransparentImage(hDCAux,rtKos.left,rtKos.top,cxBitmap,cyBitmap,
hKostka,0,0,cxBitmap,cyBitmap,RGB(0,0,0));
// A zbyva zapsat cislici na kostku
SetBkMode(hDCAux,TRANSPARENT);
nDelka = (nNum>9) ? 2 : 1;
wsprintf (szTextKostky, TEXT ("%d"), nNum);
DrawText(hDCAux,szTextKostky,nDelka,&rtKos,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// Mam vse pripraveno, mohu prenest na obrazovku
BitBlt(hDC,ptPoz.x-rtKos.left,ptPoz.y-rtKos.top,rtVyr.right,rtVyr.bottom,hDCAux,0,0,SRCCOPY);
// A zrusim, co jsem pouzil (nejdrive DC, protoze nemuzu rusit bitmapu vybranou do DC)
DeleteDC(hDCAux);
DeleteObject(hBitmapa);
}
}
Funkce MalujKostku je sice větší než obvyklé úpravy, které v našich lekcích provádíme, ale měla by být pomocí vložených komentářů čitelná. První část určuje velikost překreslovaného obdélníku a v jeho rámci je umístěna vlastní kostka. V další části je přepsaný postup z předcházejícího dílu.
Abychom mohli provedené úpravy otestovat, opět změníme zpracování zprávy WM_PAINT tak, aby volala pro vykreslení kostek naši novou funkci.
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
for(i=0;i<16;i++)
MalujKostku(hdc,nCislo[i],ptUmisteni[i],0,0);
EndPaint(hWnd, &ps);
break;
Po přeložení by měl být výsledek takový jako je na následujícím obrázku:

obr. 41 Herní pole se všemi očíslovanými kostkami
Poznamenejme, že v uvedené funkci je použito přednastaveného fontu písma. Pro případnou změnu byste si museli písmo upravit podle vlastního výtvarného cítění.

Co bychom si měli z této lekce zapamatovat?

  • Kompatibilní DC v paměti vytvoříme pomocí CreateCompatibleDC.
  • Vytvořené DC je velké 1x1 bod
  • Větší bitmapu vytvoříme CreateCompatibleBitmap.
  • Před zrušením bitmapy je nutné nejdříve zrušit DC!
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.