- 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
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.
Com estas simples funções já poderiamos criar uma janela e apresentar uma imagem, exemplo:
Esse método será visto no próximo capítulo, em eventos.
inicializar a SDL
inicializar o "display"// inicializar o Video
if( SDL_Init ( SDL_INIT_VIDEO ) == -1 ) {
/* caso a SDL encontre um erro ao inicilaizar */
}
// necessario
atexit(SDL_Quit);
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).SDL_Surface *s;
s = SDL_SetVideoMode(400, 400, 0, SDL_SWSURFACE | SDL_DOUBLEBUF );
if( s == NULL ){
/*foi encontrado um erro... */
}
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.
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: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 );
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.// pinta de novo toda a SDL_Surface* screen;
SDL_FLip(s);
// actualiza somente uma dada área
SDL_UpdateRect(screen, x, y , w ,.h);
Com estas simples funções já poderiamos criar uma janela e apresentar uma imagem, exemplo:
É 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.#include "TUT_SDL.h"
int main( int argc, char* argv[] )
{
SDL_Surface *screen = TUT_initSDL();
TUT_showImage( screen, "imagem.bmp" );
return 0;
}
Esse método será visto no próximo capítulo, em eventos.