Tutorial SDL

Tutorial sobre a biblioteca SDL com exemplos práticos.

[ Hits: 47.817 ]

Por: Samuel Leonardo em 01/11/2013


Controlando uma imagem com o teclado



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:
Página anterior    

Páginas do artigo
   1. Introdução
   2. Aplicação básica
   3. Dando vida ao programa: o loop principal
   4. Eventos no SDL
   5. Controlando uma imagem com o teclado
Outros artigos deste autor

Desenhando um avatar do Tux no InkScape

Desenhando fácil um pinguim no Inkscape

Programação de Jogos com SDL

Dicas para aprender programação

Criatividade para TI parte 1

Leitura recomendada

Guia de Programação em C/GTK 2 - Construindo uma Calculadora Completa

Linguagem C - Listas Duplamente Encadeadas

Otimização de algoritmos

Linguagem C - Árvores Binárias

Algoritmo... como fazer?

  
Comentários
[1] Comentário enviado por nelson777 em 01/11/2013 - 15:40h

Finalmente um artigo de C que não é só mais um algoritmo básico de criança e sim algo útil. Parabéns.

[2] Comentário enviado por tsuriu em 03/11/2013 - 20:49h

Parabéns cara... Muito bom o artigo.

[3] Comentário enviado por danilo3610 em 04/11/2013 - 08:53h

Muito bom tutorial Samuel, segui passo a passo este tutorial no meu ubuntu 13.10 64bits,
instalei o SDL_DEV e usei o seu primeiro exemplo porem ao compilar (incluindo -ISDL)
apresentava erros com SDL_Init - "Undefined reference to SDL_Init...". Procurei na net
mas ninguem teve este mesmo problema, já aconteceu com alguem? Se alguem tiver alguma
solução agradeço. Lembrando instalei o SDL_DEV como mostra o tutorial.

att.

[4] Comentário enviado por SamL em 04/11/2013 - 11:32h

Esse problema geralmente acontece quando NÃO se usa -lSDL no final do comando. Veja se você compilou assim: gcc -o janela_01 janela_01.c -lSDL
com o link -lSDL no final.
Se não resolver talvez você tenha instalado a SDL 2.0, veja na pasta /usr/include/ se tem a pasta SDL2.
Se também não resolver, não sei mais o que fazer rsrsrs

[5] Comentário enviado por danilo3610 em 04/11/2013 - 14:00h

Talvez tenha confundido mas só uma duvida, a primeira letra é um l ou i maiúsculo? Desconfio que seja um L minúsculo e
tenha colocado um i maiúsculo no lugar. Quando chegar em casa irei testar.

[6] Comentário enviado por SamL em 04/11/2013 - 14:03h

É um L minúsculo. Avisa se funcionar quando testar.

[7] Comentário enviado por danilo3610 em 04/11/2013 - 19:24h

Era isso mesmo, troquei o I pelo l e funcionou, obrigado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts