Events in SDL

Die SDL-Bibliothek bringt einen Mechanismus mit, der die Steuerung von Spielen erheblich vereinfacht. Dies sind Events (Ereignisse).

Events können folgendes sein:

  • eine Taste wurde gedrückt
  • eine Taste wurde losgelassen
  • die Maus wurde bewegt
  • eine Maustaste wurde gedrückt
  • ein interner Timer ist abgelaufen
  • das eigene Programm hat ein Event erzeugt.

SDL speichert Events intern in einer Warteschlange (Queue). SDL kümmert sich darum, daß die Events in der Schlange landen. Um Events zu verwenden, muß man ab und zu in der Warteschlange nachschauen, ob dort neue Events vorhanden sind.

Du kannst Dir Events wie eine Warteschlange im Supermarkt vorstellen. Dein Programm ist der Kassierer, die Events sind die Kunden. Die Arten von Events sind die Waren auf dem Förderband. Dein Programm muß also die Events nacheinander abfertigen, und je nach Art des Events etwas bestimmtes tun (scannen, wiegen, Stornoschlüssel rufen).

Events in einem Programm verwenden

Um Events in einem Programm zu verwenden, mußt Du zunächst eine Event-Variable definieren:

SDL_Event e;

Dann benötigen wir eine Schleife, um die Events abzufragen:

int i = 0;
while(i < 10) {
    while( SDL_PollEvent( &e ) != 0 ) { 

        cout << e.type << endl;    // Typ des Events ausgeben (eine Zahl)
        i++;                       // weiterzählen bis 10
    }
}

Erläuterungen:

  • Damit das Proramm funktioniert, muss zuerst ein SDL-Fenster erstellt werden!
  • Die erste while-Schleife läuft, bis 10 Events vearbeitet wurden.
  • Die zweite while-Schleife holt ein neues Event aus der Warteschlange.

Abbruch-Events

Das einfachste Event ist SDL_QUIT. Es bedeutet, dass das Programm beendet werden soll (z.B. durch Drücken des x oben im Fenster). Der folgende Code wartet einfach auf das Abbruchsignal:

bool ende = false;
while(!ende) {
    while( SDL_PollEvent( &e ) != 0 ) { 

        if( e.type == SDL_QUIT ) { 
            ende = true;
        }
    }
}

Es ist eine gute Angewohnheit, das Event SDL_QUIT auf jeden Fall zu behandeln. So wirst Du beim Testen Deine Programmfenster leichter wieder los.

Tastatur-Events

Tastendrücke sind recht einfach zu vearbeiten, da zu jeder Taste eine Integer-Zahl gehört. SDL definiert Platzhalter für alle wichtigen Tasten. Du musst Dir die Zahlen also nicht merken oder sie mühsam herausfinden. Beispielsweise wartet folgender Code auf das Drücken der Leertaste:

bool ende = false;
while(!ende) {
    while( SDL_PollEvent( &e ) != 0 ) { 

        if( e.type == SDL_KEYDOWN ) {      // Taste gedrückt
            taste = e.key.keysym.sym;      // speichern, welche Taste es war
            if (taste == SDLK_SPACE) {     // ist es die Leertaste?
                ende = true;
            }
        }
    }
}

Erläuterungen:

  • SDL_KEYDOWN steht für das Ereignis Taste gedrückt.
  • e.key.keysym.sym ist der Code der soeben gedrückten Taste.
  • SDLK_SPACE ist ein Integer, der für die Leertaste steht.

Was für Tastenkürzel gibt es?

Grundsätzlich ist jeder Taste auf der Tastatur eine Zahl zugeordnet. Da diese ein Integer ist, könnt Ihr sie einfach ausgeben. Die häufigsten Sondertasten sind als Konstanten in SDL gespeichert (z.B. SDLK_UP für Pfeil nach oben). Du findest alle in einer riesigen Tabellle.

Maus-Events

Die Mausknöpfe abzufragen ist dann auch nicht weiter kompliziert. Du erhälst so die x- und y-Koordinaten der Stelle, an der die Maus gedrückt wurde. Mit if kannst Du prüfen, ob die Koordinaten in einem bestimmten Bereich liegen. Folgender Code fragt die Knöpfe innerhalb einer Event-Schleife ab:

if (e.type == SDL_MOUSEBUTTONDOWN) {
    int x = e.button.x;
    int y = e.button.y; 
    if (x > 50 && x < 100 && y > 50 && y < 100) {
        cout << "Knopf gedrückt!" << endl;
    }
    cout << x << " " << y << endl;
}

Mit e.button.button kannst Du auch herausfinden, welcher Knopf gedrückt wurde. In der Dokumentation zu SDL_MouseButtonEvent findest Du dazu Details.

Was für andere Events gibt es?

SDL kennt eine Menge Events. Meist genügen aber:

Event Beschreibung
SDL_KEYDOWN Taste gedrückt
SDL_KEYUP Taste losgelassen
SDL_MOUSEMOTION Maus bewegt
SDL_MOUSEBUTTONDOWN Mausknopf gedrückt
SDL_MOUSEBUTTONUP Mausknopf losgelassen
SDL_QUIT Schließen-Feld im Fenster geklickt

Es lohnt sich, auf SDL_QUIT zu reagieren. Dann wirst Du das Programm leichter los, falls alles andere nicht funktioniert.

results matching ""

    No results matching ""