Elikkäs mitenkä tunnistan kahden eri napin painamisen yhtä aikaa?
SDL_Event tapahtuma; while (true) { SDL_PollEvent(&tapahtuma); if (tapahtuma.key.keysym.sym == SDLK_RCTRL) { /* tee jotain */ } if (tapahtuma.key.keysym.sym == SDLK_LCTRL) { /* tee jotain */ } }
Tässähän tapahtuma.key.keysym.sym voi sisältää vain yhden näppäimen.
Googlella löyty tämmöstä: http://gpwiki.org/index.php/SDL:Tutorials:
Eli jotenkin näin:
SDL_Event tapahtuma; // Tieto, onko pohjassa bool lctrl = false; bool rctrl = false; while (SDL_PollEvent(&tapahtuma)) { switch(tapahtuma.type){ case SDL_KEYDOWN: switch(tapahtuma.key.keysym.sym){ case SDLK_LCTRL: lctrl = true; break; case SDLK_RCTRL: rctrl = true; break; default: break; } case SDL_KEYUP: switch(tapahtuma.key.keysym.sym){ case SDLK_LCTRL: lctrl = false; break; case SDLK_RCTRL: rctrl = false; break; default: break; } } } if ( lctrl && rctrl ) { // Molemmat pohjassa. // Tehdään jotain. }
Yksi break tuonne vielä KEYDOWN- ja KEYUP-tapausten väliin.
Ohjelmassani on tällaista koodia, joka mielestäni tarkistaa nuo samat asiat kuin TsaTsaTsaan kirjoittama koodi, eikä toimi:
bool painettu_1 = false; bool painettu_2 = false; while (true) { SDL_PollEvent(&tapahtuma); if (tapahtuma.type == SDL_KEYDOWN) { if (tapahtuma.key.keysym.sym == SDLK_RCTRL && !painettu_1) { painettu_1 = true; plr2.menetahp(1); } if (tapahtuma.key.keysym.sym == SDLK_LCTRL && !painettu_2) { painettu_2 = true; plr1.menetahp(1); } } if (painettu_1) { // plr1:n lyömisanimaatio } if (painettu_2) { // plr2:n lyömisanimaatio } if (tapahtuma.type == SDL_KEYUP) { if (tapahtuma.key.keysym.sym == SDLK_RCTRL) { painettu_1 = false; } if (tapahtuma.key.keysym.sym == SDLK_LCTRL) { painettu_2 = false; } } }
Koitappa ottaa tuolta KEYDOWN:in puolelta iffeistä pois nuo jälkimmäiset ehdot, jos se jotakin vaikuttaisi. Ainakin ne ovat ihan turhat.
Lisäys: Siis ne (&& !painettu)-hommat.
painettu-hommat eivät ole turhia, koska jos näppäintä pitää pohjassa, plr1 menettää hp:tä koko ajan. Pelin ideana onkin näpyttää oikeata ja vasenta CTRL:ää.
edit: siis eihän pelkästään plr1 menetä hp:tä. Voihan se olla plr2.
Laitat sen HP:n menetyksen lyöntianimaatioon silloin kun nyrkki nasahtaa naamaan.
Ja miten tuo ei toimi?
Niin ja jos nappia vain näpyttää, ei animaatiota pahemmin pääse tapahtumaan, jos se on toteutettu niinkuin kuvittelen.
Siis kun vasenta CTRL:ää pidetään pohjassa, ohjelma ei reagoi mitenkään oikean CTRL:n paineluun.
Ja tuo löymisanimaatio on tehty siis tähän tyyliin:
if (painettu_1) PiirraKuva(kasi1, naytto, (KUVA_LEVEYS-vartalo1->w)/2-vartalo1->w*1.25+15, (KUVA_KORKEUS-vartalo1->h)/2+vartalo1->h/2-30); if (!painettu_1) PiirraKuva(kasi1, naytto, (KUVA_LEVEYS-vartalo1->w)/2-vartalo1->w*1.25+25, (KUVA_KORKEUS-vartalo1->h)/2+vartalo1->h/2-30);
... ja sama painettu_2 kanssa ja kuva piirretään eri kohtaan.
Eli käsi vain liikkuu eri kohtaan riippuen, onko nappi painettuna vai ei.
Minulla oli joskus vastaava ongelma kun testailin SDL:lää ja tein ankantappopelin, jossa ukkoa liikuteltiin nuolilla ja se liikkuu nopeammin shifti pohjassa. Windowsin puolella se toimi ihan oikein, mutta linuxilla se shifti ei oikein fiksusti reagoi. En sitä pahemmin ole yrittänytkään korjata, joten en siihen osaa mitään sanoa.
Eikös tää toimis.
Ei jaksa ny testata ku potuttaa aikas paljon ja nukkumaanki pitäs mennä.
Uint8* nappi; bool paina=false; ... nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_LCTRL] && nappi[SDLK_RCTRL] && !paina) { paina=true; /* omaa koodia... */ } else if(!(nappi[SDLK_LCTRL] && nappi[SDLK_RCTRL])) paina=false;
Itsekin olisin ehdottanut saman tyylistä ratkaisua kuin Lahha. Tuon SDL_GetKeyState():n voisi laittaa myös SDL_KEYDOWN-caseen, jos siitä saa lisäarvoa.
No toihan vaikuttaa aikas pätevältä. Pitää panna korvan taakse tulevaisuuden varalta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.