Tutorial SDL

Tutorial sobre a biblioteca SDL com exemplos práticos.

[ Hits: 47.823 ]

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 fácil um pinguim no Inkscape

Algoritmo Antissocial - Recuperando o Controle da sua Mente

Programação de Jogos com SDL

Criatividade para TI parte 1

Desenhando um avatar do Tux no InkScape

Leitura recomendada

Algoritmo... como fazer?

Linguagem C - Árvores Binárias

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

Linguagem C - Listas Duplamente Encadeadas

Análise dos Métodos de Ordenação usados em Algoritmos Computacionais

  
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