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