[Anterior]
Conteúdo
[Próximo]
Usando a API Simple DirectMedia Layer
Vídeo
- Escolhendo e ajustando o modo de tela
(o jeito fácil)
Você simplesmente escolhe sua profundidade- de- bits (bits-por-ponto) e
resolução favorita e ajusta!
|
Dica #1:
Você pode encontrar a profundidade de vídeo mais rápida suportada pelo hardware com a
função SDL_GetVideoInfo().
Dica #2:
Você pode obter uma lista de resoluções de vídeo em uma
profundidade-de-bits em particular suportadas usando a função
SDL_ListModes().
|
Exemplo:
{ SDL_Surface *screen;
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
if ( screen == NULL ) {
fprintf(stderr, "Impossível ajustar ao vídeo em 640x480 : %s\n", SDL_GetError());
exit(1);
}
}
|
- Desenhando pixels na tela
Para desenhar na tela , escreve-se diretamente no
framebuffer (que armazena cada tela antes de sua exibição)
gráfico e chamando a função de atualização da tela
|
Dica:
Se você sabe que ira desenhar muito na tela, é melhor trancar a
tela ( se necessário) antes de desenhar, desenhar enquanto mantém uma
lista de áreas necessária de se atualizar, e destrancar a tela
novamente antes de atualiza-la.
|
Exemplo:
Desenhando um pixel em uma tela de formato arbitrário
void DrawPixel(SDL_Surface *screen, 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: { /* Assumindo 8-bpp */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*bufp = color;
}
break;
case 2: { /* Provavelmente 15-bpp ou 16-bpp */
Uint16 *bufp;
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
}
break;
case 3: { /* mode 24-bpp lento,normalmente não usado */
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*(bufp+screen->format->Rshift/8) = R;
*(bufp+screen->format->Gshift/8) = G;
*(bufp+screen->format->Bshift/8) = B;
}
break;
case 4: { /* Provavelmente 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);
}
|
- Carregando e exibindo imagens na tela
SDL prove uma única rotina de carregamento de imagens
para sua conveniência,SDL_LoadBMP().Uma biblioteca para
carregamento de imagens pode ser encontrado no arquivo de
demos do SDL.
Você pode exibir imagens usando SDL_BlitSurface() para
copia-las no framebuffer gráfico. SDL_BlitSurface()
automaticamente delimita a área copiada, que deve ser
passado para SDL_UpdateRects() para atualizar a porção da
tela que foi modificada.
|
Dica #1:
Se você esta carregando uma imagem para ser exibida muitas vezes,você
pode melhorar a velocidade de copia,convertendo-a para o formato da
tela. a função SDL_DisplayFormat() faz esta convenção para você.
Dica #2:
Muitas sprites tem fundo transparente.Você pode habilitar copias
transparentes (copias em colorkey) com a função SDL_SetColorKey().
|
Exemplo:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
SDL_Surface *image;
SDL_Rect dest;
/* carrega o arquivo BMP na superfície */
image = SDL_LoadBMP(file);
if ( image == NULL ) {
fprintf(stderr, "Não foi possível carregar o arquivo %s: %s\n", file, SDL_GetError());
return;
}
/* Copia na superfície da tela. A superfície não pode estar trancada neste ponto. */
dest.x = x;
dest.y = y;
dest.w = image->w;
dest.h = image->h;
SDL_BlitSurface(image, NULL, screen, &dest);
/* Atualiza a porção modificada da tela */
SDL_UpdateRects(screen, 1, &dest);
}
|
[Anterior]
Conteúdo
[Próximo]
|