Tic-Tac-Toe - Spielsteine Laden und Anzeigen

Spielfeld mit zwei Spielsteinen

Nachdem wir bereits das Spielfeld gezeichnet haben wollen wir natürlich auch noch Spielsteine darauf anzeigen. In diesem Schritt werden wir deshalb die Spielsteine aus Bildern Laden und auf das Spielfeld zeichnen.

Bilder Laden

SDL_Surface* loadBMP( const char* file_name )
{
  SDL_Surface *tmp = SDL_LoadBMP(file_name);
  SDL_Surface *image = NULL;
 
  if( tmp )
  {
    image = SDL_DisplayFormat(tmp);
    SDL_FreeSurface(tmp);
 
    if( !image )
    {
      std::cerr << "Fehler beim konvertieren: "
                << SDL_GetError() << std::endl;
      return NULL;
    }
 
    SDL_SetColorKey
    (
      image,
      SDL_SRCCOLORKEY | SDL_RLEACCEL,
      SDL_MapRGB(image->format, 0, 255, 255)
    );
  }
  else
  {
    std::cerr << "Bild(" << file_name << ") konnte nicht geladen werden: "
              << SDL_GetError() << std::endl;
  }
 
  return image;
}


// Symbole laden
SDL_Surface *circle = loadBMP("circle.bmp");
SDL_Surface *cross  = loadBMP("cross.bmp");

Bilder anzeigen

Wie bereits gelernt haben können wir Bilder mit SDL_BlitSurface() anzeigen. Wir müssen also nur die Position der Spielsteine auf dem 3×3 Raster in Bildschirmkoordinaten umrechnen und können anschließend das Bild einfach in den Bildbuffer kopieren:

int x = 0, y = 0; // Die Position des Spielsteines im 3x3 Raster
                  // (x und y müssen jeweils 0, 1, oder 2 sein)
 
// Die Position in Bildschirmkoordinaten umrechnen
// 1. Zuerst verschieben wir an die linke obere Ecke des
//    Kästchen im Raster (x * SIZE/3., y * SIZE/3.)
// 2. Jetzt verschieben wir noch das Bild aus den Linien
//    des Raster heraus (+LINE_WIDTH/2. -> die Linie
//    in beide benachbarte Kästchen zur Hälfte hinein)
// 3. Am Ende addieren wir noch 0.5 um ein Runden der
//    möglicherweise nicht ganzen Zahlen zu erreichen.
SDL_Rect position = { x * SIZE/3. + LINE_WIDTH/2. + 0.5,
                      y * SIZE/3. + LINE_WIDTH/2. + 0.5 };
 
// Jetzt können wir wie bereits bekannt das Bild auf
// die berechnete Position am Bildschirm kopieren.
SDL_BlitSurface(cross, NULL, screen, &position);

Grundgerüst und Raster ← | ↑ Tic-Tac-Toe mit der SDL ↑ | → Spiellogik