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
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
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.
En tiedä tuosta, mutta omatekemäni vastaava tekstinkirjoitusfunktio löytyy täältä: https://www.ohjelmointiputka.net/keskustelu/
Erona se, että voi kirjoittaa numeroitakin.
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.
Minä en ainakaan löydä tuosta mitään vikaa.
Veikkaisin että vika on PiirraKuva funktiossa.
Mikset käytä SDL_ttf kirjastoa?
PiirraKuva
on suoraan putkan SDL-oppaasta ja en käytä SDL_ttf:ää, koska haluan kokeilla tällaistakin ratkaisua välillä.
Käytätkö PiirraKuva
-funktion sisällä SDL_BlitSurface
a? Jos käytät, oletko muistanut avata näyttöpinnan lukituksen SDL_UnlockSurface
lla? Muussa tapauksessa piirto ei toimi. SDL_SetColorKey
tä 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 }
Tuohan toimiikin kiitos kiitos jes jes.
Aihe on jo aika vanha, joten et voi enää vastata siihen.