Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: SDL-ttf, tekstin piirto

Sivun loppuun

Meitsi [12.03.2006 22:22:52]

#

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);
    }
}

M2tias [12.03.2006 22:33:34]

#

Eikös headerissa oo vaan funktioitten esittely ja funktiot on erillisessä .c-tiedostossa?

Meitsi [12.03.2006 22:35:00]

#

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.

Andu [11.04.2006 14:23:36]

#

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ä?

Meitsi [12.05.2006 23:48:54]

#

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.

Betaversio [10.09.2006 10:20:21]

#

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

muppis [20.09.2006 00:02:16]

#

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.

Meitsi [30.09.2006 16:37:56]

#

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ää.

incidence [20.10.2006 17:09:24]

#

Oisit voinut kertoa että rippasit tuon gpwiki.comista, kun kerroit myös ton "Ohjelmointiputkan SDL-oppaasta." ?

Meitsi [22.10.2006 13:04:35]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta