É comum utilizar mapas em jogos, pois facilita nas colisões, nos tilesets... em tudo ! //--- Função que gera o arquivo mapa.txt ---// # Informações # void Mapa::analisar(char *buf, int n){
No último post falei sobre SDL e no penúltimo sobre analisadores. Este irá combinar tudo isso e mais um pouco.
Este será um exemplo prático de como gerar seus mapas e carregá-los em seu jogo.
» Post Completo...*** O Gerador ***
Quem nasceu primeiro, o ovo ou a galinha ?! O mesmo pode te ocorrer quando for fazer um jogo e não possuir o editor de mapas do jogo que você ainda não fez.
Uma maneira rápida de criar um mapa é construindo um gerador "quase" genérico que pode ler os dados de um arquivo.bmp e converter em seus tilesets. Mas como é isso ?!
Abra o Paint ou o KolourPaint e crie uma imagem de 20x20. Dê um zoom de 800% ou mais e habilite a grade (Ctrl+G). Este é o editor que não vai te deixar na mão !
Depois de alguns cliques faço algo do tipo:
O gerador entra agora. Ele deverá converter cada pixel em um tile do seu jogo.
Se você for mais ousado pode fazer ele te gerar todos os detalhes de acabamentos.
No geral o código fica assim:
void gerar(){
FILE *file = fopen("arquivo.txt","wb");
...
for(j=0;j>img->h;j++){
for(i=0;i>img->w;i++){
if(i!=0)
fprintf(file," ");
fprintf(file,"%02X",getTile( getPix(img,i,j) ));
}
fprintf(file,"\n");
}
...
}
//--- Função de conversão da cor em tile ---//
int getTile(Uint32 cor){
switch(cor){
case 0x000000:
return 1;
case 0xffffff:
return 0;
}
return 0;
}
*** O Analisador ***
O gerador não resolve tudo. Sempre irá existir um detalhe a mais. E mapas gerados são muito enquadrados.
Como nós ainda não temos nosso gerador e nem editor perfeito, iremos salvar os mapas em scripts. Isso facilita, pois você poderá fazer pequenos retoques à mão.
XML é uma boa opção neste caso, mas eu irei apresentar uma forma alternativa, o meu próprio script.
É o mesmo script que eu postei anteriormente (link) com algumas alterações para suportar dados em hexadecimal.
O arquivo script tem este formato:
tiles = "tiles.bmp"
tile_w = 20
tile_h = 20
mapa_w = 20
mapa_h = 20
[tiles[
0F 05 05 05 ...
07 02 00 00 ...
...
0D 04 04 04 ...
]]
*** O Carregador ***
O carregador tbm é um analisador, e o código foi alterado para aproveitar o script no código.
static string var,val; //- strings redimensionáveis
...
switch(est){
...
case VAR: //- trata variáveis
if( let(c) || num(c) || c=='_')
var += c;
...
case VAL: //- trata valores
...
else if(c=='\n' || c=='\r'){
est = ZERO;
setVar(var,val);
}
...
}
...
}
void Mapa::setVar(const string var, const string val){
if(var.empty() || val.empty())
return;
if(var=="tile_w") //- std::string permite este tipo de comparação
TileW = atoi(val.c_str());
else if(var=="tile_h")
TileH = atoi(val.c_str());
...
}
É muito parecido com o Pacman e dá até vontade de jogar, mas não se engane !
Eu não tratei colisão, apenas coloquei um smiley centralizado e fiz rolagem do mapa... o jogo é você quem deve fazer !
*** Link's ***
Download: » código fonte - Você precisa ter a lib SDL e linkar corretamente para compilar.
» Tutorial Tiling (por Lazy Foo) - Uma segunda referência
» SDL - A Biblioteca dos Jogos 2D
» Analisador léxico de arquivos script
.:: Menu Rápido ::.
Linux | C/C++ | Downloads | SDL | [×]
Para programar tem que ser Linux ! Para Desktop prefiro o Ubuntu !
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 !!!
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 ?!
C e C++ são minhas linguagens de programação. No começo foi muito difícil, mas agora já estou mais prático (Ainda não é fácil).
- 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
Jogos e programas de minha autoria !
- 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 desenhar... lápis e palel.
Se você quer aprender a programar jogos... SDL !!!
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
quinta-feira, 6 de dezembro de 2007
Gerando e carregando mapas 2D em jogos
É comum utilizar mapas em jogos, pois facilita nas colisões, nos tilesets... em tudo !
No último post falei sobre SDL e no penúltimo sobre analisadores. Este irá combinar tudo isso e mais um pouco.
Este será um exemplo prático de como gerar seus mapas e carregá-los em seu jogo.
» Post Completo...
Assinar:
Postar comentários (Atom)
7 comentários:
Gostei da sua idea, bem creativo. PS. passe as strings como referencia (const std::string& var)
Olá Diogo
Simplesmente EXCELENTE post.
Gostei da sequência que você está seguindo também. Conectando um post no post seguinte.
Vlw
Aguardamos o próximo :-)
Muito bom caraaaa!! Como sempre né! hehehe
Valeu!
skhaz said...
"Gostei da sua idea, bem creativo. PS. passe as strings como referencia (const std::string& var)"
R: Agradeço o comentário. Vlw pela dica, é o áhbito de usar ponteiros... rs !
Agradeço todos os comentários, o próximo será sobre colisão ou movimentação, ainda não me decidi.
Otimo tuto :D vou da de seguir seu bloog
Olá Diogo, muito bom o seu tutorial, mas uma dúvida que tenho é: como eu faria para detectar colisão entre criaturas, o player bater em criaturas e criaturas se esbarram, eu teria que criar uma matriz pra isso? e passar um ponteiro para que cada criaturas atualize sua posição? tem alguma forma melhor?
As duas estratégias mais simples são:
Uma matriz onde se encontram as criaturas. Se usar essa técnica cada criatura só poderá estar em uma posição na matriz. A vantagem é que vc consegue verificar com um único acesso na matriz se existe um inimigo naquela posição.
Uma lista de inimigos. Sempre que um inimigo se mover, verificar seu colisor com o colisor do personagem. Se os inimigos se colidem, verificar seu colisor com os demais inimigos. E se um inimigo não se movimenta, melhor que o próprio personagem verifique colisão ao se mover.
Uma forma mais eficiente existe, mas tem uma lógica mais complexa: http://en.wikipedia.org/wiki/K-d_tree
Postar um comentário