Pong

Bilder laden

Als nächtes müssen wir die ganzen Bilder irgendwie auf den Bildschirm bekommen. Da wir sie bereits innerhalb der Klasse geladen haben, mit SDL_LoadBMP(), brauchen wir die geladenen Bilder nurnoch auf den Bildschirm strahlen. Dafür gibt es die Funktion SDL_BlitSurface(). Wir fügen folgendes zwischen die Kommentare „DRAWING STARTS HERE“ und „DRAWING ENDS HERE“ ein:

// Load sprites
// players + ball
SDL_BlitSurface( pong.bmp, 0, screen, pong.get_position() );
SDL_BlitSurface( ping.bmp, 0, screen, ping.get_position() );
SDL_BlitSurface( ball.bmp, 0, screen, ball.get_position() );

Nun fallen uns 2 Dinge auf:

  1. Sprites werden vor dem Laden nicht gelöscht
  2. Sprites werden bei jedem Loop geladen

Um gegen das 1. vorzugehen, machen wir folgendes. Wir schreiben vor das Laden der Sprites:

// clear screen
SDL_FillRect( screen, 0, SDL_MapRGB( screen->format, 0, 0, 0 ) );

Dies füllt den Bildschirm mit der Farbe, die wir als Parameter übergeben(#000000=Schwarz). Um dem 1. entgegen zu wirken fügen wir eine boolean dem Code hinzu. Diese nenne ich update_sprites. Wenn update_sprits true ist, müssen die Bilder neu geladen werde, wenn nicht, dann nicht. Also sieht die Codestelle nun wie folgt aus:

        // DRAWING STARTS HERE
 
        if( update_sprites == true )
        {
            // clear screen
            SDL_FillRect( screen, 0, SDL_MapRGB( screen->format, 0, 0, 0 ) );
 
            // Load sprites
            // players + ball
            SDL_BlitSurface( pong.bmp, 0, screen, pong.get_position() );
            SDL_BlitSurface( ping.bmp, 0, screen, ping.get_position() );
            SDL_BlitSurface( ball.bmp, 0, screen, ball.get_position() );
            update_sprites = false;
        }
 
        // DRAWING ENDS HERE

Aber wir müssen die Variable vorher auch irgendwo deklarieren. Deshalb gehen wir an die Stelle, an der wir das erste mal die Positionen unserer Sprites verändern. Das ist beim Vergeben der Startpositionen. Also wird diese Stelle geändert zu:

ping.set_position( DEFAULT_GAP, screen->h / 2 - ping.bmp->h / 2 );
pong.set_position( screen->w - DEFAULT_GAP - pong.bmp->w, screen->h / 2 - pong.bmp->h / 2 );
bool update_sprites = true;

Damit werden unsere Bilder geladen und nur so oft, wie nötig. Weiter geht es mit dem Bewegen von Sprites.