sexta-feira, 5 de novembro de 2010

Map Editor

Olá amantes e programadores de roguelikes.
Se você não sabe o que é roguelike, então deixe este artigo e vá ler outra coisa mais interessante!



Map Editor é a minha mais nova parafernalha programática em C/C++, usando intensamente a biblioteca PD Curses, que serve para você que programa roguelikes, poder editar, salvar e abrir o mapa de alguma área do seu jogo roguelike. Na verdade, eu desenvolvi esse programa só para mim, e otimizei ele para editar as áreas do meu novo jogo roguelike que não divulguei e nem vou divulgar ainda pois o projeto ainda está num estágio muito alpha ainda (ou seja, não fiz praticamente p**** nenhuma ainda, só o editor!). Ao invés de ficar explicando, preferi copiar e colar o documento de especificação do programa logo a seguir. Leia, e entenda do que se trata!

O programa levou 2 dias e meio para ser desenvolvido, sendo que nesse momento, eu acabei de concluir e fechar o projeto, e já fiz o upload do programa no 4Shared pra quem quizer baixar. Cara, logo nos finalmentes, quando eu estava implementando as últimas funções do programa, que são as funções de salvar e abrir um arquivo de mapa, me deparei com um maldito bug surgido das trevas! Levei quase o dia todo para descobrir a causa do bug e cortá-lo pela raíz. Mas deixa quieto, já foi resolvido e o programa está pronto. Encontrando qualquer bug que eu não tenha detectado, me avise por favor.



Clique no link abaixo para fazer o download do Map Editor 1.0

http://www.4shared.com/file/eyVfVQGL/Map_Editor_1-0.html



Um detalhe importante:

A seguir você encontra o documento de especificação que eu escrevi antes de iniciar o projeto.
Mas, como esse documento eu escrevi antes de desenvolver qualquer coisa, obviamente na etapa final do projeto já havia umas 10 funções e/ou objetos adicionais, que eu nem tinha imaginado que existiriam, e eu não me dei o trabalho de incluir nesse documento porque depois que eu implementei tudo o que estava nele, nem olhei mais pra ele, larguei-o no esquecimento eterno. E aí embaixo ele está, intacto desde que o escrevi há 2 dias atrás.




Documento de Especificação


Map Editor

© Novembro/2010 - desenvolvido por Fernando Aires Castello



Objetivo do Programa


O objetivo do programa é permitir que o usuário edite um arquivo de mapa e seja capaz de salvá-lo, ou que o usuário possa carregar um arquivo de mapa previamente salvo para visualizá-lo e/ou editá-lo.


O "Mapa"


Um mapa é apenas um array bidimensional (uma matriz) de tamanho fixo, sempre menor ou igual ao tamanho de linhas e colunas da tela de um console do Windows (tipo a janela do prompt de comando). Os valores do array são do tipo "chtype", que é um tipo definido na biblioteca Curses. Este tipo de dados encapsula um caractere ASCII com uma cor de frente e uma cor de fundo.

Quando o usuário editar um mapa, ele estará alterando diretamente os dados "chtype" de dentro da matriz.

Ao salvar o mapa, o programa apenas enviará o array inteiro diretamente para o arquivo, além do nome e descrição do mapa, que vêm logo no início do arquivo, antes dos dados do array.

Ao carregar o mapa, o programa lerá todo o conteúdo do arquivo, colocando os dados no array bidimensional, e quando terminar, irá mostrar o mapa na tela, permitindo que o usuário visualize e/ou edite este mapa.


Formato do arquivo de mapa


Um arquivo de mapa contem três seções:

1ª seção - Contém o nome do mapa com no máximo 50 caracteres.

2ª seção - Contém uma descrição do mapa com no máximo 50 caracteres.

3ª seção - Contém todos os dados que representam elementos do mapa em si (isto é, os valores "chtype"). O tamanho desta seção corresponde ao tamanho do array bidimensional representando o mapa dentro do programa, ou seja, a quantidade de valores "chtype" no arquivo corresponde à expressão matemática: LINHAS_DO_ARRAY * COLUNAS_DO_ARRAY.

Por convenção, um arquivo de mapa possui a extensão .MAP, mas o programa não faz checagem de extensões de arquivos e nem efetua qualquer tipo de validação ou integridade do arquivo quando é aberto e lido.


Os objetos necessários para implementar o sistema


- Um array bidimensional do tipo "chtype" (uma matriz de "chtype");
- Coordenadas X e Y para o cursor;
- Valor de um caractere ASCII;
- Valor de uma cor de fundo;
- Valor de uma cor de frente;
- Um chtype representando o caractere atual com seus atributos de cor;
- Uma variável booleana para indicar se a edição automática está habilitada/desabilitada;
- Uma variável booleana para indicar se o arquivo atual já foi salvo (se foi editado) ou não;
- Um ponteiro para um arquivo, que será usado para salvar/carregar mapas;
- Uma string para representar o nome de arquivo atual;
- Uma string para representar o nome do mapa;
- Uma string para representar uma descricao do mapa.


As funções necessárias para implementar o sistema:


Relacionadas à entrada/saída de arquivos:

- Abrir um arquivo;
- Ler um arquivo, carregando os dados para dentro do programa;
- Salvar um arquivo, enviando os dados do mapa para dentro dele.

Relacionadas à edição de um mapa:

- Mover cursor;
- Selecionar caractere atual;
- Selecionar cor de fundo atual;
- Selecionar cor de frente atual;
- Colocar caractere com seus atributos de cor no mapa;
- Obter um caractere do mapa com seus atributos de cor e torná-lo o caractere atual;
- Preencher todo o mapa com o caractere atual;
- Apagar o caractere na posicao do cursor;
- Apagar todo o mapa;
- Habilitar/desabilitar edição automática (quando habilitado basta mover o cursor para que o programa coloque o caractere atual na posição do cursor automaticamente)

Relacionadas ao diálogo com o usuário, avisos, confirmações, etc.:

- Acusar algum erro;
- Perguntar o nome do arquivo a ser salvo;
- Perguntar o nome do arquivo a ser carregado;
- Perguntar qual o nome do mapa;
- Perguntar qual a descrição do mapa;
- Pedir confirmação para apagar todo o mapa;
- Pedir confirmação para sair do programa ou carregar outro mapa antes de salvar o atual, caso ele não tenha sido salvo ainda.

Relacionadas à GUI (interface gráfica com o usuário):

- Desenhar a janela de edição dentro da qual aparece o mapa e o cursor;
- Desenhar o cursor nas suas coordenadas;
- Desenhar a barra de título onde aparece o nome do mapa atual;
- Desenhar a barra de status onde aparecem várias informações como as coordenadas do cursor, o caractere atual com seus atributos (o valor do chtype), o nome do arquivo atual, etc;
- Desenhar todas as janelas nas suas posições corretas dentro da tela;
- Desenhar (ou "refrescar") o mapa dentro da janela de edição.

As definições (constantes) necessárias para implementar o sistema:

- Coordenadas X e Y da janela de edição;
- Altura e largura da janela de edição;
- Altura e largura de um mapa (corresponde ao número de linhas e colunas do array bidimensional que representa internamente um mapa);
- Coordenadas X e Y da barra de status;
- Coordenadas X e Y da barra de título;
- Coordenadas X e Y da linha de diálogo (onde aparecem os prompts para receber nomes de arquivo, nomes de mapas e descrições);




Se gostou do programa, mande um alô (deixe um comentário).
Até mais!