SDL - Ótimo para criação de jogos

A biblioteca SDL foi criada para facilitar a criação de jogos em Linux, *BSD, MacOS, Win32 e BeOS. Por ser uma biblioteca multi-plataforma, você terá um único código de seu jogo para diferentes sistemas operacionais. Neste artigo abordarei o básico sobre o uso dessa poderosa biblioteca.

[ Hits: 53.328 ]

Por: Hunz em 12/01/2005 | Blog: http://tnegri.com/


Manipulação de eventos do teclado



Abordarei apenas a manipulação de eventos do teclado, mas a biblioteca SDL suporta a manipulação de eventos do mouse e de joysticks.

Creio eu que é mais fácil ver um código bem comentado do que várias linhas sobre teoria. Segue um exemplo com comentários.

/* Cria um manipulador de eventos, usado tanto para
teclado/*ouse/joystick */
SDL_Event event;
/* Inicia SDL */
....
/* Muda o Vídeo */
....
/* Principal Loop do jogo */
while (1) {
  /* Se algum evento for registrado */
  while (SDL_PollEvent(&event)) {
    /* Que tipo de evento foi registrado? */
    switch (event.type) {
      /* Pressionou tecla */
      case SDL_KEYDOWN:
        /* Qual tecla pressionada? */
        switch (event.key.keysym.sym) {
          case SDLK_ESCAPE:
            printf("ESC pressionado.\n");
            break;
          case SDLK_UP:
            printf("Seta para cima pressionada.\n");
            break;
          case SDLK_a:
            printf("A pressionado.\n");
            break;
        }
    }
  }
}

Simples, não? Aqui segue uma lista com todos eventos disponíveis no teclado (copiado do site SDLdoc):



Página anterior     Próxima página

Páginas do artigo
   1. Inicializando o uso do SDL em seu código
   2. Vídeo e gráficos
   3. Manipulação de eventos do teclado
   4. Links
Outros artigos deste autor

Sociedade, Software Livre e Linux

Deixando o GNOME mais adequado às leis de Fitts

Leitura recomendada

A duplicação do buffer de saída na chamada de sistema fork() do Linux

Estudando recursividade direta e indireta

Compilando o Mono 2.2 no Ubuntu 8.10

Algum humor e C++ Design Patterns (parte 2)

Sinais em Linux

  
Comentários
[1] Comentário enviado por Oki em 13/01/2005 - 00:12h

hunz,

Excelente artigo. Acho que o SDL está para o Linux assim como o directX está para o Windows. É uma pena que não exista uma biblioteca compatível com o directX, isso facilitaria muito a portabilidade de aplicativos.

Não sei se você sabe me responder, mas é possível trabalhar com diversas "surfaces" com SDL, ou seja, utilizar o processo de blit em surfaces diferentes, para ganhar velocidade da mesma forma que se faz com o directX?

[]'s
Celso Goya
PS: Se aceita a sugestão, um tutorial sobre sprites e sdl cairía como uma luva. :-)

[2] Comentário enviado por birilo em 13/01/2005 - 08:26h

Como funciona o SDL? É pra usar junto com OpenGL ou funciona sozinho?

[3] Comentário enviado por alsimoes em 13/01/2005 - 08:34h

O DirectX é um pacote composto pelo DirectDraw e Direct3D, um para gráficos 2D e outro 3D respectivamente. A SDL seria o DirectDraw do Linux enquando o Direct3D o OpenGL.

[4] Comentário enviado por alsimoes em 13/01/2005 - 08:45h

Complementando o meu comentário enterior...

É possivel criar jogos 3D usando a SDL da mesma forma que é possível criar jogos 2D com OpenGL, porém eu acredito que a diferença é a performace.

O jogo Super Tux por exemplo, é um jogo 2D mas há a opção de se jogar com OpenGL porém neste cado é preciso ter uma placa aceleradora de vídeo.

Já Quake 2 para jogar com aceleração de vídeo é preciso ter uma placa 3D e usar a renderização por OpenGL, quem não tem placa 3D pode jogar utilizando rendereização por software que neste caso usa a SDL.

[5] Comentário enviado por alvinlee em 13/01/2005 - 16:26h

Tem uma falha na linha 9. Só tem GetError eo certo é SDL_GetError :) eu acho né :P

[6] Comentário enviado por alvinlee em 13/01/2005 - 16:30h

Com relação aos games...Eu tenho um AMD K6-2 500Mhz placa de video SIS530 8Mb( não suporta 3d ) e 192Mb de RAM. Como eu faço pra jogar games 3d? Como o quake por exemplo.

[7] Comentário enviado por jose_maria em 13/01/2005 - 20:54h

Fico muito feliz por você ter feito esse artigo Thiago Negri. Parabéns.
Eu acho que eu posso responder algumas perguntas.

O SDL é uma biblioteca que ajuda o desenvolvedor a mexer com recursos multimídias (imagens, sons), trabalhar com os dispositivos de E/S (joystick, teclado, mouse),manipular erros e eventos, criar janelas etc.

Por isso tudo o SDL é muito bom para jogos. E uma coisa muito interessante é que ele é multiplataforma. Você pode programar e compilar seus programas tanto no Windows quanto no Linux. Então você não é dependente de DirectX no Windows.


O OpenGL pode/deve ser usado junto com o SDL por uma questão de facilidade (o SDL cria a janela, te ajuda com o teclado, joystick). Então para simplificar: jogos 2D = SDL. jogos 3D = SDL+OpenGL.

Eu estou fazendo um joguinho 2D em C usando SDL e GTK. Vocês podem dar uma conferida no beta em http://batalhao.codigolivre.org.br .

Para quem quer aprender SDL tem dois bons caminhos:
1) O livro "Programing Linux Games" do San Lantiga que você pode baixar em http://www.overcode.net/~overcode/writing/plg/
2) Estudar o código fonte aberto e livre de outros jogos.

[8] Comentário enviado por jose_maria em 13/01/2005 - 21:32h

O link que eu passei não está mais funcionando então eu fiz um mirror:
http://alu.dc.ufc.br/~silveira/temp/linux_games_programming.pdf

[9] Comentário enviado por fernandoamador em 16/01/2005 - 05:31h

Bom.

[10] Comentário enviado por hunz em 16/01/2005 - 10:50h

Fala ai pessoal!
Tava na praia curtindo minhas férias, hehehe.
Agora ficarei feliz se puder ajudar vocês com as dúvidas. :)

Criei um jogo em 2D usando SDL. Na verdade o jogo era pra ser 3D, mas infelizmente eu tive que formatar meu HD e acabei perdendo todo o código fonte dele e decidi fazer ele em 2D primeiro. Não sei onde hospeda-lo, se alguém souber, porfavor me diga! :)

Abraços,
Fiquem com Deus.

[11] Comentário enviado por jose_maria em 16/01/2005 - 12:16h

Sem dúvida o melhor lugar é o codigolivre.org.br.
Eu tenho 3 projetos hospedados lá e não tenho do que reclamar.
Ele oferece suporte a CVS, Fórums, BugTracker, MySQL e várias outras coisas.
E também ofecerece espaço na WEB e acesso via ftp. Além disso um nome como seu_projeto.codigolivre.org.br. E tudo isso de graça (para projetos de software livre é claro :D).
Mas tem também o gna.org e sourceforge.net.

[12] Comentário enviado por redstyle em 26/04/2005 - 02:05h

Tentei pegar o exemplo e compilar mais na hora de usar o gcc ele retornou falando que não achou o arquivo ou diretório SDL/SDL.h

Eu tenho que instalar o SDL ou ele já vem pronto pra usar...como seria isso?

[]'s

[13] Comentário enviado por utikawa em 03/05/2005 - 19:34h

Olá redstyle...
Você tem que instalar o SDL. Mas tem que ser a versão de desenvolvimento.
Na realidade, todas as bibliotecas que você for usar tem que ser instaladas as versões de desenvolvimento. Ela normalmente tem o nome libxyz-dev, onde xyz é o nome da biblioteca em questão...
Espero ter ajudado!

[14] Comentário enviado por removido em 20/11/2005 - 16:47h

www.superdownloads.ubbi.com.br

Nesse site vc pode achar o SDL.

[15] Comentário enviado por viniciusmarcius em 15/05/2007 - 20:07h

Valeu mesmo cara, são pessoas como vc q fazem o linux ficar tam melhor do que o vcs sabem quem. Abraço cara.

[16] Comentário enviado por f_Candido em 05/01/2008 - 00:21h

Muito Bom o Artigo. Parabéns.

[17] Comentário enviado por felipemartinsss em 28/07/2009 - 00:29h

Legal o artigo.
Animei para desenvolver algum artigo/jogo com SDL depois de ter lido.

Abraço


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts

SDLKey ASCII value Common name
SDLK_BACKSPACE'\b'backspace
SDLK_TAB'\t'tab
SDLK_CLEAR clear
SDLK_RETURN'\r'return
SDLK_PAUSE pause
SDLK_ESCAPE'^['escape
SDLK_SPACE' 'space
SDLK_EXCLAIM'!'exclaim
SDLK_QUOTEDBL'"'quotedbl
SDLK_HASH'#'hash
SDLK_DOLLAR'$'dollar
SDLK_AMPERSAND'&'ampersand
SDLK_QUOTE'''quote
SDLK_LEFTPAREN'('left parenthesis
SDLK_RIGHTPAREN')'right parenthesis
SDLK_ASTERISK'*'asterisk
SDLK_PLUS'+'plus sign
SDLK_COMMA','comma
SDLK_MINUS'-'minus sign
SDLK_PERIOD'.'period
SDLK_SLASH'/'forward slash
SDLK_0'0'0
SDLK_1'1'1
SDLK_2'2'2
SDLK_3'3'3
SDLK_4'4'4
SDLK_5'5'5
SDLK_6'6'6
SDLK_7'7'7
SDLK_8'8'8
SDLK_9'9'9
SDLK_COLON':'colon
SDLK_SEMICOLON';'semicolon
SDLK_LESS'<'less-than sign
SDLK_EQUALS'='equals sign
SDLK_GREATER'>'greater-than sign
SDLK_QUESTION'?'question mark
SDLK_AT'@'at
SDLK_LEFTBRACKET'['left bracket
SDLK_BACKSLASH'\'backslash
SDLK_RIGHTBRACKET']'right bracket
SDLK_CARET'^'caret
SDLK_UNDERSCORE'_'underscore
SDLK_BACKQUOTE'`'grave
SDLK_a'a'a
SDLK_b'b'b
SDLK_c'c'c
SDLK_d'd'd
SDLK_e'e'e
SDLK_f'f'f
SDLK_g'g'g
SDLK_h'h'h
SDLK_i'i'i
SDLK_j'j'j
SDLK_k'k'k
SDLK_l'l'l
SDLK_m'm'm
SDLK_n'n'n
SDLK_o'o'o
SDLK_p'p'p
SDLK_q'q'q
SDLK_r'r'r
SDLK_s's's
SDLK_t't't
SDLK_u'u'u
SDLK_v'v'v
SDLK_w'w'w
SDLK_x'x'x
SDLK_y'y'y
SDLK_z'z'z
SDLK_DELETE'^?'delete
SDLK_KP0 keypad 0
SDLK_KP1 keypad 1
SDLK_KP2 keypad 2
SDLK_KP3 keypad 3
SDLK_KP4 keypad 4
SDLK_KP5 keypad 5
SDLK_KP6 keypad 6
SDLK_KP7 keypad 7
SDLK_KP8 keypad 8
SDLK_KP9 keypad 9
SDLK_KP_PERIOD'.'keypad period
SDLK_KP_DIVIDE'/'keypad divide
SDLK_KP_MULTIPLY'*'keypad multiply
SDLK_KP_MINUS'-'keypad minus
SDLK_KP_PLUS'+'keypad plus
SDLK_KP_ENTER'\r'keypad enter
SDLK_KP_EQUALS'='keypad equals
SDLK_UP up arrow
SDLK_DOWN down arrow
SDLK_RIGHT right arrow
SDLK_LEFT left arrow
SDLK_INSERT insert
SDLK_HOME home
SDLK_END end
SDLK_PAGEUP page up
SDLK_PAGEDOWN page down
SDLK_F1 F1
SDLK_F2 F2
SDLK_F3 F3
SDLK_F4 F4
SDLK_F5 F5
SDLK_F6 F6
SDLK_F7 F7
SDLK_F8 F8
SDLK_F9 F9
SDLK_F10 F10
SDLK_F11 F11
SDLK_F12 F12
SDLK_F13 F13
SDLK_F14 F14
SDLK_F15 F15
SDLK_NUMLOCK numlock
SDLK_CAPSLOCK capslock
SDLK_SCROLLOCK scrollock
SDLK_RSHIFT right shift
SDLK_LSHIFT left shift
SDLK_RCTRL right ctrl
SDLK_LCTRL left ctrl
SDLK_RALT right alt
SDLK_LALT left alt
SDLK_RMETA right meta
SDLK_LMETA left meta
SDLK_LSUPER left windows key
SDLK_RSUPER right windows key
SDLK_MODE mode shift
SDLK_HELP help
SDLK_PRINT print-screen
SDLK_SYSREQ SysRq
SDLK_BREAK break
SDLK_MENU menu
SDLK_POWER power
SDLK_EURO euro