SDL e C - Uma dupla sensacional

Neste artigo tentarei apresentar o uso simples da SDL com a linguagem C. Estarei mostrando alguns exemplos práticos para isso.

[ Hits: 50.708 ]

Por: André em 28/01/2011 | Blog: http://127.0.0.1


Inserindo uma imagem



Primeiramente vamos arranjar uma imagem .bmp, na internet você acha vários pacotes lotados de imagens nesse formato, com uma rápida pesquisa você acha um pacote desses. Enfim, para inserirmos uma imagem, vamos precisar declarar um ponteiro para a surface "imagem". Então, abaixo da linha:

SDL_Surface* tela;

Adicione:

SDL_Surface* imagem;

Se preferir, você pode iniciar as dias surfaces como NULL:

SDL_Surface* tela = NULL;
SDL_Surface* imagem = NULL;

Ótimo, agora vamos carregar a imagem. Faremos isso usando a função SDL_LoadBMP().

E, como fizemos anteriormente, vamos dizer que usaremos a surface "imagem" para atribuir a imagem em nossa "tela". E passaremos a imagem como argumento de função.

imagem = SDL_LoadBMP("woman.bmp");

O "woman.bmp" é a minha imagem, ela está no mesmo diretório do código. Mas você poderia buscada em outro diretório, como por exemplo:

imagem = SDL_LoadBMP("/home/USER/imagens/woman.bmp");

Ou simplesmente criar uma diretiva para isso:

#define CAMINHO_IMAGEM "/home/USER/imagens/woman.bmp"

E depois usar:

imagem = SDL_LoadBMP(CAMINHO_IMAGEM);

Mas não faremos isso agora. Vamos focar na imagem.

OK, carregamos a imagem, mas ainda não a colocamos em nossa "tela". Vamos fazer isso com a função SDL_BlitSurface().

Adicione a linha:

SDL_BlitSurface(imagem, NULL, tela, NULL);

Pronto! A imagem já foi aplicada à nossa "tela". Vamos agora usar uma função que "atualize" a nossa janela, a função é a SDL_Flip().

Como parâmetro de função, passamos o nome da surface responsável pela tela, neste caso, é "tela" mesmo. :)

SDL_Flip(tela);

Agora vamos liberar a imagem, para isso, use a função:

SDL_FreeSurface();

Passando como argumento a surface responsável pela determinada imagem, neste caso é "imagem" mesmo.

SDL_FreeSurface(imagem);

Após isso, já temos nosso código pronto. O código inteiro deve ficar assim:

#include <stdio.h>
#include <SDL/SDL.h>
#define ALTURA 640
#define LARGURA 480
#define BITS 16
#define TEMPO 4000

int main()
{
   SDL_Surface* tela = NULL;
   SDL_Surface* imagem = NULL;
  
   SDL_Init(SDL_INIT_EVERYTHING);
  
   SDL_WM_SetCaption("Meu programa", NULL);
  
   tela = SDL_SetVideoMode(ALTURA, LARGURA, BITS, SDL_SWSURFACE);
  
   imagem = SDL_LoadBMP("woman.bmp");
  
   SDL_BlitSurface(imagem, NULL, tela, NULL);
  
   SDL_Flip(tela);
  
   SDL_FreeSurface(imagem);
  
   SDL_Delay(TEMPO);
  
   SDL_Quit();
  
   return 0;
}

Vamos compilar e executar:

gcc SdlCode.c -o SdlCode -lSDL
$ ./SdlCode


Como saída você deve ter algo como:
Lá está, nossa imagem carregada na tela! :)

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Preparando o ambiente
   3. Conhecendo as primeiras funções
   4. Realizando alguns ajustes
   5. Inserindo uma imagem
   6. Conclusão
Outros artigos deste autor

Linux e Windows: Quebrando Estereótipos

L.F.A.Q : Linux Frequently Asked Questions

Acessando o Linux via SSH através do Android

lib cURL - Trabalhe com URLs em C

Livestation - Assista TV em seu GNU/Linux

Leitura recomendada

Linguagem C - Funções Variádicas

Criando aplicativos para o iPhone no Linux (sem Xcode e MacOS X)

Desenvolvendo para microcontroladores em GNU/Linux

Desenvolvendo um plugin de visualização para o XMMS (Parte 1)

Estudando recursividade direta e indireta

  
Comentários
[1] Comentário enviado por br_rafael em 30/01/2011 - 12:39h

#include <stdio.h>
#include <SDL/SDL.h>

int main(){
SDL_Surface* tela;
SDL_Init(SDL_INIT_EVERYTHING); // Iniciar o SDL
tela = SDL_SetVideoMode(640,480,16,SDL_SWSURFACE);
SDL_Delay(4000); // Esperar 4 segundos
SDL_Quit();
return 0;
}

Quando compilo aparece:

$ gcc -o teste-1-sdl teste-1-sdl.c
/tmp/cciduLoZ.o: In function `main':
teste-1-sdl.c:(.text+0xe): undefined reference to `SDL_Init'
teste-1-sdl.c:(.text+0x27): undefined reference to `SDL_SetVideoMode'
teste-1-sdl.c:(.text+0x35): undefined reference to `SDL_Delay'
teste-1-sdl.c:(.text+0x3a): undefined reference to `SDL_Quit'
collect2: ld returned 1 exit status


[2] Comentário enviado por br_rafael em 30/01/2011 - 12:43h

OK, eu tinha esquecido de colocar o "-lSDL" na hora de compilar.

[3] Comentário enviado por SamL em 30/01/2011 - 12:58h

Legal cara, nota 10. Se for escrever a parte 2 não hesite em pedir ajuda :)

[4] Comentário enviado por WhiteHawk em 30/01/2011 - 12:59h

Muito interessante este artigo. Uma coisa que eu não sabia era que o SDL também pode ser usado com Java.

[5] Comentário enviado por andrezc em 30/01/2011 - 13:06h

Pode deixar, Sam. Mais pra frente eu pretendo fazer a parte 2 sim. :D

[6] Comentário enviado por br_rafael em 30/01/2011 - 13:12h

Ficou uma sensação de quero mais...

Queria um "Parte 2" mostrando como fazer um personagem se movimentar de um lado a outro da tela (com as setas do teclado e o com o boneco em PNG mexendo as pernas).

[7] Comentário enviado por andrezc em 30/01/2011 - 13:20h

Oi, Rafael. Então, no próximo artigo eu estarei dando continuidade a manipulação de imagens na tela, mas se eu conseguir resumir bem, talvez dê para falar algo sobre eventos do teclado. Vou escrever a parte 2 sábado que vem.

[8] Comentário enviado por br_rafael em 30/01/2011 - 17:04h

Pra quem sabe ler inglês, esse tutorial é muito bom (estou lendo e praticando)
http://lazyfoo.net/SDL_tutorials/index.php

Esse artigo também é bom:
http://www.vivaolinux.com.br/artigo/SDL-Otimo-para-criacao-de-jogos

[9] Comentário enviado por andrezc em 30/01/2011 - 17:09h

A um tempo atrás o Sam L. havia me sugerido esse primeiro link. É sem dúvida alguma uma ótima referência. A melhor sobre SDL para C que já li.

[10] Comentário enviado por br_rafael em 30/01/2011 - 17:25h

andrezc, estarei aguardando ansiosamente pela "Parte 2". Eu pretendo trabalhar com jogos multiplataforma (Linux e Windows).

Quando eu ganhar R$ 1.000.000,00 com um jogo, estarei muito feliz ao ponto de liberar o código-fonte em licença GPL :) Tenho interesse em criar um jogo 2D de código-aberto para praticar minhas futuras habilidades. Quem souber SDL e C/C++ está convidado a participar. Programo em PHP desde de 2005, mas em C/C++ desde 2011 (não tenho nem 3 semanas de prática). O convite está ai, quem tiver interesse, entre contato comigo. Vamos aprender juntos? A ideia para o jogo eu já tenho.

Rafael A. de Almeida
[email protected]

[11] Comentário enviado por andrezc em 30/01/2011 - 17:53h

Mas você sabe que C e C++ são duas linguagem diferentes, não é ?! Não vou ajudar diretamente em seu projeto pois trabalho o dia inteiro e vou ao curso durante a noite, mas se tiver alguma dúvida e eu souber, eu respondo numa boa.

Boa sorte.

[12] Comentário enviado por br_rafael em 30/01/2011 - 18:11h

Sei que são diferentes, mas que sabe C pode aprender C++

[13] Comentário enviado por evamberto em 09/10/2011 - 19:43h

Quem quiser aprender mais sobre SDL olhe esse site show, http://lazyfoo.net/SDL_tutorials/ !!!!!!!

[14] Comentário enviado por evamberto em 09/10/2011 - 19:44h

parabéns pelo o artigo!!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts