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
|