Agora vamos aprender um pouco sobre jogos 2D. O que faremos, é mover uma imagem pelo screen usando as setas do teclado. Veja o código abaixo:
Arquivo:
control.c
#include <SDL/SDL.h>
int main()
{
SDL_Init(SDL_INIT_VIDEO); // Inicializa o SDL e o sistema de vídeo
SDL_Surface * screen; // A janela principal
SDL_Surface * image; // A imagem para mover
SDL_Event event; // Para os eventos
SDL_Rect dest = {0,0,0,0]; // Destino da imagem no screen
int velX = 0, velY = 0; // Velocidade X e velocidade Y da imagem
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE); // Cria a janela
image = SDL_LoadBMP("ball.bmp"); // Carrega a imagem
int done = 0; // Variável de controle do loop
while (done == 0) // Loop principal
{
// Lê a fila de eventos e põe o evento mais antigo em "event"
while (SDL_PollEvent(&event)) // Loop de eventos
{
// Verifica se o evento mais antigo é do tipo SDL_QUIT
if (event.type == SDL_QUIT) // Se o usuário clicou para fechar a janela
done = 1; // Encerre o loop
// Verifica se o evento mais antigo é do tipo SDL_KEYDOWN
if (event.type == SDL_KEYDOWN) // Se o usuário apertou um botão do teclado
{
// Verifica qual tecla foi apertada
switch (event.key.keysym.sym)
{
case SDLK_UP:
velY = -10;
break;
case SDLK_DOWN:
velY = 10;
break;
case SDLK_RIGHT:
velX = 10;
break;
case SDLK_LEFT:
velX = -10;
break;
default:
break;
}
}
if (event.type == SDL_KEYUP) // Se o usuário soltou um botão do teclado
{
// Verifica qual tecla foi solta
switch (event.key.keysym.sym)
{
case SDLK_UP:
velY = 0;
break;
case SDLK_DOWN:
velY = 0;
break;
case SDLK_RIGHT:
velX = 0;
break;
case SDLK_LEFT:
velX = 0;
break;
default:
break;
}
}
}
dest.x = dest.x + velX; // Soma a velocidade X
dest.y = dest.y + velY; // Soma a velocidade Y
SDL_FillRect(screen, NULL, 0x0); // Pinta todo o screen de preto
SDL_BlitSurface(image, NULL, screen, &dest); // Blita a imagem em dest
SDL_UpdateRect(screen, 0,0,0,0); // Atualiza todo o screen
SDL_Delay(60); // Espera 60 milissegundos
}
SDL_Quit(); // Fecha o SDL
return 0;
}
Para compilar:
gcc -o control control.c -lSDL
Quando o usuário APERTA uma tecla, verificamos qual foi e, então, alteramos a velocidade (X ou Y) para um valor diferente de zero.
Ao SOLTAR a tecla, obviamente depois de verificar qual tecla foi, fazemos a velocidade (X ou Y) igual a zero e a imagem que estava movendo pára. Observe que, ao definir a velocidade para a tecla
SDLK_DOWN (seta para baixo), mudou apenas o sinal da velocidade em relação à tecla
SDLK_UP (seta para cima).
O mesmo vale para
SDLK_RIGHT (seta direita) e
SDLK_LEFT (seta esquerda). Ou, melhor dizendo, se a
imagem for para cima, DIMINUA no eixo Y, se for para baixo, AUMENTE no eixo Y, se for para direita, AUMENTE no eixo X ou se for para esquerda, DIMINUA no eixo X.
É dessa maneira que o movimento em jogos 2D é feito.
Links
Veja abaixo, alguns links de tutoriais sobre SDL e programação de jogos: