• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

SDL Conceitos Básicos

Serr@no™

GF Ouro
Membro Inactivo
Entrou
Set 23, 2006
Mensagens
1,690
Gostos Recebidos
0
A primeira coisa de que falarei é como inicializar a SDL e mostrar imagens. Para isso convém ter presente pelo menos um conceito base: uma Surface. Resumidamente uma Surface representa uma imagem.
inicializar a SDL

// inicializar o Video
if( SDL_Init ( SDL_INIT_VIDEO ) == -1 ) {
/* caso a SDL encontre um erro ao inicilaizar */
}
// necessario
atexit(SDL_Quit);
inicializar o "display"

SDL_Surface *s;


s = SDL_SetVideoMode(400, 400, 0, SDL_SWSURFACE | SDL_DOUBLEBUF );
if( s == NULL ){
/*foi encontrado um erro... */
}
A função SDL_SetVideoMode irá criar uma janela de 400 por 400, os outros parâmetros deixemos como estão, porque não precisaremos de os modificar (pelo menos nos exemplos deste Tutorial).
Depois de criar a janela retorna a Surface correspondente que será igualada a s. Por comodidade será criada uma função TUT_initSDL(int x, int y) a receber somente as dimensões da janela.
Com isto já se criou uma janela, agora convinha mostrar uma imagem. O código correspondente estará na função TUT_showImage("file.bmp", 10,20); Esta função suportará apenas o formato BMP. No código de exemplo para download tenho tenho bem explicadinho e comentado, não o vou passar aqui pelo tamanho, vou só explicar alguns conceitos basicos.
Neste exemplo, screen seria a própria janela. Para desenharmos a SDL_Surface *image teriamos de dizer em que zona seria, ouseja dar as coordenadas pretendidas.
SDL_Rect rectIm, rectScr;


rectIm.x = 0;
rectIm.y = 0;
rectIm.h = image->h;
rectIm.w = image->w;


rectScr.x = x;
rectScr.y = y;
rectScr.h = image->h;
rectScr.w = image->w;


// afectar a SDL_Surface de destino
SDL_BlitSurface ( image , &rectIm , screen , &rectScr );
Em português, no Blit o que se fará será pegar em todo o conteúdo da SDL_Surface* image e copiá-lo para a zona de screen dada pelo SDL_Rect pretendido. Isto por si só não mostra a imagem no ecrã! Aida se tem de actulizar a janela utilizando uma das seguintes funções:
// pinta de novo toda a SDL_Surface* screen;
SDL_FLip(s);
// actualiza somente uma dada área
SDL_UpdateRect(screen, x, y , w ,.h);
Porque é que não se pinta directamente no display? Pintar directamente no display seria mais lento e faria com que se visse a imagem a piscar. É muito mais rápido e eficaz afectar na memória e somente depois actualizar a imagem no ecrã. Esta técnica é conhecida por bouble buffering.
Com estas simples funções já poderiamos criar uma janela e apresentar uma imagem, exemplo:
#include "TUT_SDL.h"


int main( int argc, char* argv[] )
{
SDL_Surface *screen = TUT_initSDL();


TUT_showImage( screen, "imagem.bmp" );


return 0;
}
É claro que se esperimentarem este exemplo não vão ver nada, isto porque nada diz ao programa para parar e esperar uma acção do utilizador.
Esse método será visto no próximo capítulo, em eventos.
 
Topo