Objetivo A tarefa consiste em criar um editor gráfico de cenários para jogos 2D com visão lateral. O editor deve permitir que o usuário trabalhe com camadas, para simular o efeito parallax. O usuário pode criar um novo cenário, definir uma imagem de fundo, definir imagens para as camadas intermediárias, definir imagem do personagem e definir qual das camadas é a de ação, portanto, aquela que vai regular o scrolling da tela. As demais possuem uma taxa de deslocamento baseada na taxa de deslocamento da camada principal. Quando o usuário carrega uma imagem no editor, ele deve indicar em qual camada a imagem será inserida, além da posição, é claro. Com exceção da camada de fundo, todas as camadas possuem canal alfa definido para fazer composição de imagens. O editor deve ter um modo preview, aonde é possível fazer a navegação pelo cenário como se fosse num jogo. Todas as imagens utilizadas no sistema devem ser carregadas através de um leitor implementado no próprio software pelo grupo. O formato de arquivo a ser utilizado deve ser o PTM, PCX ou o SGI. 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. 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. 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 uma imagem numa camada e no lugar desejado e etc. 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. A layer é um objeto abstrato que representa um retângulo invisível num plano de profundidade do cenário (uma camada). Isto significa que ela é responsável apenas armazenar algumas imagens e uma taxa de scrolling para estas imagens. Também é comum que layer tenha um tamanho maior que o da viewport do cenário, o que indica que ela deve montar uma imagem da sua visualização (subimagem). O formato de arquivo das imagens carregadas que deve ser implementado é o PCX (conforme especificação descrita em http://www.fileformat.info/format/pcx/egff.htm) ou SGI (conforme especificação descrita em http://www.fileformat.info/format/sgi/ Prof. Ms. Leandro Tonietto! 1/5
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. Sugestão de interface: 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. (2) Barra de layers: mostra as layers do cenário na ordem em que são desenhadas e com destaque para a layer de background. Nesta barra é possível selecionar uma layer para edição e também trocar a ordem das layers. (3) Novo: abrir um novo objeto que representa o cenário, limpa o mapa da tela e pode ou não limpar o conjunto de layers. O software deve solicitar ao usuário qual é o tamanho da viewport do cenário (portanto, as dimensões de desenho do cenário para visualização). Alternativamente, já poderia solicitar ao usuário qual é a imagem de fundo (como um campo de preenchimento opcional). Prof. Ms. Leandro Tonietto! 2/5
(4) 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.sc2d ); 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. (5) Salvar: assim como na opção abrir, aluno deve implementar uma classe para gravar em arquivo o cenário montado (também no formato.sc2d ). 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. (6) Adicionar layer: o objetivo desta função é adicionar novas layers no cenário. A nova layer deve ser inserida sempre no nível acima da última e, logicamente, abaixo da layer de primeiro plano (foreground). Quando o usuário clica na opção Adicionar Layer o sistema deve perguntar quais são as dimensões da layer. Opcionalmente, é possível solicitar ao usuário qual a taxa de scrolling que ele quer utilizar para a layer atual ou então se ele quer que o sistema calcule automaticamente com base no tamanho da layer. Seria interessante que o sistema solicitasse também (de preenchimento opcional para o usuário), uma imagem para ser o fundo da layer; ainda que ele possa adicionar novas imagens na mesma. (7) Adicionar imagem: carrega uma imagem do disco e adiciona na layer selecionada (em edição). As imagens a serem carregadas aqui também são de um dos formatos suportados nesta especificação (PCX ou SGI). (8) Aplicar filtro: o objetivo desta opção é permitir que o usuário possa aplicar um filtro de imagem sobre as imagens da layer. Os algoritmos de filtros de imagens a serem aplicados ficam por conta dos alunos. (9) Executar Cenário: executa o cenário como se fosse um jogo, possibilitando interação do usuário para se deslocar lateralmente pelo mesmo. Alternativamente (ponto-extra), pode-se colocar uma sprite de um personagem simular o seu deslocamento pelo cenário, tanto lateral quanto em profundidade. Formato SC2D 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> <n-layers> L0 <nome> <w> <h> <taxa scrolling> <imagem> L<1..n-2> <nome> <w> <h> <taxa scrolling> <imagem> L<n-1> <nome> <w> <h> <taxa scrolling> <imagem> Explicação das linhas nome, largura e altura da viewport e núm. de layers layer zero é sempre a camada de fundo layers do cenário, largura, altura, scrolling e caminho da imagem associada última layer do cenário é sempre a de foreground Prof. Ms. Leandro Tonietto! 3/5
Exemplo de um arquivo de cenário 2D: Conteúdo do arquivo CenárioTeste 640 480 3 L0 background 640 480 0.0 fundo.ppm L1 2aCamada 1024 480 0.25 árvores.ppm Explicação das linhas Cenário CenárioTeste de 640 por 480 e 3 layers Layer de fundo chamada Background com taxa 0.0 e uma imagem Camada intermediária de 1024 por 480 com taxa 0.25 e uma imagem L2 CamadaAcao 1280 480 0.5 obstáculos.ppm Camada de ação de 1280 por 480 com taxa 0.5 e uma imagem 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 SC2D (30%) Adicionar layer e Inserir imagem: leitura de arquivos de imagem no formato PCX ou SGI (30%) Aplicação de filtros de imagem (10%) Executar cenário (10%) 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: Associar sprite/animação com camada de ação e poder navegar com o personagem entre as camadas e lateralmente pelo cenário quando no modo de preview. Posicionamento interativo das imagens da layer. Portanto, depois de adicionar as imagens o usuário pode selecionar e uma e movimentá-la pela layer, para encontrar uma nova posição. Suporte a outros formatos de imagens, sendo que pelo menos mais um tem que ser implementado. 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 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 PCX ou SGI, mas que tenha suporta a pelo menos transparência e compressão. 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 a função de adicionar layer d) Implementar a função de adicionar imagem numa layer Prof. Ms. Leandro Tonietto! 4/5
e) Implementar as funções salvar e carregar cenário f) Opção executar: gerar uma matriz / buffer da tela que deve ser desenhada pelo OpenGL. Neste caso, desenhar todas as informações na imagem da viewport. g) Implementar os filtros de imagem e aplicação deles sobre os tiles. (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) Possibilidade de selecionar layer e mudar ordem das layers d) Terminar implementação completa do formato de arquivo de imagem e) Implementar detalhes de interface, como scroll das layer e validações de entrada de dados do usuário. f) Implementar ponto-extra 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: 21/09/2012 Prof. Ms. Leandro Tonietto! 5/5