Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Kirjaimien piirtäminen bittikartasta SDL:llä

Sivun loppuun

Resiina [10.07.2007 23:54:58]

#

SDL_Surface *aakkoset = SDL_LoadBMP("aakkoset.bmp"); // 800 pikseliä leveä, 28 pikseliä korkea bittikartta

void PiirraTeksti(SDL_Surface *naytto, const int x, const int y, const string str_teksti)
{
     if (str_teksti.length() > 0)
     {
        string muok = pienenna(str_teksti);
        const int alku = 97; // 'a'
        SDL_Surface *teksti = SDL_CreateRGBSurface(SDL_HWSURFACE, muok.length()*32, aakkoset->h, 32, 0, 0, 0, 0);
        for (int ind = 0, X = 0; ind < muok.length(); ind++, X += 32)
            PiirraKuva(aakkoset, teksti, X, 0, ((int)muok[ind]-alku)*32, 28, 32, aakkoset->h);
        SDL_SetColorKey(teksti, SDL_SRCCOLORKEY, SDL_MapRGB(teksti->format, 0, 0, 0));
        PiirraKuva(teksti, naytto, x, y);
        SDL_FreeSurface(teksti);
     }
}

Tämän olisi tarkoituksena piirtää ruudulle str_teksti:n sisältö hakien kirjaimet aakkoset-SDL_Surface:sta 32 pikselin välein.
Kun tätä funktiota kutsuu esimerkiksi:

PiirraTeksti(naytto, 0, 0, "testi");

niin ruudun vasempaan yläkulmaan ei tule mitään. Sinnehän pitäisi tulla 160 (5*32) pikselin levyinen, 28 pikselin korkuinen teksti. Musta laatikko sinne tulee jos ottaa tuon SDL_SetColorKey():n pois.

Apua, kiitos.

PS. Tässä vielä linkki tuohon aakkosiin

moptim [11.07.2007 11:32:01]

#

Hmm. Kristallipallo kertoo, että sinulla on alphabet.bmp, ja yrität ladata kuvaa aakkoset.bmp rivillä 1. Siispä joko nimeät alphabet.bmp:n aakkoset.bmp:ksi, tai muutat SDL_LoadBMP-funktion kutsua korvaamalla "aakkoset.bmp":n "alphabet.bmp":llä.
Sori viesti oli epäselvä, mutta muuta siis eka rivi tämmöiseksi:

SDL_Surface *aakkoset = SDL_LoadBMP("aakkoset.bmp"); // 800 pikseliä leveä, 28 pikseliä korkea bittikartta

Resiina [11.07.2007 13:26:58]

#

Kyllä minä tuon alphabet.bmp:tä oikeassa ohjelmassani käytän, koska siitä tulee englannin kielinen, mutta ajattelin selventää asiaa ehkä hieman käyttämällä suomen kieltä tässä tapauksessa.

Anteeksi tämän suuren epäselvyyden tuottaminen.

TsaTsaTsaa [11.07.2007 16:16:16]

#

En tiedä tuosta, mutta omatekemäni vastaava tekstinkirjoitusfunktio löytyy täältä: https://www.ohjelmointiputka.net/keskustelu/14483-sdl-png-n-tietty-väri-näkymättömäksi

Erona se, että voi kirjoittaa numeroitakin.

Resiina [11.07.2007 18:30:59]

#

void PiirraTeksti(SDL_Surface *fontti, SDL_Surface *naytto, int x, int y, string teksti)
{
   int leveys = 32;
   int korkeus = fontti->h;
   for (int i = 0; i < teksti.size(); i++)
   {
      PiirraKuva(fontti, naytto, HaeIndeksi(teksti.at(i))*leveys, 0, leveys-1, korkeus, x, y);
      x += leveys;
   }
}
int HaeIndeksi(char c)
{
   if (c >= 'a' && c <= 'z')
      return static_cast<int>(c) - 97;
   else if (c >= '0' && c <= '9')
      return static_cast<int>(c) - 49;
   return 0;
}

Ei toimi tällaisella viritelmällä. Ja ovatkohan nuo merkkien numerokoodit erilaiset Linuxissa kuin Windowsissa? Vaihdoimpa nekin siitä sitten. En ole vielä fonttiini numeroita tehnyt, mutta laitoin tuon jo tuohon indeksinhakuun kuitenkin.

Lahha [11.07.2007 20:15:32]

#

Minä en ainakaan löydä tuosta mitään vikaa.
Veikkaisin että vika on PiirraKuva funktiossa.

Mikset käytä SDL_ttf kirjastoa?

Resiina [11.07.2007 20:52:51]

#

PiirraKuva on suoraan putkan SDL-oppaasta ja en käytä SDL_ttf:ää, koska haluan kokeilla tällaistakin ratkaisua välillä.

os [11.07.2007 21:03:47]

#

Käytätkö PiirraKuva-funktion sisällä SDL_BlitSurfacea? Jos käytät, oletko muistanut avata näyttöpinnan lukituksen SDL_UnlockSurfacella? Muussa tapauksessa piirto ei toimi. SDL_SetColorKeytä ei muuten tarvitse kutsua kun kerran fonttien lataamisen yhteydessä.

PiirraTeksti(SDL_Surface *naytto, int x, int y, const char *teksti) {
  SDL_Rect ch, dest; // Suorakulmio-oliot (x,y,w,h), lähde, kohde

  ch.w = dest.w = FONT_WIDTH;
  ch.h = dest.h = FONT_HEIGTH;
  ch.y = 0;
  dest.y = y;
  dest.x = x;
  SDL_UnlockSurface(naytto); // avataan lukitus
  for(int i=0; teksti[i]!='\0'; i++) {
    ch.x = FONT_WIDTH*(teksti[i]-'a');
    SDL_BlitSurface(aakkoset, &ch, naytto, &dest);
    dest.x+=FONT_WIDTH;
  }
  SDL_LockSurface(naytto); // palautetaan lukitus
}

Resiina [11.07.2007 22:24:06]

#

Tuohan toimiikin kiitos kiitos jes jes.


Sivun alkuun

Vastaus

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

Tietoa sivustosta