Entries from julho 2007 ↓

Exemplo da SDL_gfx

Depois de configurarmos a SDL_gfx, vamos usá-la!

Exemplo SDL_gfx
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.

Instalando extensões para a SDL – Windows

Dev C++
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.

  1. Baixe o arquivo aqui;
  2. Vá em Tools/Package Manager;
  3. Clique em Install;
  4. 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.

Instalando extensões para a SDL – Linux

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
Anjuta

  1. Abra o Anjuta e vá em Settings/Compiler and Linker Settings…;
  2. 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
Shell

  1. 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á.

Introdução ao tratamento de eventos na 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.