Objetivo A tarefa consiste em criar um editor gráfico de cenários para jogos 2D com visão isométrica. O editor deve permitir que o usuário possa criar, abrir e editar mapas (tilemaps) com tileset de visão isométrica. A interface e operação do sistema consiste em: (1) Ao criar um novo mapa, o usuário deve informar o número de colunas e de linhas do tilemap. (2) O editor mostra uma matriz de losangos (visão wireframe para o usuário ter como guia) e também uma lista de imagens de um tileset (no início vazia). (3) O usuário pode carregar imagens e coloca-las dentro da lista de imagens (tileset). (4) Quando o usuário clica numa imagem o editor espera que ele clique numa posição da matriz (wireframe). Quando ele clica na matriz na tela, associa-se o id do tile clicado com a respectiva posição clicada matriz e o editor deve desenhar o tile naquela posição para exemplo para o usuário. (5) No caso de o usuário abrir abrir um arquivo de cena, o editor deve obter as informações de largura, altura, tilemap e tileset do arquivo do cenário que está gravado em disco. (6) Na opção de salvar, o editor deve gravar a matriz do tilemap, a largura e altura desta matriz e o tileset com os tiles utilizados no mapeamento. No caso dos tiles, podemos gravar de duas maneiras diferentes (o grupo escolhe qual formato a implementar): (1) Abordagem mais simples: gravar apenas o nome das imagens do arquivos dos tiles. Assim, cada vez que carrega o cenário deve-se carregar as imagens de arquivos separados para colocar dentro do tileset; ou (2) Abordagem mais complexa: gravar as imagens dentro do arquivo do cenário. Neste caso, deve-se armazenar para cada tile, cada pixel e para cada pixel o R, G e B que forma a sua cor. Poderíamos, neste caso, seguir a idéia de gravar um PPM para cada tile dentro do arquivo do cenário. Além destes itens são apresentados outros que valem pontos extras para o trabalho: permitir selecionar e arrastar imagens pelo cenário e carregar uma animação como imagem do personagem. Com personagens e objetos não estáticos na cena, devemos manter uma matriz de tiles (tilemap) para o fundo do cenário e uma matriz de tile (elementos) para representar os personagens ou objetos não estáticos que ficam sobre o mapa (cenário). Considerações para o desenvolvimento do trabalho Como forma de organização de trabalho, para facilitar e antecipar a implementação do trabalho, o aluno implementar as funcionalidades conforme elas são estudadas, no decorrer do grau A. Portanto, representar e carregar imagens, depois tilemaps e por fim a lógica de visão isométrica. Deve-se implementar as classes de estrutura básica conforme o diagrama de classes proposto para tiles, tilemaps, tilesets e visão mostrados em aula. Em geral, como uma boa prática de programação, para cada funcionalidade deve ser implementada no mínimo uma classe. Todas as funcionalidades recebem parâmetros apropriados e devolvem algum objeto ou retorno de sucesso, ou um objeto de exceção ou retorno de insucesso. As exceções retornadas são exibidas ao usuário como mensagens de erro. A funcionalidade de interface gráfica, mesmo não sendo a prioritária no trabalho, é muito trabalhosa e requer muitos cuidados ou pontos de atenção. Por exemplo, os alunos devem se preocupar em como capturar comandos ou como selecionar objetos no cenário, devem se preocupar em como o usuário escolhe um arquivo para abrir, como as imagens ficarão dispostas na tela, como propiciar uma interface fácil para o usuário colocar e retirar imagens do tileset. Então, vale a pena gastar um tempo estudando as bibliotecas gráficas que serão utilizadas com linguagem escolhida para não se depararem com maiores surpresas. Prof. Ms. Leandro Tonietto! 1/5
O formato de arquivo das imagens carregadas que deve ser implementado é o PPM (conforme especificação descrita em http://www.fileformat.info/format/pbm/egff.htm) ou PCX (conforme especificação descrita em http://www.fileformat.info/format/pcx/egff.htm). Para os demais formatos de imagem (JPG, GIF, PNG,...) que o aluno quiser que editor suporte, pode-se utilizar bibliotecas já existentes para leitura e gravação. Apenas seria interessante que fossem portadas (entradas e saídas) para o mesmo esquema de leitura e gravação dos formatos exigidos. Diagrama de classes que deve ser seguido: Sugestão de interface: Prof. Ms. Leandro Tonietto! 2/5
! Atividades a serem programadas Descrição das atividades por funcionalidade exigida: (1) Interface: a interface do sistema, idealmente, deve seguir o modelo conforme figura 1. Contudo, este não é critério rígido, o software pode sugerir outra interface/layout, desde que possibilite as mesmas interações (funcionalidades) ao usuário. Mapa: desenhar uma visão wireframe do mapa, de acordo com as dimensões escolhidas pelo usuário ou lidas de arquivo. Utilizar o mesmo algoritmo do primeiro exercício da disciplina. Barra do tileset: mostra os tiles do cenário na ordem em que são adicionados pelo usuário. Menu de opções / botões: são as opções do usuário no sistema (novo, abrir, salvar, adicionar tile e remover tile). Uma sugestão de interface é carregar uma imagem para cada botão de opção. (2) Novo: abrir um novo objeto que representa o cenário, limpa o mapa da tela e pode ou não limpar o conjunto de tiles. O software deve solicitar ao usuário qual é o tamanho da tilemap do cenário (portanto, as dimensões de desenho do cenário para visualização). (3) Abrir: nesta opção, o usuário pode carregar um arquivo no modelo da aplicação. O aluno deve implementar uma classe com um método que recebe como parâmetro uma String e retorna, em caso de sucesso na leitura, um objeto do tipo cenário (conforme especificação do formato de arquivo script.isom ); Em caso de erro, devido a alguma falha de leitura, como arquivo não existente ou arquivo com formato inválido, o objeto que carrega o cenário deve retornar um objeto de exceção ou de sinalização de erro. (4) Salvar: assim como na opção abrir, aluno deve implementar uma classe para gravar em arquivo o cenário montado (também no formato. isom ). A classe tem um método salvar que recebe um objeto do tipo cenário e um caminho com o nome/local do arquivo a ser gravado. Se o objeto conseguiu realizar o salvamento sem erros pode dar um retorno de sucesso ou não retornar nada (void); entretanto, em caso de falha, como um diretório inválido ou tipo de extensão inválida, o software deve retornar uma exceção apropriada para cada erro. (5) Adicionar tile: o objetivo desta função é adicionar novos tiles no tileset. O usuário clica em adicionar e o sistema solicita o caminho para o arquivo. O tile é carrega no formato PPM ou PCX e vai para lista do tileset. (6) Remover tile: remove um tile selecionado do tileset e também a sua referência (id) na matriz do tilemap Formato isom O programa deve gravar e ler de arquivo um cenário 2D produzido nele mesmo. Logicamente, este arquivo deve conter toda a informação necessária para ser reproduzido. Tendo em mente que objetivo é produzir um cenário composto por layer, então o formato de gravação é: Sintaxe do arquivo <nome> <Largura> <Altura> <width> <height> matriz com ids dos tiles <número de tiles> <tilewidth> <tileheight> <caminho da imagem do tile> Exemplo de um arquivo de cenário 2D: Conteúdo do arquivo Explicação das linhas nome, largura e altura do tilemap e largura e altura da imagem final a matriz deve ser gravada por linha e cada coluna separa por espaço após a matriz de índices vem as informações sobre o tileset: número de tiles e a largura e dimensão dos tiles. uma linha de caminho para cada tile ou os pixels (RGB) de cada tile. Explicação das linhas Prof. Ms. Leandro Tonietto! 3/5
CenárioTeste 5 3 640 480 0 0 0 0 0 0 1 2 2 1 0 0 0 0 0 3 64 64.\tiles\tile0.ppm.\tiles\tile1.ppm.\tiles\tile2.ppm Cenário de teste com tilemap de 5 colunas por 3 linhas e imagem final de 640 x 480 pixels (largura x altura) Matriz de índices par os tiles a serem desenhados na tela. Tileset, com 3 tiles de 64 x 64 pixels (largura x altura) Uma linha de caminho para cada tile ou os pixels (RGB) de cada tile. Avaliação Os critérios para avaliação do trabalho são a correta implementação das atividades da seção Atividades a serem programadas, além da criatividade e qualidade de código. Distribuição dos pesos: Interface gráfica: funcionalidade e usabilidade (20%) Novo, Carregar e salvar no formato ISOM (30%) Adicionar tile: leitura de arquivos de imagem no formato PPM, PCX ou SGI (30%) Remover tile: remoção do tile do tileset e do tilemap (5%) Mouse para edição de cenário (15%) Pontos-extra: - São pontos que são dados a funcionalidades que vão além da especificação básica e que podem substituir algum ponto deficitário do programa, ou agregar na nota geral do GA. - Serão considerados pontos-extra: Prever um tilemap para elementos que ficam em cima do cenário Suporte a outros formatos de imagens, sendo que pelo menos mais um tem que ser implementado. Gravar imagens dentro do arquivo ISOM Alteração do formato do arquivo de cenário para binário e para gravar também as imagens do cenário. Sugestões de desenvolvimento Como o trabalho é extenso, com diversos pontos que requerem tratamento de possibilidades (como imagens em formato PPM, PCX ou SGI), então um boa rotina para se chegar a resultado aceitável do trabalho é: (1) Primeiro ter algo que funcione e possa servir de base para os demais passos: a) Implementar apenas uma versão do PPM, PCX ou SGI, mas que tenha suporta a pelo menos transparência. No caso do PPM, podemos adotar uma cor como transparente ou utilizar o formato PTM (que é um PPM com canal alfa) b) Fazer classes e desenho do cenário. Tentar diminuir o número de parâmetros informados pelo usuário, isto gera menos programação. c) Implementar função de manutenção do tileset. d) Implementar as funções salvar e carregar cenário (2) Depois de fazer os passos da estratégia 1, implementar funcionalidades com maiores detalhes e ponto-extra: a) Verificar detalhes pendentes no passo 1 b) Opção novo cenário. c) Terminar implementação completa do formato de arquivo de imagem d) Implementar detalhes de interface, como validações de entrada de dados do usuário e clique do mouse para edição. e) Implementar ponto-extra Prof. Ms. Leandro Tonietto! 4/5
Considerações finais Alguns aspectos gerais devem ser considerados na realização do trabalho: O trabalho deverá ser realizado OBRIGATORIAMENTE em DUPLA. Quando se diz que um trabalho deve ser feito em duplas, os dois integrantes devem, efetivamente, participar da realização, sob pena de nota diferenciada na avaliação. IMPORTANTE 1: Atividades copiadas da Internet ou dos colegas serão avaliadas com conceito Reprovado, portanto, menor que 6. Não deixe para a última hora, converse com o professor durante as aulas e receba orientações do que deve ser feito para atingir o objetivo. Caso algum integrante da dupla desista da atividade acadêmica, o outro integrante deverá dar continuidade ao projeto sozinho. IMPORTANTE 2: a entrega do trabalho compreende na entrega e apresentação do código-fonte ao professor pelos dois integrantes do grupo, aonde será evidenciado entendimento do mesmo e a efetiva participação dos integrantes. Em caso de dúvidas ou problemas contate o professor o quanto antes, para se possa encaminhar alguma outra solução em tempo hábil. Questões sobre programação: - Linguagens: C++ ou Java. - Em ambos os casos, o aluno deve implementar o que foi solicitado, não deve fazer uso de bibliotecas. Por exemplo, o aluno deve implementar o algoritmo para carregar o arquivo PNM e não utilizar biblioteca pronta. De qualquer maneira, na dúvida questione o professor para não ser surpreendido na avaliação. Atualização do documento: 08/04/2013 Prof. Ms. Leandro Tonietto! 5/5