Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL:llä kahden napin tunnistus

Sivun loppuun

Resiina [17.04.2007 21:57:00]

#

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.

TsaTsaTsaa [17.04.2007 22:09:11]

#

Googlella löyty tämmöstä: http://gpwiki.org/index.php/SDL:Tutorials:Practical_Keyboard_Input

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.
}

Metabolix [17.04.2007 22:16:10]

#

Yksi break tuonne vielä KEYDOWN- ja KEYUP-tapausten väliin.

Resiina [17.04.2007 22:54:53]

#

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;
    }
  }
}

TsaTsaTsaa [17.04.2007 23:00:43]

#

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.

Resiina [17.04.2007 23:03:48]

#

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.

TsaTsaTsaa [17.04.2007 23:05:49]

#

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.

Resiina [17.04.2007 23:11:24]

#

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.

TsaTsaTsaa [17.04.2007 23:16:03]

#

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.

Lahha [17.04.2007 23:45:41]

#

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;

Grusifix [18.04.2007 09:45:41]

#

Itsekin olisin ehdottanut saman tyylistä ratkaisua kuin Lahha. Tuon SDL_GetKeyState():n voisi laittaa myös SDL_KEYDOWN-caseen, jos siitä saa lisäarvoa.

TsaTsaTsaa [18.04.2007 13:53:09]

#

No toihan vaikuttaa aikas pätevältä. Pitää panna korvan taakse tulevaisuuden varalta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta