Pular para o conteúdo

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.
Hunz hunz
Hits: 55.249 Categoria: C/C++ Subcategoria: Avançado
  • Indicar
  • Impressora
  • Denunciar

Parte 3: 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):



   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

Deixando o GNOME mais adequado às leis de Fitts

Sociedade, Software Livre e Linux

GNA: um Coprocessador para Aceleração Neural

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

Compilando Templates C++

OneAPI: A plataforma da Intel para facilitar o desenvolvimento com chips Intel, AMD, ARM, NVIDIA POWER e FPGA

Utilizando técnicas recursivas em C e C++

#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.
#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!
#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

Entre na sua conta para comentar.



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