Dienstag, 9 Feb, 2010

Lektion 5

In dieser Lektion geht es um Texte. Es ist nicht sinnvoll jedes geschriebene Wort in einem Bild darzustellen. viel besser ist es eine Schriftart zu verwenden und mit dieser einen Text auf das angezeigte Bild zu Rendern.

In dieser Lektion haben wir vor unser Bild aus Lektion 4 zu beschriften, ca. so:

lektion5-bild1.png

Dazu benutzen wir die sogennaten “True Type Fonts”. Für diese Lektion benutzen wir dieses TTF, dieser ist FreeWare unt wurde von Edward Townend gebaut:

Font

Diesen speichern wir im gleichen Verzeichnis wie unserer Quellcode und die Bilder.

Damit man unter SDL True Type Fonts nutzen kann benötigt man die SDL_ttf Bibliothek. Um die Grundvoraussetzung zur Nutzung der SDL_ttf zu schaffen geht ihr einfach vor wie bei der SDL_image, die in Lektion 2 beschrieben wurde. Das heist ihr fügt beim Übersetzen den Linkparameter -lSDL_ttf hinzu.

Als erstes fügen wir die nötigen Header unserem Programm zu:

#include "SDL/SDL_ttf.h"

Dann begeben wir uns auch schon zu unserer Main-Funktion in der wir als ertes eine neue SDL-Oberflöchenvaribale deklarieren die den gerenderten Text aufnehmen soll und die wir dann blitten können:

    //Gerenderter Text
    SDL_Surface *text = NULL; 

Als nächstes deklarieren wir eine TTF_Font, die den geladenen Font aufnehmen soll:

    //Schriftart
    TTF_Font *schriftart = NULL; 

Jetzt brauchen wir noch eine Struktur die, die Schriftfarbe beinhaltet:

    //Textfarbe 
    SDL_Color textfarbe = { 128, 88, 77 }; 

Dann geht es weiter nach der initzialisierung von SDL. Nach der SDL Initialisierung, initialisieren wir die SDL_ttf, ohne Initialisierung können wir keine TTF Funktionalitäten nutzen. Im Fehlerfall gibt die Initialisierungsroutine eine -1 zurück.

    //TTF Funktionalitäten initalisieren
    TTF_Init();

Als nächstes kümmern wir uns um eine Sache die nichts mit True Type Fonts zu tun hat, die aber ganz gut auf Grund des THemas Text hierein passt, wir setzen den Fenster Text.

    //Fenstertext
    SDL_WM_SetCaption( "Alles rund um TTF", NULL ); 

So nun laden wir den Font. Das erste Argument beinhaltet die TTF Datei und das zweite Argument enthält die Schriftgröße.

   //Schriftart laden 
   schriftart = TTF_OpenFont( "helvetidoodlebyedt.ttf", 50 ); 

Jetzt rendern wir den Text mit der TTF_RenderText_Solid() Funktion. Das erste Argument enthälz die Schriftart, das zweite den Text und das dritte Argument die Schriftfarbe.

    //Text rendern
    text = TTF_RenderText_Solid( schriftart, "Der Weltraum....", textfarbe ); 

Und als letztes blitten wir den Text wie gewohnt, aber erst nach dem ihr den Hintergrund geblittet habt:

    //Gerenderten Text blitten
    blit_obj( 150,30, text, fenster );

Als letztes denkt noch daran die Oberfläche am ende des Programmes frei zu geben:

    // Text freigeben
     SDL_FreeSurface( text );

Wir müssen auch noch den Font freigeben und SDL_TTF beeneden:

    //Schriftart freigeben 
    TTF_CloseFont( schriftart ); 
	
    //SDL_ttf beenden
    TTF_Quit(); 

Und so sieht jetzt unsere Main aus:

int main( int argc, char* args[] )
{
    // Fenster
    SDL_Surface* fenster = NULL;
	
    //Hintergrund
    SDL_Surface* hintergrund = NULL;
	
    // Raumschiff
    SDL_Surface* raumschiff = NULL;
	
    //Gerenderter Text
    SDL_Surface *text = NULL;
	
    //Schriftart
    TTF_Font *schriftart = NULL;
	
    //Textfarbe
    SDL_Color textfarbe = { 128, 88, 77 };
	
    //Initialisieren von SDL
    SDL_Init( SDL_INIT_EVERYTHING );
	
    //TTF Funktionalitäten initalisieren
    TTF_Init();
	
    //Fenstertext
    SDL_WM_SetCaption( "Alles rund um TTF", NULL );
	
    //Fenster Konfigurieren
    fenster = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
	
    //Hintergrund laden
    hintergrund = lade_bild( "hintergrund.png" );
	
    //Raumschiff laden
    raumschiff = lade_bild( "raumschiff.png" );
    //Schriftart laden
    schriftart = TTF_OpenFont( "helvetidoodlebyedt.ttf", 50 );
     //Text rendern
    text = TTF_RenderText_Solid( schriftart, "Der Weltraum....", textfarbe );
	
    //Hintergrund blitten
    blit_obj( 0,0, hintergrund, fenster );
    //Gerenderten Text blitten
    blit_obj( 150,30, text, fenster );
    // Raumschiffe blitten
    blit_obj( 350,150, raumschiff, fenster );
    blit_obj( 250,250, raumschiff, fenster );
    blit_obj( 450,250, raumschiff, fenster );
	
    //Anzeige aktualisieren
    SDL_Flip( fenster );
	
    //Pause
    SDL_Delay( 3000 );
	
    //Bildspeicher freigeben
    SDL_FreeSurface( hintergrund );
    SDL_FreeSurface( raumschiff );
	
    // Text freigeben
     SDL_FreeSurface( text );
	
    //Schriftart freigeben
    TTF_CloseFont( schriftart );
	
    //SDL_ttf beenden
    TTF_Quit();
    //SDL beenden
    SDL_Quit();
	
    return 0;
}