Input in SDL

Grundsätzliches

Die SDL kann viel mehr als nur Pixel zeichnen:
Sie kann unter anderem auch Töne ausgeben und vor allem
Input von Tastatur und Maus verarbeiten.

Jedes "Eingabe-Ereignis" (Tastendruck, Mausklick, ...)
ist ein sogenannter "Event", dargestellt in einem Wert vom Typ SDL_Event.
Das ist eine Union von Strukturen, sie enthält einerseits den Event-Typ
("Was war das für ein Event?") und andererseits je nach Event
Zusatz-Information zum Event (gedrückte Taste, Mauskoordinaten, ...).

Programmierung

Doku und Beispiele: Hier, hier und vor allem hier.

Probleme

Wenn ein Programm selbst die SDL-Events lesen will,
"kollidiert" das leider mit dem Event-Code in meinem sdlinterf.h:
Bei jedem Aufruf von sdlUpdate oder sdlMilliSleep
werden alle anstehenden Events gelesen!
Bei einem Event vom Typ SDL_QUIT endet das Programm
(sonst könnte man das Programm nämlich weder mit Ctrl-C
noch durch einen Klick auf "Fenster schließen" rechts oben beenden!),
alle anderen Events werden vom sdlinterf-Code ignoriert und verworfen.

Das hat zur Folge, dass eine Event-Verarbeitung im Hauptprogramm
nur die Events bekommt, die sich seit dem letzten Aufruf
von sdlUpdate oder sdlMilliSleep ereignet haben:
Alle unverarbeiteten Events davor werden vom sdlinterf "gefressen".
Es wäre daher klug, die Events unmittelbar vor Aufruf
dieser beiden Funktionen zu prüfen und zu verarbeiten.

Alternativen

Anstatt die Events selbst zu lesen und zu verarbeiten,
kann man auch jedesmal SDL_PumpEvents aufrufen
(das aktualisiert den internen Status der folgenden Funktionen)
und dann mit SDL_GetKeyState und SDL_GetModState
auf aktuell gedrückte Tasten prüfen bzw. mit SDL_GetMouseState
die aktuellen Maus-Koordinaten und Maus-Buttons abfragen oder
mit SDL_GetRelativeMouseState die Maus-Bewegung
seit dem letzten Aufruf ermitteln.

 
Home