LECKÉK:              

Saját ablak
Directdraw1
Directdraw2
Directdraw_3
Sprite_1

Sprite 2
Billentyű_1
Billentyű_2
Egér
Joystick
Midi
MP3
Wav
Filekezelés
 

Üdvözöllek!

A legjobb, ha másolatot készítesz a projectről! Mert a következő leckében innen folytatjuk.
A mostani leckében a billentyűzet kezeléséről lesz szó. Kétféleképpen oldható meg:
Az egyik, hogy a main .cpp -ben a visszatérési függvényben 
LRESULT CALLBACK WindowProcedure (......) már eleve ott van a billentyű üzenet. Ezt fogjuk most haszálni.
A másik pedig egy directx-es input objektumot kell létrehozni. Ez lehet billentyűzet,egér, joystick.
ez pedig a következő leckék.
Joystick-ot még nem próbáltam,de azért megpróbálom. Most a billentyűzet.
A lenyomott billentyű ascII kódja a KEYDOWN wParam változójában van,csak ezt kell átadni a sprite osztálynak,a bábu irányítására. Azonban ez sem ilyen egyszerű,mert a billentyű leütés esemény azonnal bekövetkezik,de az ismétlések nem rendszeresek, tehát a bábunk megindul,megakad,és meint megindul. Ez bizony nem előny a látványban. Kiküszöbölésére egy logikai tömböt hozunk létre, és hozzárendeljük az egyes billentyűket. Ha bill. lenyomás esemény akkor true, ha felengdjük azt a billentyűt, akkor billentyű felengedése esemény false -ra állítja a tömbelemet.A sprite osztály ezek után bármikor kérdezi a billenyű tömböt, mindig aktuális értéket kap vissza.
Sprite .hpp ban  a protected alá vegyél fel egy öt elemű logikai tömböt:
bool keystatus[5];
ezt a tömböt a konstruktorban inicializálni kell:
SPRITE::SPRITE()
{
for(int i=0;i<5;i++){keystatus[i]=false;}
}
A két függvény dekralációja ami beleír ebbe a tömbbe:
public:
void bill_le(char);
void bill_fel(char);

a megvalósítása:
static char billkod[]={37,38,39,40,32}; //mivel függvényenkívül van, látja más függvény is ezek a figyelt billentyűk kurzornyilak és space
void SPRITE::bill_le(char bill)
{
for(int i=0;i<5;i++){ if(bill==billkod[i])keystatus[i]=true;}
}
/**/
void SPRITE::bill_fel(char bill)
{
for(int i=0;i<5;i++){ if(bill==billkod[i])keystatus[i]=false;}
}
/**/

egyenlőre a demohoz írd be a frissit () függvénybe:


rajz.kiirbetu("10.sprite y",10,50);rajz.kiirszam(sp[9].SP_X,100,50);
/**/
if(keystatus[0])rajz.kiirbetu("bal nyíl",10,70);
if(keystatus[1])rajz.kiirbetu("fel nyíl",10,90);
if(keystatus[2])rajz.kiirbetu("jobb nyíl",10,110);
if(keystatus[3])rajz.kiirbetu("le nyíl",10,130);
if(keystatus[4])rajz.kiirbetu("space ",10,150);
/**/

rajz.flip();

A main. cpp -ben módosítsuk a visszatérési függvényt:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* vizsgáljuk az üzenet tipusát */
{
case WM_KEYDOWN:
sprite.bill_le(wParam);
switch(wParam)
{
case VK_ESCAPE:fut=!fut;break;

}
break;
case WM_KEYUP:
sprite.bill_fel(wParam);break;

......
......

Fordít futtat.....

A billentyűzet most már működik, mint látható. Csak 3 billentyűt figyel egyszerre a windows,de ez nem zavaró a játék alatt. A mozgatáshoz egy egyszerű függvényt kell dekralálni a neve:

Sprite.hpp:
 void babu_mozgat();
Megvalósítás:

void SPRITE::babu_mozgat()
{
int sebesseg =3; //elmozdulás sebessége
if(!keystatus[0] & keystatus[2])//ha a bal nincs lenyomva,de a jobb igen
{
if( sp[0].SP_X < (800-18-sebesseg))sp[0].SP_X+=sebesseg;
}
if(keystatus[0] & !keystatus[2])//ha a jobb nincs lenyomva,de a bal igen
{
if( sp[0].SP_X > (0+sebesseg))sp[0].SP_X-=sebesseg;
}
if(!keystatus[1] & keystatus[3])//ha a fel nincs lenyomva,de a le igen
{
if( sp[0].SP_Y < (600-18-sebesseg))sp[0].SP_Y+=sebesseg;
}
if(keystatus[1] & !keystatus[3])//ha a le nincs lenyomva,de a fel igen
{
if( sp[0].SP_Y > (0+sebesseg))sp[0].SP_Y-=sebesseg;
}
}


Persze ezt a függvényt is be kell tenni a frissit() -be:

.......
anim();
sp_mozgat();
babu_mozgat();
}

Fordít  futtat. Látható, hogy az egyes dolgok a programban jól szétválaszthatóak,és nem keveredhetünk semmilyen káoszba a programozás során. Ha valami nem stimmel,akkor a gyanús változót bármikor kiírattathatjuk a képernyőre....

A következőben visszaállítjuk a billenyűkezelést,és irunk másikat, amolyan dx-eset.

itt a kód:

vissza