Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL-lippujen käsittely

Burton [18.01.2010 15:30:39]

#

Otsikko saattaa olla hämäävä, mutta eiköhän tämä teksti selvennä sitä.

SDL:ssä ikkuna alustetaan komennolla SDL_SetVideoMode(w, h, d, f), jossa w on leveys, h korkeus, d bittisyvyys ja f flagit (SDL_DOUBLEBUF, SDL_FULLSCREEN ...). Onko mahdollista toteuttaa alla oleva koodi helpommin?

int fullscreen = 1;
if (fullscreen)
  naytto = SDL_SetVideoMode(w, h, d, SDL_SWSURFACE|SDL_FULLSCREEN);
else
  naytto = SDL_SetVideoMode(w, h, d, SDL_SWSURFACE);

Kokoruututilan asettamista varten tuo saattaa olla oiva keino, mutta jos flageja pitäisi kasata enemmän ja niistä päättäisi suurempi määrä muuttujia, niin if-lausekkeet eivät todennäköisesti olisi mielekkäin vaihtoehto, vai?

Blaze [18.01.2010 15:42:29]

#

Kerää flagit yhteen muuttujaan ja lopuksi anna tuo muuttuja SDL_SetVideoModelle.

int flags = SDL_SWSURFACE;
if(fullscreen)
  flags |= SDL_FULLSCREEN;
naytto = SDL_SetVideoMode(w, h, d, flags);

Metabolix [18.01.2010 16:15:33]

#

Yksi mahdollisuus on myös käyttää ?:-operaattoria, tai jos haluaa heittäytyä kryptiseksi, niin kyllä kertolaskukin toimii, kunhan fullscreen-muuttujassa todella on nolla tai ykkönen.

SDL_SWSURFACE | (fullscreen ? SDL_FULLSCREEN : 0);
SDL_SWSURFACE | (fullscreen * SDL_FULLSCREEN);

Selkeyden vuoksi suosittelen ensisijaisesti tuota Blazen ratkaisua. Oikea tyyppi lipuille on kylläkin Uint32.

Torgo [19.01.2010 13:31:42]

#

Kysymyksessä oli että mitä jos flageja pitäisi kasata enemmänkin. Tällöin ? ja * eivät ole kovinkaan hyviä vaihtoehtoja. Mielestäni paras tapa on juuri tuo Blazen esittämä lippumuuttuja, kunhan sen tyypin korjaa oikeaksi. Jos konffattavaa tulee paljonkin niin, voit tehdä flagien kasaamiseen oman funktionsa. Tällöin voit pitää asetukset yhdessä tietueessa, taulukossa tai missä tahansa parhaaksi näkemässäsi tietorakenteessa ja muodostaa liput sieltä. Tietysti pikkaisen enemmän työtä kuin if-elsessä, mutta on selkeämpää ja ylläpidettävämpää.

Jos konffattavaa ei ole enempää kuin tuo fullscreen, niin mikä tahansa jo mainituista keinoista kelpaa aivan yhtä hyvin.

Metabolix [19.01.2010 16:25:32]

#

Torgo kirjoitti:

Kysymyksessä oli että mitä jos flageja pitäisi kasata enemmänkin. Tällöin ? ja * eivät ole kovinkaan hyviä vaihtoehtoja.

Jos lippuja tarvitaan vain yhden kerran, koodin saa jäsenneltyä selkeästi näilläkin, joten en pidä vaihtoehtoa mitenkään kohtuuttoman huonona:

naytto = SDL_SetVideoMode(w, h, d, 0
  | (fullscreen ? SDL_FULLSCREEN : 0)
  | (hw_surface ? SDL_HWSURFACE : 0)
  | (resizable ? SDL_RESIZABLE : 0)
);

Vastaus

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

Tietoa sivustosta