[Precedente]
Contenuti
[Successivo]
Usare la Simple DirectMedia Layer API
Video
- Scegliere il modo
video (il metodo facile)
Semplicemente, si sceglie la risoluzione e la
profondita' di colore desiderata, e le si setta!
|
Suggerimento #1:
E' possibile trovare la profondita' di colore piu' veloce sopportata
dall'hardware con la funzione SDL_GetVideoInfo().Suggerimento
#2:
E' possibile ottenere una lista delle risoluzioni video supportate
per una specifica profondita' di colore mediante la funzione
SDL_ListModes().
|
Esempio:
{ SDL_Surface *screen;
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
if ( screen == NULL ) {
fprintf(stderr, "Impossibile usare il modo 640x480: %s\n",
SDL_GetError());
exit(1);
}
}
|
- Disegno di pixel sullo schermo
Il disegno diretto sullo schermo e' eseguito
scrivendo in modo diretto sul framebuffer grafico, e
chiamando successivamente la funzione di aggiornamento del
video.
|
Suggerimento:
Se si sa che l'applicazione fara' uso intensivo del disegno
su schermo, e' opportuno bloccare lo schermo (se necessario)
prima di iniziare un disegno, effettuare il disegno tenendo
una lista di aree che dovranno essere aggiornate, e sbloccare
lo schermo prima di aggiornare il display. |
Esempio: Disegno
di un pixel su uno schermo di formato arbitrario
#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: { /* Assumiamo 8-bpp */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*bufp = color;
}
break;
case 2: { /* Probabilmente 15-bpp o 16-bpp */
Uint16 *bufp;
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
}
break;
case 3: { /* Lento modo a 24-bpp, di solito non usato */
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: { /* Probabilmente 32-bpp */
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);
}
|
- Caricamento e visualizzazione di immagini
SDL fornisce una sola funzione di caricamento
delle immagini, SDL_LoadBMP(). Una libreria di
funzioni per caricare vari tipi d'immagine
puo' essere trovata nell'archivio SDL demo.
E' possibile visualizzare immagini usando la
funzione SDL_BlitSurface() per copiare un'immagine
su un framebuffer grafico. SDL_BlitSurface()
adatta in modo automatico il rettangolo di visualizzazione
che dovrebbe poi essere passato a SDL_UpdateRects()
per specificare le porzioni di schermo che devono
essere aggiornate.
|
Suggerimento #1:
Se si e' caricata un'immagine che verra' mostrata molte
volte, e' possibile migliorare le prestazioni del blit
convertendo l'immagine al formato attuale dello schermo. La
funzione SDL_DisplayFormat() esegue questa conversione.
Suggerimento #2:
Molte immagini usate come sprite hanno il background
trasparente. E' possibile abilitare i blit trasparenti
(con colore chiave) con la funzione SDL_SetColorKey().
|
Esempio:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
SDL_Surface *image;
SDL_Rect dest;
/* Carica un file BMP su una superficie */
image = SDL_LoadBMP(file);
if ( image == NULL ) {
fprintf(stderr, "Impossibile caricare %s: %s\n",
file, SDL_GetError());
return;
}
/* Copia sulla superficie dello schermo
La superficie dovrebbe essere bloccata a questo punto.
*/
dest.x = x;
dest.y = y;
dest.w = image->w;
dest.h = image->h;
SDL_BlitSurface(image, NULL, screen, &dest);
/* Aggiorna la parte di schermo che e' stata cambiata */
SDL_UpdateRects(screen, 1, &dest);
}
|
[Precedente]
Contenuti
[Successivo]
|