sexta-feira, 8 de outubro de 2010

Hello World em C++ com SDL

Olá, programadores novatos.
Hoje vou ensinar a vocês como criar um Hello World em C++ usando a biblioteca SDL.

Pra quem não conhece esta biblioteca, SDL serve para criar jogos e aplicações multimídia que são bem portáveis e rodam em Windows, Linux, e vários outros sistemas operacionais. Também por esse motivo, SDL é um tanto mais complicado de aprender a usar do que a biblioteca Allegro, por exemplo.

Entre os problemas desta biblioteca, posso citar que a SDL em si própria não tem suporte para fontes True Type, ou seja, não tem como escrever "Hello World" na janelinha sem instalar uma outra biblioteca adicional chamada SDL_TTF que acrescenta essa funcionalidade, ou então (se você for esperto e craque em C++, como eu, hehehe) você terá que incluir no seu próprio programa algum sistema que possa criar, manipular e desenhar os caracteres na tela. Outro problema é que a SDL não inclui funções para desenhar gráficos primitivos, como pontos, linhas, círculos, retângulos, etc. para isso, você mesmo precisa desenvolver essas funções! Ou seja, mesmo para desenhar um mísero pixel na janela, você vai precisar estudar muito como funciona toda essa parafernalha.

Mas como o objetivo aqui é dar apenas uma breve introdução de como inicializar a SDL e mostrar uma janelinha preta na tela, o programa a seguir não faz p**** nenhuma a não ser incializar a SDL e mostrar uma janelinha preta na tela :P Para se aprofundar, tem que estudar muito a documentação.


Ainda não tem SDL?


Baixe aqui o DevPak para o Dev-C++:
http://www.bestratetech.com/downloads/SDL-1.2.13-1ea.DevPak

Não usa Dev-C++? Baixe o .ZIP e se vire nos trinta:
http://www.libsdl.org/release/SDL-1.2.14-win32.zip


Outro detalhe, eu suponho que você esteja usando Dev-C++ no Windows. Assim que baixar o DevPak, clique duas vezes no ícone dele que a partir daí é tudo automático. Glória ao Dev-C++!


Então, agora vamos ver como configurar o Dev-C++ para dar tudo certo no seu programa com SDL:


1 - Crie um novo projeto, clicando em Arquivo > Novo > Projeto...
2 - Na aba "Basic" clique no ícone "Windows Application", dê um nome ao projeto e clique em Ok.
3 - Clique em Projeto > Opções do Projeto.
4 - Na aba "Parâmetros", dentro da caixa "Linker", digite o seguinte:


-Imingw32
-ISDLmain
-ISDL


O importante é que deve estar nesta mesma ordem, ou não vai funcionar! Repare que a primeira letra é um 'I' de "Importante", então não confunda com um 'L' minúsculo (eu confundi muito no início!). Então, dê um Ok e começe a programar!

Se você tentou tudo e não deu certo, deixe aqui um comentário que eu resolvo o problema.

Vamos lá então! Control-C e Control-V neste código!



//-------------------------------------------------------
// Exemplo de como criar uma janela com SDL!
//-------------------------------------------------------

#include "stdio.h"
#include "stdlib.h"
#include "SDL.h"

#define SCREEN_W 640 // Largura da tela (ou janela)
#define SCREEN_H 480 // Altura da tela (ou janela)

// ATENÇÃO: O cabecalho da funcao main() deve ser
// exatamente igual ao mostrado aqui!

int main( int argc, char* argv[] )
{
// Inicializa o video
if ( SDL_Init( SDL_INIT_VIDEO ) != 0 )
{
// Se nao conseguiu inicializar,
// escreve mensagem de erro num arquivo

fprintf( stderr, "ERRO: SDL nao pode inicializar o video!\n" );

// Aborta o programa
exit(1);
}

// Ponteiro para SDL_Surface, que sera a janela onde roda o programa
SDL_Surface* screen;

// Cria a janela do programa
screen = SDL_SetVideoMode( SCREEN_W, SCREEN_H, 0, SDL_SWSURFACE );

// Define titulo da janela
SDL_WM_SetCaption( "Hello World com SDL!", NULL );

// Programa deve continuar rodando (true) ou encerrar (false)?
bool running = true;

// Evento SDL
SDL_Event event;

// Loop principal, executa enquanto running = true
while( running )
{
// Verifica se ha eventos para processar
SDL_PollEvent( &event );

// Verifica qual o tipo do evento
switch( event.type )
{
// Se alguma tecla foi pressionada
case SDL_KEYDOWN:

// Verifica se a tecla que foi pressionada era ESC
if( event.key.keysym.sym == SDLK_ESCAPE )

// Se era ESC entao programa deve encerrar
running = false;
else
// Senao continua a execucao
continue;

break;
}
}
}


Dúvidas? Me pergunte!