.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

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

#include <SDL/SDL.h>
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;
}

Download: » código fonte

*** Compilando ***
Apenas apertar F9 pode não resolver o seu problema. Pode ocorrer algo do tipo:

[Linker error] undefined reference to `SDL_Init'
[Linker error] undefined reference to `SDL_SetVideoMode'

Se isto ocorrer é porque está faltando algum parâmetro no projeto. Vá em Opções do Projeto e na aba parâmetros se certifique de encontrar -lmingw32 -lSDLmain -lSDL no campo Linker.
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.

# -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
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)

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).
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...

# Resolução da tela: 800,600 ou 1024,768 ou personalizado
resolucao = 800, 600
# FullScreen (Tela cheia): sim ou nao
fullscreen = sim
# Som: sim ou nao
son = sim
# Volume: de 0 até 100
volume = 90

XML é melhor para trabalhar com dados, mas um script tem suas vantagens e uma delas é a simplicidade.

*** 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:

struct Variavel{
String nome;
Lista valores; //- lista do tipo String
};
Lista variaveis; //- lista do tipo Variavel

Como será implementada a estrutura de dados fica a gosto do cliente !!!

*** Link's ***
Download: » Código fonte

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

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 !
Reinventar a roda é legal, mas não tem justificativa se a sua roda for "redonda" como todas as outras !

» Post Completo...

FILE *file = fopen("contato.xml","wb");
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);

Agora vem a parte que todos estão esperando. Como eu faço para recuperar tudo isso ?!
É aqui que entra a libxml2. De forma bem genérica você só precisa fazer isto:

xmlDocPtr doc; //- ponteiro do documanto
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();

Download: » Código Fonte

*** 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:

struct ESTRUTURA_GENÉRICA{
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;
...
}

E podem ser identificadas por "type":

Enum xmlElementType {
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
...
}

Como você pôde ver, muitos tipos são compatíveis entre si. E ainda existem outros tipos, que na verdade, são os mesmos !

Typedef xmlNode* xmlNodePtr

Para mais informações leia a documentação oficial, pois isto foi só um resumão !

.:: 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)

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,

Os mais atentos já entenderam o esquema ! O parâmetro -f tem a mesma formatação da função printf() !

Donwload: » AsciiGen 0.1

---
A outra vantagem é o código fonte, que é muito simples e está todo comentado !!!