Freitag, 13 Aug, 2010

Lektion 10

In dieser Lektion benutzen wir die Maus. Um das Beispiel so einfach wie möglich zu halten zeigen wir bei einem Links-Klick die X-Koordinaten der Maus im Weltraumtext an und bei einem Rechts-Klick die Y-Koordinaten. Damit wir aber auch was von den Mausbewegungen haben, versetzen wir anhand der Maus eines unserer Raumschiffe. Mit der mittleren Maustasten können wir dessen Startposition dann wieder herstellen.

Ihr werdet sehen das es nicht viel unterschied zur Tastaturabfrage gibt.

lektion10.png

In diesem Beispiel müssen wir ein bischen unserer blitten Funktion anpassen. Wir übergeben der Funktion die x/y-Koordinaten für ein Raumschiff:

void blitten(int x, int y)
{
    //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( x,y, raumschiff, fenster, &bildteil[1]  );
    blit_obj( 450,250, raumschiff, fenster, &bildteil[3]  );
}

Dann geht es auch schon wieder in der Main-Funktion weiter. Hier lgene wir als erstes zwei Variablen an. Diese speichern die Koordinaten für unser bewegliches Raumschif und fast initial die Startposition des Raumschiffs.

int main( int argc, char* args[] )
{
    int x = 250;
    int y = 250;

Dann geht es erst mal weiter ohne Veränderung bis zum Aufruf der Blitt-Funktion:

    char anzeige_text[20] = "Der Weltraum....";    
    int ende = 0;
	
    setze_bauteil_masse();
    initalisierung();
    dateien_laden();
	
    while (ende != 1)
    {
        //Text rendern
        text = TTF_RenderText_Solid( schriftart, anzeige_text, textfarbe );

Wir übergeben der Blitt-Funktion die X/Y-Koordinaten:

        blitten(x,y);

Dann geht es ohne Änderung weiter bis wir in der Ereignisschleife sind:

        //Anzeige aktualisieren
        SDL_Flip( fenster );
	
        while (SDL_PollEvent( &ereignis))
        {

Jetzt prüfen wir als erstes ob ein Mausknopf gedrückt worden ist:

            if ( ereignis.type == SDL_MOUSEBUTTONDOWN )
            {

Bei jedem Mausknopfdruck (wow was für ein Wort) landen wir in dieser Bedingung und in dieser prüfen wir nun noch welche Taste gedrückt worden ist. Als nächstes überprüfen wir auf die linke Maustaste.

                if ( ereignis.button.button == SDL_BUTTON_LEFT )
                {

Jetzt schreiben wir die X-Koordinaten in unsere Textvariable, an diese kommen wir über das Ereignis:

                    sprintf(anzeige_text,"%i", ereignis.button.x);

Nun passen wir noch das Verhalten für die rechte und mittlere Maustaste an.

                }
                if ( ereignis.button.button == SDL_BUTTON_RIGHT )
                {
                    sprintf(anzeige_text,"%i", ereignis.button.y);
                }
                if ( ereignis.button.button == SDL_BUTTON_MIDDLE )
                {
                    x = 250;
                    y = 250;
                }
            }

Damit wir unser Raumschiff bewegen können müssen wir nun auf das Maus-Ereignis Bewegung reagieren:

            if( ereignis.type == SDL_MOUSEMOTION ) {

Wird die Maus also bewegt setzen wir die Koordinaten des Raumschiffes, anhand der Mauskoordinaten:

               x =  ereignis.button.x;
               y =  ereignis.button.y;
            }

Den Rest des Programmes lassen wir gleich:

            if ( ereignis.type == SDL_KEYDOWN )
            {
	
                switch ( ereignis.key.keysym.sym )
                {
                case SDLK_UP:
                    strcpy(anzeige_text,"Hoch");
                    break;
                case SDLK_DOWN:
                    strcpy(anzeige_text,"Unten");
                    break;
                case SDLK_LEFT:
                    strcpy(anzeige_text,"Links");
                    break;
                case SDLK_RIGHT:
                    strcpy(anzeige_text,"Rechts");
                    break;
                case SDLK_SPACE:
                    strcpy(anzeige_text,"Der Weltraum....");
                    break;
                case SDLK_l:
                    strcpy(anzeige_text,"");
                    break;
                }
            }
	
            if (ereignis.type == SDL_QUIT)
            {
                ende = 1;
            }
        }
    }
    aufraeumen();
    return 0;

Das war es schon und den gesamten Quellcode gibt es hier:
Lektion10