Yksinkertainen esimerkki SDL-ttf:än käytöstä tekstin piirtämiseen. Korvaa esimerkissä käytetty Vera.ttf jollakin omalla fontillasi!
Kääntyy parametrein: (-lmingw32) -lSDL_ttf -lSDLmain -lSDL
main.cpp
#include <SDL/SDL.h> #include <SDL/SDL_ttf.h> //Tarvittava kirjasto sdl-ttf:än käyttöön #include "texttools.h" //Tekstin tulostukseen liittyvät funktiot omassa tiedostossaan #include <stdio.h> SDL_Surface *ruutu, *tekstiSurf; //"pää"-surface ja tekstille oma surface SDL_Event events; //tapahtumahanska int resX=1024, resY=768, moX, moY; //Resoluutio muuttujissa (esim jos halutaan vaihtaa resoluutiota joskus) ja hiiren paikka TTF_Font* defFontti; //Tämä säilyttää haluamamme fontin char puhveri[100]; //Tekstille pieni bufferi void BlitSurf(SDL_Surface*, SDL_Surface*, int, int); //Funktion proto int main(int argc, char *argv[]) { if (SDL_Init(SDL_INIT_VIDEO) < 0) { //SDL alustus return 1; } ruutu = SDL_SetVideoMode(resX, resY, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); if (TTF_Init() == -1) { //Alustetaan SDL-ttf. Jos ttf-initin paluuarvo on -1, jokin meni vikaan ja poistutaan. return 1; } defFontti = LoadFont("fonts/Vera.ttf", 30); //Ladataan fontti. Korvaa tämä haluamallasi fontilla! Parametrinä fontin hakemistopolku/tiedostonimi ja koko (pt) bool running=true; while (running) { //mainloop SDL_GetMouseState(&moX, &moY); //hiiren paikka selville SDL_FillRect(ruutu, NULL, 0) ; //ruutu mustaksi while (SDL_PollEvent(&events)) { //tapahtumat selville switch(events.type) { //tutkitaan tapahtumia case SDL_QUIT: //Lopetettiin... running=false; //Lopetetaan mainloop... break; //...heti } if (events.key.keysym.sym == SDLK_ESCAPE) { //Käsitellään myös esc-nappi running=false; break; } } sprintf(puhveri, "Hiiriäks: %i Hiiriy: %i", moX, moY); //Hiiren sijainti tekstille varattuun char-tauluun. blitText(defFontti, &tekstiSurf, tekstiVari, taustaVari, puhveri, blended); //Piirretään teksti sille varatulle surfacelle. // Parametreinä fontti, surface jonne teksti halutaan, tekstin väri, taustan väri, teksti, tekstin piirtometodi // solid=ei antialiasoitu // shaded=antialiasoitu + tausta värjätty // blended=antialiasoitu + läpinäkyvä tausta BlitSurf(tekstiSurf, ruutu, 0, 15); //blitataan teksti ruudulle SDL_Flip(ruutu); //flipataan ruutu SDL_Delay(1); //pientä viivettä } SDL_Quit(); //lopetetaan return 0; //jes, kaikki sujui odotusten mukaan } void BlitSurf(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y) //Tämä funktio on suoraan Ohjelmointiputkan SDL-oppaasta. Sen tarkoitus lienee jo tuttu. { SDL_Rect alue; alue.x = x; alue.y = y; SDL_BlitSurface(kuva, NULL, naytto, &alue); }
texttools.h
SDL_Color tekstiVari = {255, 255, 255, 255}; //Haluamamme värit tekstille ja sen taustalle SDL_Color taustaVari = {0, 0, 0, 0}; TTF_Font* LoadFont(char *filename, int ptsize) { //Fontin latausfunktio [tiedostonimi, fonttikoko] TTF_Font* temppi; //Väliaikainen muuttuja temppi = TTF_OpenFont(filename, ptsize); //Ladataan fontti if (temppi == NULL) { //std::cout << "Couldn't load font. :(" << std::endl; //Fontin lataaminen ei onnistunut. std::cout on kommentoitu pois koska tässä projektissa en sitä käytä, mutta olkoon esimerkkinä. //Lisää tähän haluamasi virheilmoitus! } return temppi; //Palautetaan fontti } enum textquality {solid, shaded, blended}; //enum tekstin piirtotyypille. Tämä ei ole siis pakollinen, voit korvata tämän vaikka defineillä. //Tekstin piirtofunktio. [fontti, minne piirretään, tekstin väri, taustan väri, teksti, piirtotapa] void blitText(TTF_Font *fontti, SDL_Surface **destSurf, SDL_Color fgColor, SDL_Color bgColor, char teksti[], textquality quality) { //tutkitaan piirtotapa ja piirretään sen mukaisesti if (quality == solid) { *destSurf = TTF_RenderText_Solid(fontti, teksti, fgColor); } else if (quality == shaded) { *destSurf = TTF_RenderText_Shaded(fontti, teksti, fgColor, bgColor); } else if (quality == blended) { *destSurf = TTF_RenderText_Blended(fontti, teksti, fgColor); } }
Eikös headerissa oo vaan funktioitten esittely ja funktiot on erillisessä .c-tiedostossa?
Tuo oli vain hieman erikoinen ratkaisu saada nuo funktiot "pois tieltä" main.cpp:stä. Ei välttämättä aivan oikea tapa, mutta toimii kumminkin ja tuon saa jokainen muuttaa haluamakseen.
Kiitos! Tätä tarvitsin.
Edit: Miten tekstin väriä vaihdetaan? Pitääkö tuossa missä sanoit että väriä vaihdetaan, vaihtaa jotkut tietyt numerot vain mitä, kun minulla ei värin vaihto onnistu?
Edit2: Oho! Nyt se onnistui. Mutta mikä se neljäs luku on siinä?
lainaus:
Kiitos! Tätä tarvitsin.
Edit: Miten tekstin väriä vaihdetaan? Pitääkö tuossa missä sanoit että väriä vaihdetaan, vaihtaa jotkut tietyt numerot vain mitä, kun minulla ei värin vaihto onnistu?
Edit2: Oho! Nyt se onnistui. Mutta mikä se neljäs luku on siinä?
Neljäs luku on alpha-arvo.
Dev- cpp valittaa:
Circular main <- main.o dependency dropped.
headeri ja koodi omissa tiedostoissaan.
onko tässä joku parametri linkkerille vai?
olen sitten aloittelija, kuten kuvasta näkyy
:F
En tiedä muista, mutta minulla piti tehdä tuohon koodiin hieman hienosäätöä, että sain toimimaan.
1) Fonttiin pitää osoittaa koko tiedostopolulla (esim. c:\\windows\\fonts\\vera.ttf)
2) En saanut toimimaan texttools.h -tiedostoa, joten se koodi piti ympätä tuonne main.cpp -filuun matkaan.
Muuten aika jees esimerkki.
Itselläni kyllä toimi ihan hyvin tuo fontin lataus ilman hakemistopolkua. Fontin vain täytyy olla tietenkin samassa hakemistossa ohjelmatiedoston kanssa.
Tuo header-tiedosto on itseasiassa virheellinen, koska tuo on "väärä" paikka funktioille, mutta tuollatavalla saa funktiot helposti pois mainia sotkemasta. Ainakin mingw hyväksyi tuon, mutta jotkin muut kääntäjät saattavat älähtää.
Oisit voinut kertoa että rippasit tuon gpwiki.comista, kun kerroit myös ton "Ohjelmointiputkan SDL-oppaasta." ?
lainaus:
Oisit voinut kertoa että rippasit tuon gpwiki.comista, kun kerroit myös ton "Ohjelmointiputkan SDL-oppaasta." ?
EDIT: ahaa gpwiki.org. Njoo, tuon tutoriaalin perusteella tein, mutta miten nyt sitten muuttaa noin yksinkertaista koodia erilaiseksi ilman että toimivuus muuttuu. Eikä tuo mikään suora kopipaste ole kun ei tuolla gpwikissä ole edes valmista koodia...
EDIT: Njoo, eipä tämä vinkki muutenkaan kovin kaksinen ole, kirjoitan tämän joskus paremmalla ajalla uusiksi ja samalla jotenkin eri tavalla niin ei sitten tule ihmetystä että onko kopioitu vai ei. Samalla voisi korjata tuon headeri-virityksen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.