Montag, 22 Feb, 2010

Lektion 9

In dieser Lektion möchten wir die Tastatur abfragen. Dazu zeigen wir an der Stelle unseres Textes “Der Weltraum…”, die jeweilig gedrückte Richtungstaste an. Wenn wir also den Pfeil auf unserer Tastatur nach oben drücken erscheint “Hoch”, nach Unten “Unten”, nach Links “Links” und nach Rechts “Rechts”. Mit der Leertaste stellen wir den Start-Zustand wieder her und mit l löschen wir den Text.

lektion9.png

In dieser Lektion müssen wir nur unsere Main Funktion ändern, in der wir als erstes eine Variable mit dem Text “Der Weltraum…” hinzufügen:

int main( int argc, char* args[] )
{
    char anzeige_text[20] = "Der Weltraum....";
    int ende = 0;

Dann benutzen wir die neue Variable in der TTF Ränderfunktion, anstatt des Textes:

     text = TTF_RenderText_Solid( schriftart, anzeige_text, textfarbe );

Da wir ja möchten das der Text bei jeden Durchlauf neu gerendert wird (Performance mäßig können wir das in diesen Beispiel verkraften ;-)), kopieren wir die so eben abgeänderte Zeile vor den blitten() Aufruf.

    setze_bauteil_masse();
    initalisierung();
    dateien_laden();
	
    while (ende != 1)
    {
        //Text rendern
        text = TTF_RenderText_Solid( schriftart, anzeige_text, textfarbe );
        blitten();
	
        //Anzeige aktualisieren
        SDL_Flip( fenster );
	
        while (SDL_PollEvent( &ereignis))
        {

Als nächstes reagieren wir auf einen Tastendruck innerhalb unserer Erreignisschleife. Das tun wir in dem wir den Erreignistyp auf SDL_Keydown abfragen:

            if ( ereignis.type == SDL_KEYDOWN )
            {

Bei jedem Tastenandruck springen wir nun in diese Bedingung. Jetzt müssen wir nur noch herrausfinden welche Tastegedrücktworden ist. Diese Information können wir aus unserem Ereignis gewinnen:

                switch ( ereignis.key.keysym.sym )
                {

Jetzt müssen wir nur noch auf unseren jeweiligen Tasten Druck reagieren und einen neuen Text festlegen:

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

Das wars auch schon der Rest des Programmes bleibt unverändert:

            if (ereignis.type == SDL_QUIT)
            {
                ende = 1;
            }
        }
    }
    aufraeumen();
    return 0;
}

Denn gesamten Quellcode zu dieser Lektion gibt es hier:
Lektion 9

!!!Andere Methode um Tasten abzufragen!!!

Es gibt noch eine weitere Möglichkeit um einen Tastendruck abzufragen ohne ein SDL_Event zu benutzen. Man benutzt dazu die Abfrage des Tastenstatus. Um das zu veranschaulichen zeigen wir den Text Star Trek an, wenn man die s Taste drückt.

Der Tastenstatus ist eine Liste der die Tasten enthält und ob sie gedrückt worden ist. Dazu benötigen wir als erstes eine Variable die die Liste enthält. Diese legen wir in Main an:

int main( int argc, char* args[] )
{
    Uint8 *keystates = NULL;    

Dann bleibt der Rest gleich bis der Durchlauf der Ereignisse getan ist:

    int x = 250;
    int y = 250;
    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 );
        blitten(x,y);
	
        //Anzeige aktualisieren
        SDL_Flip( fenster );
	
        while (SDL_PollEvent( &ereignis))
        {
	
            if ( ereignis.type == SDL_MOUSEBUTTONDOWN )
            {
                if ( ereignis.button.button == SDL_BUTTON_LEFT )
                {
                    sprintf(anzeige_text,"%i", ereignis.button.x);
                }
                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;
                }
            }
	
            if( ereignis.type == SDL_MOUSEMOTION ) {
               x =  ereignis.button.x;
               y =  ereignis.button.y;
            }
            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;
            }
        }

Jetzt aktualisieren wir den aktuellen Tastenstatus:

        keystates = SDL_GetKeyState( NULL );

Danach prüfen wir ob die s-Taste gedrückt wurden ist und passen wieder unseren Text an und beenden unser Programm:

        if( keystates[ SDLK_s ] )
        {
            strcpy(anzeige_text,"Star Trek");
	
        }
    }
    aufraeumen();
    return 0;
}

Diese Methode ist in Summe etwas kürzer und es gibt sie auch für den Mausstatus oder den Joystickstatus. Am Ende ist es aber Geschmackssache welche Methode man nutzt.