Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL: png:n tietty väri näkymättömäksi

TsaTsaTsaa [23.02.2007 10:54:57]

#

Moro.

Testailen tehdä tuommoista kirjoitusfunktiota SDL:llä ja muuten homma pelittää, mutta en saa fonttikuvan taustaväriä(tässä sininen) läpinäkyväksi.

Teen näin:

SDL_Surface *fontti = IMG_Load("kuvat/fontti.png");

SDL_SetColorKey(fontti, SDL_SRCCOLORKEY,
                   SDL_MapRGB(fontti->format, 0, 0, 255) );

Kysymys kuuluukin: pitääkö tuo tehdä png-kuvilla jotenkin toisella tavalla? Ilman SDL_image -kirjastoa olen saanut kyllä toimimaan bmp:illä, mutta nyt en ymmärrä. fontti.png:stä olen sataan kertaan tarkistanut, että taustaväri varmasti on tuo täysin sininen.

Laitetaan nyt vielä boonuksena se kirjoitusfunktio jos jotakin kiinnostaa:

void piirraTeksti(SDL_Surface *fontti, SDL_Surface *naytto, string teksti,
                  int x, const int& y)
{
   int leveys = (fontti->w) / MERKKEJA_FONTISSA;
   int korkeus = fontti->h;
   // Käydään teksti läpi
   for ( int i = 0 ; i < teksti.size() ; i++ )
   {
      // PiirraKuva() löytyy SDL-oppaasta jos et muuten ymmärrä
      PiirraKuva(fontti, naytto, haeIndeksi(teksti.at(i))*leveys,
                 0, leveys-1, korkeus, x, y);
      x += leveys;
   }

}


// Hakee kirjaimen indeksin fonttitiedostolle sopivaksi
// eli vähentää tai lisää merkin ASCII-arvoon jotakin
int haeIndeksi(char c)
{
   if ( c >= 'a' && c <= 'z' )
   {
      return static_cast< int >( c ) - 86;
   }
   else if ( c >= 'A' && c <= 'Z' )
   {
      return static_cast< int >( c ) - 54;
   }
   else if ( c >= '0' && c <= '9' )
   {
      return static_cast< int >( c ) - 47;
   }

   // Jos on joku muu merkki, tehdään välilyönti
   return 0;
}

Tässä tapauksessa MERKKEJA_FONTISSA = 37 (tyhjä, 0-9, A-Z) ja isot ja pienet kirjaimet näytetään samanlaisina. Jos merkkejä tekee lisää, pitää haeIndeksi()-funktiota muokata.

Edit: Funktiota kutsutaan vaikkapa näin:

piirraTeksti(fontti, naytto, "kusti polkee", 10, 23);

Niin ja fonttitiedostossa merkit ovat samanlevyisiä (yllätys) ja niiden välissä on yhden pikselin paksuinen erotinviiva (ihan vaan piirtämisen helpottamiseksi).

TsaTsaTsaa [23.02.2007 12:10:19]

#

Tein semmoisen lisäyksen, että tekstiin voi laittaa rivinvaihdon:

void piirraTeksti(SDL_Surface *fontti, SDL_Surface *naytto,
                  const string& teksti, int x, int y)
{
   int leveys = (fontti->w) / MERKKEJA_FONTISSA;
   int korkeus = fontti->h;
   int ekax = x;
   // Käydään teksti läpi
   for ( int i = 0 ; i < teksti.size() ; i++ )
   {
      if ( teksti.at(i) == '\n' )
      {
         y += korkeus;
         x = ekax;
         continue;
      }
      // PiirraKuva() löytyy SDL-oppaasta jos et muuten ymmärrä
      PiirraKuva(fontti, naytto, haeIndeksi(teksti.at(i))*leveys,
                 0, leveys-1, korkeus, x, y);
      x += leveys;
   }

}

Esimerkkikutsu:
piirraTeksti(fontti, naytto, "kusti polkee\nposti kulkee", 0, 0);

tgunner [23.02.2007 13:27:47]

#

Ootko kokeillu SDL_SetAlphaa? En tunne funktiota pahemmin, mutta nimi ja tämä vaikuttivat ihan asianmukaisilta. :o

TsaTsaTsaa [23.02.2007 14:03:22]

#

TGunner kirjoitti:

Ootko kokeillu SDL_SetAlphaa?

Nyt kokeilin ja sehän hoiti homman. Kiitos vinkistä.

Vastaus

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

Tietoa sivustosta