SDL: Tastatur

Aus Wikibooks

Gründzüge des Arbeitens mit der Tastatur haben Sie schon im Kapitel SDL: Tastatureingaben kennen gelernt. Hier geht es nun darum, dieses Wissen zu vertiefen und einen vollständigen Einblick in die Tastaturbefehle zu erlangen.


Typen und Konstanten[Bearbeiten]

Die zentrale Datenstruktur ist SDLKey, eine Aufzählung (enum) aller möglichen Tastaturcodes. Typische Codes lauten SDLK_BACKSPACE für die Backspace-Taste oder SDLK_a für das Zeichen a. Bitte beachten Sie, daß es SDLK_A nicht gibt. Der Grund dafür ist, daß sie die Shift-Taste drücken würden, um an dieses Zeichen zu gelangen. Dieser Tastendruck wird, so er gleichzeitig mit dem Drücken der A-Taste erfolgt, gesondert aufgeführt. Ein vollständiger Tastendruck beinhaltet die folgende Information:

struct SDL_keysym
{
  Uint8 scancode;
  SDLKey sym;
  SDLMod mod;
  Uint16 unicode;
} SDL_keysym;

Wurde beispielsweise die Taste A gedrückt, steht SDLK_a in sym. Das Feld mod würde KMOD_LSHIFT oder, falls es die rechte gedrückte Shift-Taste war, KMOD_RSHIFT enthalten. Wurde kein Modifier betätigt, so würde mod die Konstante KMOD_NONE enthalten. All diese Informationen finden sie in der zu SDL gehörenden Datei SDL_keysym.h, auf die wir Sie verweisen müssen, da es zu viele Tastaturkonstanten gibt, als daß wir sie hier darstellen könnten.

Funktionen[Bearbeiten]

Unicode[Bearbeiten]

Um Unicode in Ihren SDL-Programmen zu verwenden, können sie die Funktion

 int SDL_EnableUNICODE (int ja_nein);

benutzen. Übergeben sie 1, wenn Sie Unicode benutzen wollen, 0, wenn sie Unicode deaktivieren wollen und -1, um lediglich die aktuelle Einstellung abzufragen. Die Funktion gibt die vorherige Einstellung der Unicode-Aktivierung zurück.

Tastaturwiederholung (Keyboard repeat)[Bearbeiten]

Halten Sie eine Taste dauerhaft gedrückt, kommt es unter Umstanden dazu, dass die gedrückte Taste entweder mehrfach betätigt wird oder nur ein einzelnes Mal. Dieses Verhalten, wie auch die Zeit, ab der Tastaturwiederholung beim Gedrückthalten der Tasten aktiviert wird kann mit der Funktion

 int SDL_EnableKeyRepeat (int delay, int intervall);

beeinflusst werden. Die Konstanten SDL_DEFAULT_REPEAT_DELAY und SDL_DEFAULT_REPEAT_INTERVAL sind typische Werte. Sie können delay auf 0 setzen, dann wird die Tastaturwiederholung komplett ausgeschaltet. intervall ist die Zeit (gemessen in Millisekunden) zwischen zwei zu erzeugenden Tastaturevents bei gehaltener Taste.

Zeigt her eure Tasten[Bearbeiten]

Mit

 Uint8 * SDL_GetKeyState (int *anz);

erhalten Sie ein Array aller Tasten. Sie können mit

Uint8 *alle_tasten = SDL_GetKeyState (NULL);
if (alle_tasten [SDLK_RETURN])
  /* die "Enter"-Taste wurde betätigt */

nachsehen, ob eine bestimmte Taste gedrückt wurde. Sie erhalten die Größe des Arrays in der Variablen anz, wobei Sie hier auch NULL übergeben können, wenn Sie darauf verzichten.

Status der Modifier[Bearbeiten]

Den Status der Modifier-Tasten (Shift, Alt, Steuerung, Numlock, Capslock, usw) können Sie mit

 SDLMod SDL_GetModState (void);

abfragen.

Um die Modifier besonders zu setzen, verwenden Sie die Funktion

 void SDL_SetModState (SDLMod status);

Name einer Taste[Bearbeiten]

Alle Tasten sind benannt. Mit

 char *SDL_GetKeyName (SDLKey taste);

bekommen Sie heraus, wie die Taste heisst.

Beispielprogramm[Bearbeiten]

Gleiter
Gleiter

Das folgende Programm benutzt die Tasten Links und Rechts, um einen kleinen Gleiter im Weltraum zu steuern. Mit Escape kann das Programm beendet werden. Ein Beispielgleiter soll dieses Bild sein, welches Sie zuerst in das Bitmap-Format konvertieren müssen. Fühlen Sie sich aber nicht an dieses Bild gebunden, entwerfen Sie Ihren eigenen 64*64 Pixel großen Raumgleiter.

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>

int main (void)
{
  SDL_Surface *screen, *tmp, *pic;
  SDL_Event e;
  SDL_Rect rect;
  Uint8 *alle_tasten;
  int quit = 0;
  if (SDL_Init (SDL_INIT_VIDEO) == -1)
    {
      fprintf (stderr, "Kann SDL nicht initialisieren: %s\n", SDL_GetError ());
      exit (1);
    }
  atexit (SDL_Quit);
  screen = SDL_SetVideoMode (640, 480, 24, SDL_HWSURFACE);
  if (screen == NULL)
    {
      fprintf (stderr, "Video Modus kann nicht eingerichtet werden: %s\n", SDL_GetError());
      exit (1);
    }
  if ((tmp = SDL_LoadBMP ("gleiter.bmp")) == NULL)
    {
      fprintf (stderr, "Bild konnte nicht geladen werden: %s\n", SDL_GetError());
      exit (EXIT_FAILURE);
    }
  SDL_SetColorKey(tmp, SDL_SRCCOLORKEY, SDL_MapRGB (tmp->format, 255, 255, 255));
  pic = SDL_DisplayFormat (tmp);
  SDL_FreeSurface (tmp);
  rect.x = 10;
  rect.y = 410;
  rect.w = 64;
  rect.h = 64;
  SDL_BlitSurface(pic, NULL, screen, &rect);
  SDL_UpdateRect (screen, rect.x, rect.y, rect.w, rect.h);
  SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, 1);
  while (!quit)
    {
      SDL_PollEvent (&e);
      alle_tasten = SDL_GetKeyState (NULL);
      if (alle_tasten [SDLK_ESCAPE])
        quit = 1;
      if (alle_tasten [SDLK_LEFT] && rect.x > 0)
        rect.x--;
      if (alle_tasten [SDLK_RIGHT] && rect.x < 576)
        rect.x++;
      SDL_BlitSurface(pic, NULL, screen, &rect);
      SDL_UpdateRect (screen, rect.x, rect.y, rect.w, rect.h);
    }
  return 0;
}