[Précédente] Table Des Matières [Suivante]

Utiliser l'API Simple DirectMedia Layer

Video

  • Choisir et employer un mode vidéo (de manière facile)

    Vous choisissez votre résolution et votre profondeur de bits et c'est tout!

Astuce #1:
Vous pouvez trouver le mode vidéo le plus performant supporté par le matériel grâce à la fonction SDL_GetVideoInfo().

Astuce #2:
Vous pouvez récupérer une liste des résolutions supportées pour une profondeur demandée en utilisant la fonction SDL_ListModes().

Exemple:
{ SDL_Surface *screen;

    screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
    if ( screen == NULL ) {
        fprintf(stderr, "Impossible de passer en 640x480 en 16 bpp: %s\n", SDL_GetError());
        exit(1);
    }
}
  • Tracer un pixel à l'écran

    Afficher directement à l'écran est réalisé en écrivant directement dans le framebuffer, et en appelant la fonction de mise à jour.

Astuce:
Si vous allez faire beaucoup de traçage, il est bon de bloquer la mémoire vidéo (si nécessaire) avant d'afficher, tracez en gardant une liste des endroits à mettre à jour, et débloquez l'écran avant de mettre à jour.
Exemple:

Drawing a pixel on a screen of arbitrary format

#include <SDL_endian.h> /* Used for the endian-dependent 24 bpp mode */

void DrawPixel(SDL_Surface *screen, int x, int y,
Uint8 R, Uint8 G,
Uint8 B)
{
    Uint32 color = SDL_MapRGB(screen->format, R, G, B);

    if ( SDL_MUSTLOCK(screen) ) {
        if ( SDL_LockSurface(screen) < 0 ) {
            return;
        }
    }
    switch (screen->format->BytesPerPixel) {
        case 1: { /*On gère le mode 8bpp */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
            *bufp = color;
        }
        break;

        case 2: { /* Certainement 15 ou 16 bpp */
            Uint16 *bufp;

            bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
            *bufp = color;
        }
        break;

        case 3: { /* 24 bpp lent et généralement pas utilisé */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
            if(SDL_BYTEORDER == SDL_LIL_ENDIAN) {
                bufp[0] = color;
                bufp[1] = color >> 8;
                bufp[2] = color >> 16;
            } else {
                bufp[2] = color;
                bufp[1] = color >> 8;
                bufp[0] = color >> 16;
            }
        }
        break;

        case 4: { /* Probablement 32 bpp alors */
            Uint32 *bufp;

            bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
            *bufp = color;
        }
        break;
    }
    if ( SDL_MUSTLOCK(screen) ) {
        SDL_UnlockSurface(screen);
    }
    SDL_UpdateRect(screen, x, y, 1, 1);
}
  • Charger et afficher une image

    SDL fournit une routine simple de chargement d'image : SDL_LoadBMP(). Une librairie pour le chargement de différents types d'images est téléchargeable dans les archives des démos SDL.

    Vous pouvez afficher des images en utilisant SDL_BlitSurface() pour les copier directement dans le framebuffer. SDL_BlitSurface() sélectionne automatiquement la portion à copier, qui sera passée à SDL_UpdateRects() afin de mettre à jour la portion qui a changé.

Astuce #1:
Si vous chargez une image qui sera souvent affichée, vous pouvez améliorer la vitesse de copie en la convertissant au format de l'écran. Utilisez alors la fonction SDL_DisplayFormat().

Astuce #2:
Beaucoup de sprites ont un arrière plan transparent. Vous pouvez activer la copie transparente (colorkey blit) avec la fonction SDL_SetColorKey().

Exemple:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
    SDL_Surface *image;
    SDL_Rect dest;

    /* Charger une image BMP dans une surface*/
    image = SDL_LoadBMP(file);
    if ( image == NULL ) {
        fprintf(stderr, "Impossible de charger %s: %s\n", file, SDL_GetError());
        return;
    }

    /* Copie à l'écran.
	La surface ne doit pas être bloquée maintenant
     */
    dest.x = x;
    dest.y = y;
    dest.w = image->w;
    dest.h = image->h;
    SDL_BlitSurface(image, NULL, screen, &dest);

    /*Mise à jour de la portion qui a changé */
    SDL_UpdateRects(screen, 1, &dest);
}

[Précédente] Table Des Matières [Suivante]