Entries from julho 2007 ↓
julho 5th, 2007 — Artigos, SDL
Depois de configurarmos a SDL_gfx, vamos usá-la!
1
| #include "SDL/SDL_gfxPrimitives.h" |
Incluímos as headers da SDL_gfx que iremos usar.
No main, temos diversos métodos para desenhar. Cada um abaixo acompanha a descrição de seus parâmetros.
2
3
| //Desenha uma linha com anti-aliasing, para aumentar a qualidade
aalineRGBA(tela, 500, 20, 550, 150, 0, 0, 0, 255); |
int aalineRGBA(SDL_Surface * destino, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);
4
5
| //Desenha um círculo
filledCircleRGBA(tela, 50, 50, 30, 0, 0, 255, 255); |
int filledCircleRGBA(SDL_Surface * destino, Sint16 x, Sint16 y, Sint16 raio, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);
6
7
| //Desenha uma elipse
filledEllipseRGBA(tela, 200, 300, 100, 50, 125, 125, 255, 255); |
int filledEllipseRGBA(SDL_Surface * destino, Sint16 x, Sint16 y, Sint16 raiox, Sint16 raioy, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);
8
9
| //Desenha um retângulo
boxRGBA(tela, 400, 300, 600, 350, 255, 0, 0, 255); |
int boxRGBA(SDL_Surface * destino, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);
10
11
| //Desenha um triângulo
filledTrigonRGBA(tela, 200, 20, 300, 20, 240, 90, 255, 255, 0, 255); |
int filledTrigonRGBA(SDL_Surface * destino, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Sint16 x3, Sint16 y3, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);
12
13
| //Desenha uma string
stringRGBA(tela, 100, 400, "www.vitorbaptista.com", 0, 0, 0, 255); |
int stringRGBA(SDL_Surface * destino, Sint16 x, Sint16 y, char *string, Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha);
Agora já temos quase todo o conhecimento necessário para começar a desenvolver nosso Pong.
No próximo artigo irei mostrar uma forma de detecção de colisões bem básica, mas que irá servir bem para o que queremos.
Baixe os fontes deste exemplo aqui.
julho 5th, 2007 — Artigos, SDL

Como visto no post anterior, iremos instalar a SDL_gfx no Dev-C++, porém os passos aqui podem ser usados para instalar qualquer outra extensão que você precise.
Como de costume com o Dev-C++, temos duas opções para instalar a extensão. Ou baixa os fontes e instala manualmente, ou usa um .DevPak.
Não vou tentar te ensinar como instalar manualmente pois, por não usar mais o Windows, não sei. Caso precise, não deve ser muito complicado. Você pode baixar a SDL_gfx de seu site oficial e seguir as instruções de instalação.
Vamos começar a instalação com o .DevPak.
- Baixe o arquivo aqui;
- Vá em Tools/Package Manager;
- Clique em Install;
- Uma tela irá aparecer para você mostrar aonde está o .DevPak;
Pronto! Seu Dev-C++ já deve estar configurado.
No próximo post irei dar um exemplo do SDL_gfx.
julho 5th, 2007 — Artigos, SDL
A base da SDL se limita a algumas funções mais básicas, gerais pra diversos tipos de aplicações. Porém, em praticamente todos os jogos que você for fazer, você irá precisar de alguns métodos que a base da SDL não possui.
As extensões oficiais podem ser encontradas aqui, porém não vamos usá-las agora.
Como esses artigos são preparatórios para nosso primeiro jogo, um clone do Pong, vou ensinar como instalar a SDL_gfx, que adiciona funções para desenharmos, por exemplo, círculos, retângulos, etc.. A usaremos mais tarde para desenhar a bola e as barras do Pong.
Apesar de eu só mostrar como instalar a SDL_gfx, o procedimento é análogo para qualquer outra extensão.
As principais distribuições possuem a SDL_gfx em seus repositórios. Caso você use o Gentoo, basta digitar, como root:
emerge sdl-gfx
Caso use o Ubuntu,
apt-get install libsdl-gfx1.2-dev
Para as distribuições baseadas no Fedora, no próprio site da SDL_gfx há um .rpm para download, mas é de uma versão mais antiga. Baixe o SDL_gfx-devel-x.x.x-x.i386.rpm.
Se você usar outra distribuição, procure um pacote para ela. Caso não consiga encontrar, ou queira uma versão mais nova não disponível em seus repositórios, baixe os fontes e siga as instruções.
Depois de instalada a SDL_gfx, sigamos com o artigo.
Iremos ver como configurá-la no Anjuta e no shell.

Anjuta
- Abra o Anjuta e vá em Settings/Compiler and Linker Settings…;
- Vá na aba Libraries, escreva SDL_gfx no campo de texto e clique em Add.
Pronto, seu Anjuta está configurado corretamente. Siga até o final deste artigo e tente compilar o programa-teste para checar se está tudo certo.

Shell
- Compile usando:
g++ -o programa programa.cpp -lSDL -lSDL_gfx
Pronto, a SDL_gfx já deve estar configurada agora. Em um próximo post irei mostrar um exemplo do uso dela. Até lá.
julho 1st, 2007 — Artigos, SDL
Neste artigo da série irei mostrar brevemente o que são eventos e como funciona o tratamento deles no SDL, modificando nosso Hello World para ser finalizado caso o usuário aperte ESC ou clique no botão de fechar(aquele no canto superior direito da janela).
Vamos começar.
O que é um evento?
Eventos são ações que o usuário executa para interagir com o programa.
Como exemplos podemos citar clicar/mover com o mouse, apertar/soltar uma tecla, mexer num joystick, etc.. Existem diversos eventos diferentes.
Uma lista completa dos eventos tratados pela SDL pode ser encontrada na parte de eventos de sua documentação.
A SDL nos dê várias ferramentas para tratar eventos. Uma delas é a estrutura SDL_Event, uma das mais importantes na SDL. Ela é usada principalmente para ler os eventos que estão na fila da SDL, mas também pode ser usada para colocar eventos nessa fila, normalmente para simular um evento feito pelo usuário.
A estrutura dela é bem simples, sua definição é:
typedef union{
Uint8 type; //Tipo de evento
SDL_ActiveEvent active; //Janela ganha/perde foco
SDL_KeyboardEvent key; //Evento do teclado
SDL_MouseMotionEvent motion; //Movimento do mouse
SDL_MouseButtonEvent button; //Clique do mouse
SDL_JoyAxisEvent jaxis; //Movimento da axis do joystick
SDL_JoyBallEvent jball; //Movimento da trackball do joystick
SDL_JoyHatEvent jhat; //Movimento da hat do joystick
SDL_JoyButtonEvent jbutton; //Botões do joystick
SDL_ResizeEvent resize; //Evento de redimensionamento da janela
SDL_QuitEvent quit; //Evento para fechar a janela
SDL_UserEvent user; //Evento definido pelo usuário
SDL_SywWMEvent syswm; //Eventos específicos da plataforma, que não são tratados pela SDL
} SDL_Event;
Conhecendo esta estrutura, fica fácil ler os eventos.
Vamos começar a modificar o código do nosso Hello World.
Como o código já foi explicado em um artigo anterior, só vou mostrar as partes que mudaram.
17
18
| //Variável que guarda a estrutura dos eventos da SDL
SDL_Event evento; |
Aqui declaramos nosso SDL_Event, que irá guardar as informações dos eventos para tratarmos.
94
95
96
97
98
| //Início do main
int main (int argc, char* args[])
{
//Variável que irá controlar se o usuário quer finalizar o programa
bool sair = false; |
Como precisamos saber quando o usuário quer sair, declaramos a variável booleana sair que irá controlar a saída do loop principal do programa.
111
112
113
114
115
| //Loop principal
while (!sair) //Enquanto o usuário não quiser sair...
{
//Enquanto houver um evento na fila para tratar
while (SDL_PollEvent(&evento)){ |
No nosso loop principal, enquanto a variável sair for false, atualizamos os eventos chamando o método SDL_PollEvent, que joga os eventos novos em um SDL_Event passado como parâmetro. Usamos ele dentro de um while pois pode haver mais de um evento a ser tratado, e queremos tratar todos.
116
117
118
119
120
121
| //Se o evento for SDL_QUIT ou se for SDL_KEYDOWN(tecla pressionada) e a tecla for ESC...
if ((evento.type == SDL_QUIT) | ((evento.type == SDL_KEYDOWN) && (evento.key.keysym.sym == SDLK_ESCAPE)))
//Seta a variável sair para true, fazendo com que, na próxima iteração
//do while mais externo, ele saia do loop
sair = true;
} |
Testamos nosso SDL_Event evento. Caso o tipo dela seja SDL_QUIT, ou seja, o usuário apertou o botão de sair(o do canto superior direito), ou se o evento for do tipo SDL_KEYDOWN, ele pressionou alguma teclado teclado, e essa tecla for ESC, nós setamos sair para true, para que, na próxima iteração a condição do while não seja satisfeita para sairmos desse loop.
122
123
124
| //Pausa o programa para evitar o consumo excessivo da CPU
SDL_Delay(50);
} |
Aqui a cada iteração do while nós damos um delay de 50ms para evitar que nosso programa consuma muitos recursos da CPU.
125
126
127
128
129
130
| //Libera os recursos e destrói a SDL
quit();
//Termina a execução
return 0;
} |
Após o while nós executamos as funções para destruir a SDL e liberar as superfícies utilizadas e paramos a execução do programa.
Nesta versão do Hello World eu organizei um pouco, colocando toda a inicialização na função init() e a finalização em quit() mas, fora isto, o código é o mesmo.
Pronto, compile o código e teste.
Há muito mais a se falar sobre tratamento de eventos, porém o que mostrei neste artigo já é suficiente para grande parte dos casos.
No próximo artigo irei ensinar como instalar bibliotecas que aumentam as capacidades da SDL. Iremos instalar a SDL_gfx e irei dar um exemplo de como desenhar figuras geométricas na tela, que vamos usar no nosso Pong.
Até lá você pode ler a documentação da SDL e/ou também esta, que achei melhor até que a oficial.
Bons estudos e até a próxima.
Baixe os fontes e a imagem deste tutorial aqui.