[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]
|