.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

quarta-feira, 21 de novembro de 2007

SDL - A Biblioteca dos Jogos 2D

Esta será uma abordagem para iniciantes em SDL. Será o seu primeiro passo rumo à programação de jogos 2D.
Estarei utilizando o Dev-Cpp e também o gcc no Linux.
Aprenda como instalar a SDL e como criar um projeto SDL no Dev-Cpp. Entenda como usar os parâmetros do linker no Dev-Cpp e no gcc.

» Post Completo...

#include <SDL/SDL.h>
SDL_Surface *screen = NULL;
SDL_Surface *img = NULL;
void pintar_tela(){
SDL_FillRect(screen, NULL, cor);
SDL_BlitSurface(img, NULL,screen, NULL);
}
int main(int argc, char *argv[]){
//--- Inicializando a SDL... ---//
SDL_Init(SDL_INIT_VIDEO); //- sem tratar erro
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_DOUBLEBUF);
SDL_WM_SetCaption("Título da aplicação", NULL);
//--- Carregando... ---//
img = SDL_LoadBMP("img.bmp");
//--- GAME LOOP ---//
int done=0;
SDL_Event event;
SDLKey key;
while(!done){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT: //- evento para fechar a janela
done = 1;
break;
}
}
pintar_tela();
SDL_Flip(screen);
SDL_Delay(1);
}
//--- Descarregando... ---//
SDL_FreeSurface(img);
SDL_Quit();
return 0;
}

Download: » código fonte

*** Compilando ***
Apenas apertar F9 pode não resolver o seu problema. Pode ocorrer algo do tipo:

[Linker error] undefined reference to `SDL_Init'
[Linker error] undefined reference to `SDL_SetVideoMode'

Se isto ocorrer é porque está faltando algum parâmetro no projeto. Vá em Opções do Projeto e na aba parâmetros se certifique de encontrar -lmingw32 -lSDLmain -lSDL no campo Linker.
Se o seu caso for Linux, não se esqueça de incluir todos os comandos necessários. Para facilitar as coisas fiz um Makefile e para compilar basta digitar $ make.

# -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
SDL_CFLAGS=`sdl-config --cflags`
# -L/usr/lib -lSDL
SDL_LIBS=`sdl-config --libs`

all: sdl
sdl: main.c
gcc $< -o $@ $(SDL_CFLAGS) $(SDL_LIBS)


*** O que mais devo saber ?! ***
Não se esqueça que seu programa em SDL precisa da SDL.dll para funcionar. Você poderá encontrá-la em C:\Dev-Cpp\bin. Se a SDL.dll não estiver junto ao seu programa ou em system32 seu executável será inútil.
No Linux a saida do printf é direcionada para o console normalmente, mas no Windows ela é direcionada para os arquivos stdout.h e stderr.txt.
Eu apresentei sobre a SDL, mas a lib Allegro também é muito boa.
SDL não é só isto não ! Você pode utilizar mais bibliotecas como:
» SDL_Image - Para carregar png, jpg e muitos outros formatos.
» SDL_Mixer - Para carregar ogg, mp3.
» SDL_Ttf - Para carregar fontes TrueType.
» SDL_Net - Para conexões socket. (Ainda vou testar !)
» SDL_Gfx - Para fazer zoom, rotacionamentos e imprimir primitivas gráficas. (Não sei porque ela não está junta com as outras !)
» SDL_Collide - Para testar colisões entre objetos. (Também não está junta com as outras !)
SDL_... Faz o seguinte... invente a sua !
Os jogos são mais do que uma biblioteca pode suportar, e sempre existirá uma brecha que não foi projetada. As primeiras engines não estavam preparadas para os MMORPG's da vida e talvez as de hoje também não estejam !!!

*** Jogos ***
O meu jogo Quebra-Cabeça foi feito em SDL. Mas ele não impressiona muito !
Você conhece o jogo Worms Armageddon ?
Este é o Wormux, é clone do Worms e é feito em SDL !!!
Lançaram o Worms 3D e ainda não vi nenhum clone dele !
SDL pode trabalhar com 3D utilizando OpenGl, mas de longe é o assunto deste post !

*** Testes ***
Meu PC não é dos mais modernos, mas é o único que tenho !!!
Pelos testes dá pra ver que 32bpp é o ideal !

processador: AMD Athlon XP (2800+)
clock: 2.082 GHz
GPU: GeForce4 MX 4000 128MB
[Ubuntu 7.04 + GPU]
174 FPS - 640x480x32 sem SDL_Delay
82 FPS - 640x480x32 com SDL_Delay(1)
120 FPS - 800x600x32 sem SDL_Delay
62 FPS - 800x600x32 com SDL_Delay(1)
76 FPS - 640x480x24 sem SDL_Delay
52 FPS - 800x600x24 sem SDL_Delay
90 FPS - 640x480x16 sem SDL_Delay
62 FPS - 800x600x16 sem SDL_Delay
152 FPS - 640x480x8 sem SDL_Delay
110 FPS - 800x600x8 sem SDL_Delay

*** Link's ***
Download: » código fonte
» SDL
» SDL (Documentação)
» Lazyfoo (Tutoriais SDL)
» Criando uma janela SDL (por Vinícius Godoy)
» Dev-Cpp
» Compilando com gcc e Makefile
» Devpaks
» Wormux (Worms Clone)

5 comentários:

Anônimo disse...

Muito bom o texto. Mas eu recomendo aos leitores FORTEMENTE o uso do Code::Blocks no lugar do DevCpp. O Dev não tem atualizações há um bom tempo e tem uma integração fraca com o depurador e a identação também incomoda um pouco.

Diogo_RBG disse...

agradeço o comentário.

Realmente o Dev é muito popular por seus bugs !
Não comentei sobre o Code::Blocks porque nunca cheguei a me familiarizar com ele. Passei a usar Linux antes de conhecê-lo.

Unknown disse...

Excelente artigo Diogo. Texto claro e objetivo. A didática está muito boa também. Parabéns!

Diogo_RBG disse...

vlw !

Anônimo disse...

Esta dando esse erro [erro]SDL/SDL.h: no such file or diirectory