Mittwoch, 10 Feb, 2010

Lektion 7

In dieser Lektion wollen wir nichts ueber SDL lernen vielmehr raemen wir unser bissheriges Programm ein wenig auf um den Ueberblick nicht zu verlieren.

Hier werde ich nicht viel schreiben sondern den Code sprechen lassen, da sich zur Lektion 6 nichts ändert außer das ich einige Sachen in einer Funktion zusammen gefasst habe, um das ganze etwas übersichtlicher zu gestalten.

Code:

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include <string>
	
//Oberflächen deklarieren
SDL_Surface* fenster = NULL;
SDL_Surface* hintergrund = NULL;
SDL_Surface* raumschiff = NULL;
SDL_Surface *text = NULL;
	
//Entält die Postitionsdaten der einzelnen Bildteile
SDL_Rect bildteil[ 4 ];
	
//Schriftart-Varibable deklarieren
TTF_Font *schriftart = NULL;
	
//Variable für Textfarbe
SDL_Color textfarbe = { 128, 88, 77 };
	
void setze_bauteil_masse()
{
    //Raumschiff oben links
    bildteil[ 0 ].x = 0;
    bildteil[ 0 ].y = 0;
    bildteil[ 0 ].w = 110;
    bildteil[ 0 ].h = 110;
	
    //Raumschiff oben rechts
    bildteil[ 1 ].x = 110;
    bildteil[ 1 ].y = 0;
    bildteil[ 1 ].w = 110;
    bildteil[ 1 ].h = 110;
	
    //Raumschiff unten links
    bildteil[ 2 ].x = 0;
    bildteil[ 2 ].y = 110;
    bildteil[ 2 ].w = 110;
    bildteil[ 2 ].h = 110;
	
    //Raumschiff unten rechts
    bildteil[ 3 ].x = 110;
    bildteil[ 3 ].y = 110;
    bildteil[ 3 ].w = 110;
    bildteil[ 3 ].h = 110;
}
	
SDL_Surface *lade_bild( std::string bildpfad )
{
    //Nicht optimiertes Bild
    SDL_Surface* normal_img = NULL;
	
    //Optimiertes Bild
    SDL_Surface* opt_img = NULL;
    //Unoptimiertes Bild laden
    normal_img = IMG_Load( bildpfad.c_str() );
	
    //Optimiertes Bild erstellen
    opt_img = SDL_DisplayFormat( normal_img );
	
    //Unoptimiertes Bild freigeben
    SDL_FreeSurface( normal_img );
	
    //Farbschlüssel für die transparente Farbe im richigen Format erzeugen
    Uint32 colorkey = SDL_MapRGB( opt_img->format, 0xFF, 0, 0xFF );
	
    //Setze die Pixel der Farbe Rot 0, Grün 0xFF, Blau 0xFF auf Transparent
    SDL_SetColorKey( opt_img, SDL_SRCCOLORKEY, colorkey );
	
    return opt_img;
}
	
void blit_obj( int x, int y, SDL_Surface* quelle, SDL_Surface* ziel, SDL_Rect* bildteil = NULL )
{
    //Erzeugt ein temporäres Rechteck zur Positionierung der Quelle
    SDL_Rect offset;
	
    //Übergibt die Position an das SDL-Rechteck
    offset.x = x;
    offset.y = y;
	
    //Bild blitten
    SDL_BlitSurface( quelle, bildteil, ziel, &offset );
}
	
void initalisierung()
{
    //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 );
}
	
void dateien_laden()
{
    //Hintergrund laden
    hintergrund = lade_bild( "hintergrund.png" );
	
    //Raumschiff laden
    raumschiff = lade_bild( "sprite.png" );
    //Schriftart laden
    schriftart = TTF_OpenFont( "helvetidoodlebyedt.ttf", 50 );
	
}
	
void aufraeumen()
{
    //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();
	
}
	
void blitten()
{
    //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, &bildteil[0] );
    blit_obj( 250,250, raumschiff, fenster, &bildteil[1]  );
    blit_obj( 450,250, raumschiff, fenster, &bildteil[3]  );
}
	
int main( int argc, char* args[] )
{
    setze_bauteil_masse();
    initalisierung();
    dateien_laden();
	
    //Text rendern
    text = TTF_RenderText_Solid( schriftart, "Der Weltraum....", textfarbe );
	
    blitten();
	
    //Anzeige aktualisieren
    SDL_Flip( fenster );
	
    //Pause
    SDL_Delay( 3000 );
    aufraeumen();
    return 0;
}