Esta será uma abordagem para iniciantes em SDL. Será o seu primeiro passo rumo à programação de jogos 2D. #include <SDL/SDL.h> [Linker error] undefined reference to `SDL_Init' # -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
Estarei utilizando o Dev-Cpp e também o gcc no Linux.
Aprenda como instalar a SDL e como criar um projeto SDL no Dev-Cpp. Entenda como usar os parâmetros do linker no Dev-Cpp e no gcc.
» Post Completo...*** SDL ***
A Simple DirectMedia Layer (SDL) é uma biblioteca multimídia multi-plataforma projetada para oferecer acesso de baixo nível a áudio, teclado, mouse, joystick, hardware 3D (usando OpenGL) e framebuffer de vídeo 2D.
Isso não caracteriza uma engine, mas sim uma API. Entender uma engine pode levar anos, mas para entender a API da SDL pode levar apenas algumas semanas.
SDL é escrita em C, mas você pode utilizá-la nativamente em C++. Outra coisa é que ela possui ligações para várias outras linguagens: Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby e Smalltalk.
*** Instalação ***
Primeiro vamos instalar o Dev-Cpp. Você poderá baixar a versão mais nova (com o compilador Mingw/GCC) aqui ou baixar diretamente aqui.
Instalado o Dev-Cpp vem a parte da SDL, que também é fácil. Você poderá baixar um pacote manualmente do devpaks ou automaticamente utilizando o assistente do Dev-Cpp.
Para usar o assistente: vá em Ferramentas | Atualizações. Escolha um servidor de pacotes e mande atualizar. Marque o pacote SDL 1.2.8 ou superior e clique em download.
Após obter o pacote basta instalar como se este fosse um instalador qualquer. A vantagem do Dev-Cpp é que ele deixa tudo pronto para o uso.
Não deixando na mão aqueles que estiverem utilizando Linux: baixe o código fonte aqui e siga as instruções para compilar e instalar.
E pra quem estiver utilizando Ubuntu ou qualquer distribuição que funcione à base de apt-get:
$ sudo apt-get update
$ sudo apt-get install libsdl1.2-dev
*** SDL Hello World ***
Para se criar um novo projeto basta clicar em Novo Projeto. Aparecerá uma janela e clicando na aba MultiMedia | SDL | OK você já poderá rodar o código teste.
O Dev-Cpp te dá um código de teste logo quando se cria o projeto SDL. Irei aproveitar este código fazendo leves alterações e alguns comentários.
No Geral o código fica assim:
SDL_Surface *screen = NULL;
SDL_Surface *img = NULL;
void pintar_tela(){
SDL_FillRect(screen, NULL, cor);
SDL_BlitSurface(img, NULL,screen, NULL);
}
int main(int argc, char *argv[]){
//--- Inicializando a SDL... ---//
SDL_Init(SDL_INIT_VIDEO); //- sem tratar erro
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_DOUBLEBUF);
SDL_WM_SetCaption("Título da aplicação", NULL);
//--- Carregando... ---//
img = SDL_LoadBMP("img.bmp");
//--- GAME LOOP ---//
int done=0;
SDL_Event event;
SDLKey key;
while(!done){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT: //- evento para fechar a janela
done = 1;
break;
}
}
pintar_tela();
SDL_Flip(screen);
SDL_Delay(1);
}
//--- Descarregando... ---//
SDL_FreeSurface(img);
SDL_Quit();
return 0;
}
*** Compilando ***
Apenas apertar F9 pode não resolver o seu problema. Pode ocorrer algo do tipo:
[Linker error] undefined reference to `SDL_SetVideoMode'
Se o seu caso for Linux, não se esqueça de incluir todos os comandos necessários. Para facilitar as coisas fiz um Makefile e para compilar basta digitar $ make.
SDL_CFLAGS=`sdl-config --cflags`
# -L/usr/lib -lSDL
SDL_LIBS=`sdl-config --libs`
all: sdl
sdl: main.c
gcc $< -o $@ $(SDL_CFLAGS) $(SDL_LIBS)
*** O que mais devo saber ?! ***
Não se esqueça que seu programa em SDL precisa da SDL.dll para funcionar. Você poderá encontrá-la em C:\Dev-Cpp\bin. Se a SDL.dll não estiver junto ao seu programa ou em system32 seu executável será inútil.
No Linux a saida do printf é direcionada para o console normalmente, mas no Windows ela é direcionada para os arquivos stdout.h e stderr.txt.
Eu apresentei sobre a SDL, mas a lib Allegro também é muito boa.
SDL não é só isto não ! Você pode utilizar mais bibliotecas como:
» SDL_Image - Para carregar png, jpg e muitos outros formatos.
» SDL_Mixer - Para carregar ogg, mp3.
» SDL_Ttf - Para carregar fontes TrueType.
» SDL_Net - Para conexões socket. (Ainda vou testar !)
» SDL_Gfx - Para fazer zoom, rotacionamentos e imprimir primitivas gráficas. (Não sei porque ela não está junta com as outras !)
» SDL_Collide - Para testar colisões entre objetos. (Também não está junta com as outras !)
SDL_... Faz o seguinte... invente a sua !
Os jogos são mais do que uma biblioteca pode suportar, e sempre existirá uma brecha que não foi projetada. As primeiras engines não estavam preparadas para os MMORPG's da vida e talvez as de hoje também não estejam !!!
*** Jogos ***
O meu jogo Quebra-Cabeça foi feito em SDL. Mas ele não impressiona muito !
Você conhece o jogo Worms Armageddon ?
Este é o Wormux, é clone do Worms e é feito em SDL !!!
Lançaram o Worms 3D e ainda não vi nenhum clone dele !
SDL pode trabalhar com 3D utilizando OpenGl, mas de longe é o assunto deste post !
*** Testes ***
Meu PC não é dos mais modernos, mas é o único que tenho !!!
Pelos testes dá pra ver que 32bpp é o ideal !
processador: AMD Athlon XP (2800+)
clock: 2.082 GHz
GPU: GeForce4 MX 4000 128MB
[Ubuntu 7.04 + GPU]
174 FPS - 640x480x32 sem SDL_Delay
82 FPS - 640x480x32 com SDL_Delay(1)
120 FPS - 800x600x32 sem SDL_Delay
62 FPS - 800x600x32 com SDL_Delay(1)
76 FPS - 640x480x24 sem SDL_Delay
52 FPS - 800x600x24 sem SDL_Delay
90 FPS - 640x480x16 sem SDL_Delay
62 FPS - 800x600x16 sem SDL_Delay
152 FPS - 640x480x8 sem SDL_Delay
110 FPS - 800x600x8 sem SDL_Delay
*** Link's ***
Download: » código fonte
» SDL
» SDL (Documentação)
» Lazyfoo (Tutoriais SDL)
» Criando uma janela SDL (por Vinícius Godoy)
» Dev-Cpp
» Compilando com gcc e Makefile
» Devpaks
» Wormux (Worms Clone)
.:: Menu Rápido ::.
Linux | C/C++ | Downloads | SDL | [×]A melhor maneira de se descobrir uma lib gratuita é nos repositórios do Ubuntu: $apt-cache search lib <palavra_chave> dev
Ou pelo devpaks.org, mas o repositório tem me ajudado mais !!!
- Script's GIMP - Python-Fu !!!
- Dicas Web
- Vídeo Compiz Fusion (Desktop 3D)
- Compilando com gcc e Makefile
- Que tal mudar para Ubuntu ?!
- SDL - A Biblioteca dos Jogos 2D
- Analisador léxico de arquivos script
- Simpatizando com a Libxml2
- AsciiGen - Tabela ASCII em C
- Conexão com API C do MySQL
- Compilando com gcc e Makefile
- DR Tetris 0.3 - Tetris no estilo tradicional !
- DR Quebra-Cabeça disponível para download !!!
- Freeggs - Liberdade aos ovos \o/
Se você quer aprender a programar jogos... SDL !!!
- Carregando mapas 2D no formato TMX
- Controle de tempo e Frame Rate
- SDL em Processamento de Imagens
- SDL_Surface - Introdução detalhada
- Imprimindo texto com SDL_Ttf
- SDL_Collide - Colisão 2D para jogos
- Tocando música e sons com SDL_mixer
- Gerando e carregando mapas 2D em jogos
- SDL - A Biblioteca dos Jogos 2D
quarta-feira, 21 de novembro de 2007
SDL - A Biblioteca dos Jogos 2D
Esta será uma abordagem para iniciantes em SDL. Será o seu primeiro passo rumo à programação de jogos 2D.
Estarei utilizando o Dev-Cpp e também o gcc no Linux.
Aprenda como instalar a SDL e como criar um projeto SDL no Dev-Cpp. Entenda como usar os parâmetros do linker no Dev-Cpp e no gcc.
» Post Completo...
Postado por Diogo_RBG 5 comentários
sábado, 17 de novembro de 2007
Analisador léxico de arquivos script
Análise léxica é o processo de analisar uma entrada de caracteres e produzir uma seqüência de símbolos chamado "símbolos léxicos" (lexical tokens) que podem ser manipulados mais facilmente (Wikipédia). # Resolução da tela: 800,600 ou 1024,768 ou personalizado struct Variavel{
Analisar dados em um arquivo de texto é normal, mas quem nunca fez vai precisar de uma mãozinha.
Aprenda a criar um analisador e veja o meu exemplo de 100 linhas !
» Post Completo...*** O Script ***
O script é este:
resolucao = 800, 600
# FullScreen (Tela cheia): sim ou nao
fullscreen = sim
# Som: sim ou nao
son = sim
# Volume: de 0 até 100
volume = 90
*** Esboço ***
Sempre que vou criar um analisador, gosto de criar um esboço do que chamo de Autômato:
Como eu disse, é apenas um esboço.
[Estados (Bolinhas)]
0 - Estado inicial
1 - Trata variáveis
2 - Trata valores
3 - Trata strings
4 - Trata caractere \ de escape
5 - Trata comentários
[Símbolos]
N - Números
L - Letras
* - Qualquer símbolo
[Outros]
Um traço para um quadrado - Algo que terei que tratar no código.
*** Programação ***
Analisar um script é sopa !
O bom de um autômato é que você pode analisar e manipular ao mesmo tempo. Mas dependendo do número de regras a coisa vai se complicando.
Perceba que o autômato acima só possui 6 estados, e mesmo assim precisei de 100 linhas de código.
» Primeiro é preciso de um loop para correr todos os caracteres.
» Cada estado pode ser visto como um case: num switch.
» Cada caractere lido é tratado por um if que além de outras coisas define o est (estado).
» Para ter mais organização, usei uma enumeração: enum ESTADOS{ZERO, VAR, VAL, STR, ESC, COMENT}
» Para que a função analisadora pudesse analisar um bloco de cada vez, defini est como static: static int est
Não resolvi todos os problemas. A função analisadora funciona, mas ela simplesmente imprime o resultado na tela.
Uma boa estrutura de dados seria algo como:
String nome;
Lista valores; //- lista do tipo String
};
Lista variaveis; //- lista do tipo Variavel
*** Link's ***
Download: » Código fonte
Postado por Diogo_RBG 2 comentários
Tópicos: c_c++
quarta-feira, 14 de novembro de 2007
Dicas Web
Como você tem usando a Internet ?! Por favor não responda MSN e Orkut !
Existem diversos serviços disponíveis na Internet: Pesquisas, Tradutor, E-mail, RSS, Grupos, Fórum, Blog, Página.
Mesmo que voçê conheça todos, vale a pena conferir algumas dicas.
» Post Completo...*** Google ***
Pode até parecer propaganda da Google, mas fazer o que ? A Google se tornou sinônimo de Internet, e se por um dia todos os serviços da Google deixassem de funcionar seria o caus ! Melhor torcer para que este dia nunca chegue !
Com certeza você já sabe pesquisar no google, mas vale a dica: "site:diogorbg.blogspot.com linux". Desta forma você especifica o site da sua pesquisa.
Uma outra dica melhorzinha: Pesquise "lang:c hello world" em www.google.com/codesearch e você com certeza encontrará o código que estava procurando !
*** GMail ***
Quase todo mundo tem e-mail, mas o problema é que a maioria possui muuuitos !
Uma dica, pra você que tem 10 e-mail's e só consegue usar a metade, é fazer uma conta no GMail ! Mas eu explico o porque.
É rápido, é simples, é grande (o meu tem 4.9GB), tem chat, é organizado (agrupa as mensagens por título), NÃO TEM SPAM, faz buscas (por mensagem ou por contato) e é da Google ! Mas essas ainda são vantagens comuns, a vantagem que eu considero maior fica em Configurações | Contas.
O GMail permite que você gerencie seus e-mail através de uma única conta GMail. Depois de configurado, você poderá receber todas as mensagens que foram enviadas a suas outras contas em seu GMail e ainda poderá responder em nome de qualquer uma de suas contas.
» Primeiro passo: Vá em Configurações | Contas e clique em Adicionar um outro endereço de e-mail e adicione seu nome e e-mail(outra@conta.com).
» Segundo passo: Confirmação de e-mail. Apenas mande enviar a confirmação e confirme de seu outro e-mail.
» Ultimo Passo: No final ele irá pedir algumas configuração, que dependendo do caso você vai ter que se virar pra consegui !
No caso de uma conta GMail: Servidor POP:smtp.gmail.com porta:995
No caso de uma conta WebMail(UFT): Servidor POP:webmail.uft.edu.br porta:110
Crie marcadores a seu gosto ! Eles servem para organizar suas mensagens. Dê uma olhada também em Marcadores, Filtros e Encaminhamento POP
*** RSS ***
» RSS Portal C++
» RSS CACCOMP
» RSS Alma do Negócio
» RSS BR-Linux.org
» RSS INFO Online
Como você faria para acompanhar todos estes sites de notícias ?! O jeito mais fácil é ter um leitor RSS e cadastrá-los. Se você já tem uma conta da Google basta usar o reader. Além de organizar as notícias você poderá fazer uma seleção e torná-la pública: RSS WebSite.
*** Blog e Página ***
Assim como eu criei meu Blog e minha Página, você também poderá criar gratuitamente.
Aqui vai meu convite: Faça um blog ou página e o torne seu currículo online.
Ajude a mudar a escassez de material de estudo (realidade do Brasil) contribuindo um pouquinho, uma vez ou outra.
Se um material já existe, comente, dê um link do mesmo e contribua com algum exemplo que ainda não foi explorado pelo autor.
A muito tempo eu venho querendo fazer isso (Portal C++ 04/02/2006) e encontrei no Blog e Pages as ferramentas adequadas para isto. Não comentei sobre o WordPress, mas também é muito bom.
*** Mais Link's ***
» Wikipédia - Enciclopédia Digital
» HowStuffWorks - Como funciona
» HackerTeen - Profissionalizando jovens para o bem. gibi.
O objetivo da Internet não é de alienar as pessoas como a TV tem feito e nem de proporcionar um ambiente virtual de fraudes e roubos. Desfrute com sabedoria !
---
Pode até serem dicas fraquinhas, mas é bom que todos saibam !
Se você conhece um site legal contribua com um comentário ;)
Postado por Diogo_RBG 0 comentários
Tópicos: dicas
terça-feira, 6 de novembro de 2007
Simpatizando com a Libxml2
Usar uma biblioteca é a melhor idéia que você poder ter ! E principalmente se tratando de uma coisa tão prática como XML ! FILE *file = fopen("contato.xml","wb"); xmlDocPtr doc; //- ponteiro do documanto struct ESTRUTURA_GENÉRICA{ Enum xmlElementType { Typedef xmlNode* xmlNodePtr
Reinventar a roda é legal, mas não tem justificativa se a sua roda for "redonda" como todas as outras !
» Post Completo...*** Referências ***
A Libxml2 é uma biblioteca da GNOME e é altamente utilizada, além de ser recomendada pela W3C, que é o órgão regulamentador do padrão XML !
*** O que é XML ?! ***
Talvez você já ouviu falar muito sobre XML, mas o que é XML mesmo ?!
Por exemplo, HTML é um padrão construído em cima do padrão XML, mas XML é HTML? Não mesmo !
Você pode encontrar uma ótima referência sobre XML na www.w3schools.com, eu aprendi muito neste site ! Aliás, ele é muito bom em tudo !
XML é apenas um padrão para descrição dos dados. Ele é todo formado por texto, e quando interpretado te dá um resultado muito próximo a de um banco de dados.
Um exemplo simples de XML seria: contato.xml. Obs.: O seu browser irá interpretar o exemplo, e como sugestão você deve exibir o código-fonte para que você possa ver a formatação do arquivo !
*** XML na programação ***
Primeiro vamos aprender a gerar XML. Que é muito fácil mesmo !
fprintf(file,"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
fprintf(file,"<root>\n");
fprintf(file,"\t<contato>\n");
fprintf(file,"\t\t<nome>%s</nome>\n",nome);
fprintf(file,"\t\t<fone>%s</fone>\n",fone);
fprintf(file,"\t\t<email>%s</email>\n",email);
fprintf(file,"\t</contato>\n");
fprintf(file,"</root>");
fclose(file);
É aqui que entra a libxml2. De forma bem genérica você só precisa fazer isto:
xmlNode *root; //- ponteiro raiz
LIBXML_TEST_VERSION
doc = xmlReadFile(file, NULL, 0); //- Uso genérico
root = xmlDocGetRootElement(doc);
função_de_tratamento(root); //- aqui vc já pode trabalhar
xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();
*** Documentação Libxml2 ***
Mesmo sendo escrita em c, a libxml2 (e muitas outras) tem conceitos de Orientação a Objetos. Sabendo isso a documentação não será mais uma dor de cabeça.
xmlAttr, xmlDoc, xmlElement, xmlNode. Todos tem a mesma estrutura genérica inicial:
void * _private;
xmlElementType type; //- Identificação
const xmlChar *name; //- Nome
struct _xmlNode *children;
struct _xmlNode *last;
struct _xmlDtd *parent;
struct _xmlNode *next; //- Próximo elemento
struct _xmlNode *prev;
struct _xmlDoc *doc;
...
}
XML_ELEMENT_NODE = 1
XML_ATTRIBUTE_NODE = 2
XML_TEXT_NODE = 3
XML_CDATA_SECTION_NODE = 4
XML_ENTITY_REF_NODE = 5
XML_ENTITY_NODE = 6
XML_PI_NODE = 7
XML_COMMENT_NODE = 8
...
}
.:: Update 05/07/2008 ::.
Depois de algum tempo sem usar a libXML no Dev-Cpp (Devido a alguns probleminhas que antes não pareciam ter solução) resolvi examinar mais a fundo e ver o que eu tinha feito de errado.
No Linux é super de boa, pois a lib é da GNU e não tem porque dar problemas. No Windows também é simples, se você souber o que você está fazendo.
Acabei de descobrir que no Windows a libMXL tem mais duas dependências: libiconv e zlib.
» libiconv acusa erro na compilação: iconv.h: No such file or directory.
» zlib acusa erro na DLL: Você não precisa linkar a lib em seu projeto, mas a DLL zlib1.dll não pode ser esquecida.
Para instalar a libXML no Dev-Cpp use o repositório DevPaks ou o assistente de instalação do Dev-Cpp (WebUpdate) localizado em Ferramentas > Atualizações. Baixe os pacotes libxml2, libiconv e zlib.
Desconfio que o pacote libxml2 versão 2.6.23 tem pequenos problemas, pois tive que fazer algumas correções:
» -lxml2 seria o suficiente para que a lib fosse linkada em nosso projeto, mas tive que linkar com -llibxml2. Minha explicação é que onde deveria existir o arquivo libxml2.a existe o arquivo libxml2.lib... se fosse lib*.a eu não precisaria do prefixo lib.
» libiconv-2.dll. Este é o arquivo exigido quando se roda a aplicação e não iconv.dll como vem na instalação (diretório_do_Dev/bin).
O código de exemplo tem disponível duas versões versões compiladas (windows e Linux)... aproveitem !
*** Link's ***
Download: » Código Fonte
» Documentação libxml2
» Exemplos libxml2
» Definição XML (wikipedia)
» Tutorial XML (Super recomendado)
Postado por Diogo_RBG 6 comentários
sexta-feira, 2 de novembro de 2007
AsciiGen - Tabela ASCII em C
Vira e mexe, a gente sempre precisa ter uma tabela ASCII em mãos !
E nada mais fácil do que um programa (para Windows e Linux) que além de gerar a tabela ASCII, também possa gerar seu nome em decimal, hexadecimal, etc...
*** Formas de Uso ***
$ ./asciigen - Gera a tabela ASCII.
$ ./asciigen -h - O Help do programa.
Por exemplo: Para gerar meu nome em hexadecimal.
$ ./asciigen -c Diogo_RBG -f:0x%02X, -n:14
0x44,0x69,0x6F,0x67,0x6F,0x5F,0x52,0x42,0x47,
Donwload: » AsciiGen 0.1
---
A outra vantagem é o código fonte, que é muito simples e está todo comentado !!!
Postado por Diogo_RBG 1 comentários
Tópicos: c_c++