Kurz2 - Kapitola6

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

4.6 Posun kostek tlačítky

Předpokládám, že se vám podařilo úspěšně vyzkoušet funkci MalujKostku pro animaci - posouvání kostky. Jako další krok můžeme začít hýbat se všemi kostkami.
Pro ovládání programu využijeme klávesy čtyř směrových šipek. I přístroje bez klávesnice mají tyto základní tlačítka instalovány. Ovládání pomocí pera a dotykového displeje by bylo složitější. Budete-li mít chuť, můžete tuto vlastnost do programu doplnit sami :-).
My si pro jednoduchost implementujeme pouze ovládání pomocí šipkových tlačítek. Do funkce WndProc vložte obsluhu zpráv od klávesnice:
case WM_KEYDOWN:
int nPrazdne;
// Zjistim, kde je 0 - prazdne policko
for (nPrazdne=0; nPrazdne<16; nPrazdne++)
if (!nCislo[nPrazdne]) break;
// Novy start mohu provest pokud neni presun v akci
if (! bAkce) {
switch (wParam) {
case VK_UP:
if (nPrazdne<12) {
nPosun=nPrazdne+4;
nYSmer=-1;
nXSmer=0;
bAkce=TRUE;
}
break;
case VK_DOWN:
if (nPrazdne>3) {
nPosun=nPrazdne-4;
nYSmer=1;
nXSmer=0;
bAkce=TRUE;
}
break;
case VK_LEFT:
if ((nPrazdne%4)<3) {
nPosun=nPrazdne+1;
nYSmer=0;
nXSmer=-1;
bAkce=TRUE;
}
break;
case VK_RIGHT:
if ((nPrazdne%4)>0) {
nPosun=nPrazdne-1;
nYSmer=0;
nXSmer=1;
bAkce=TRUE;
}
break;
}
}
break;
Na úvod obsluhy klávesy nejprve jednoduchým postupem zjistíme, kde se nachází prázdné políčko. Přesun kostky je možné zahájit pouze tehdy, když ještě neprobíhá předchozí přesun. Pro každé tlačítko je také kontrolováno, zda nejsme na okraji hracího pole (bohužel :-(, mimo toto pole nelze kostky posouvat). Pokud obě podmínky vyhověly, přesun zahájíme jednoduše nastavením 4 proměnných. Zbytek práce za nás provede obsluha zprávy WM_TIMER.
Pokuste se program přeložit a zkuste kostky rozházet podobně, jako jsem udělal na následujícím obrázku (kostka "12" je zachycena v pohybu):

obr. 42 Posun kostek pomocí tlačítek
V druhé části bychom mohli program doplnit tak, aby byla na závěr ohlášena vítězná pozice.
Test, jestli byl završen poslední vítězný tah, je vhodné vložit do zpracování zprávy WM_TIMER do místa dokončení přesunu kostky. Do bloku příkazů "konce přesunu" doplňte další příkazy:
// Test, zda posun kostky neskoncil
if (nStep==8) {
// Ukoncim posouvani...
nStep=0;bAkce=FALSE;
// ... a prehodim kostky v poli nCislo[]
nCislo[nPosun+4*nYSmer+nXSmer]=nCislo[nPosun];
nCislo[nPosun]=0;
// Test, zda jsem nedokoncil hru
for (i=0; i<16; i++)
if ((i+1)!=nCislo[i]) break;
if (i==15) {
if (IDYES==MessageBox(hWnd,TEXT("Well done! - Next game?"),TEXT("Congratulation!"),MB_YESNO)) {
Michani(1000);
InvalidateRect(hWnd,NULL,TRUE);
SendMessage(hWnd,WM_ERASEBKGND,0,0);
}
else DestroyWindow(hWnd);
}
}
Patrně jste si všimli, že v novém kódu je funkce Michani, která zatím nebyla naprogramována. Vložte její prototyp do místa s prototypy jiných funkcí...
void Michani(int nKolik);
... a na konec souboru Fifteen.cpp si jako úkol do příštího dílu doplníme kostru této funkce:
void Michani(int nKolik)
{
// Funkce pro michani kostek - nKolik urcuje pocet pokusu o presun
}
Nyní již byste měli po dosažení vítězné pozice obdržet hlášení s gratulací:

obr. 43 Dialog ukončení hry

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

  • I u počítačů bez klávesnice lze využít "šipkové" klávesy.
  • Pro odpověď ANO/NE je vhodná funkce MessageBox s parametrem MB_YESNO.
 

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.