GAME DESIGN DOCUMENT: "SURVIVORS"

Tamanho: px
Começar a partir da página:

Download "GAME DESIGN DOCUMENT: "SURVIVORS""

Transcrição

1 Universidade Estadual de Campinas Faculdade de Engenharia Elétrica e de Computação FEEC IA 369A - Tópicos em Engenharia da Computação VI: Introdução ao Projeto de Jogos Digitais - 2 Semestre 2010 GAME DESIGN DOCUMENT: "SURVIVORS" Equipe de desenvolvimento: Carlos Augusto Ribeiro Mantovani Conrado Silva Miranda Klaus Raizer Natasha Sayuri Dias Nakashima Rafael Guimarães Ramos Tiago Fernandes Tavares Orientação: Prof. Dr. José Mario De Martino CAMPINAS 2010

2 RESUMO Este documento, em sua versão final, apresenta o Game Design Document (GDD) do jogo Survivors, que foi desenvolvido pela mesma equipe que elaborou o documento. Trata-se de um guia contendo as diretrizes sobre diversos aspectos que foram abordados no desenvolvimento do projeto, tais como: nome do jogo, visão global do jogo (Game Overview), fluxo do jogo, interface do usuário, fases, personagens, armas e itens, músicas e efeitos sonoros, inteligência artificial e a arte do jogo, além de exibir o planejamento com prazos utilizados para o desenvolvimento de cada etapa de produção. A documentação dos objetos e dos códigos desenvolvidos também é apresentada no Anexo D deste documento.

3 LISTA DE FIGURAS Figura 1 - Logotipo do Unity Figura 2 - Logotipo da Unicamp Figura 3 Diagrama de Estados do Jogo Figura 4 - Diagrama de estados detalhando o estado Fases da Figura Figura 5 - Arte conceitual do HUD Figura 6 - Esquema de interface do HUD Figura 7 - HUD da versão final de Survivors Figura 8 Captura de tela da Fase 1 na versão 1.0 do jogo Figura 9 Imagens de referência para modelos de árvores para a Fase Figura 10 - Imagens de referência para modelos de troncos para a Fase Figura 11 - Imagem de referência para modelos de pedras para a Fase Figura 12 - Imagens de referência para modelos de flores para a Fase Figura 13 - Imagens de referência para modelos de cogumelos para a Fase Figura 14 - Imagem de referência para o mapa da Fase Figura 15 - Mapa desenvolvido para a Fase Figura 16 - Captura de tela da Fase 2 na versão 2.0 do jogo Figura 17 - Imagens de referência para modelos de bonecos de neve para a Fase Figura 18 - Imagem de referência para modelos de iglus para a Fase Figura 19 - Imagem de referência para modelos de chalé para a Fase Figura 20 - Imagem de referência para modelos de Papai Noel para a Fase Figura 21 - Imagem de referência para modelos de poço para a Fasa Figura 22 - Imagem de referência para o mapa da Fase Figura 23 - Mapa desenvolvido para a Fase Figura 24 - Captura de tela da Fase 3 na versão final do jogo Figura 25 - Imagens de referência para modelos de cactos para a Fase Figura 26 - Imagem de referência para modelos de pedras para a Fase Figura 27 - Imagem de referência para o mapa da Fase Figura 28 - Mapa desenvolvido para a Fase Figura 29 - Captura de tela da Fase 4 na versão final do jogo Figura 30 - Imagens de referência para modelos de carros estacionados para a Fase 4 que funcionarão como obstáculos no cenário

4 Figura 31 - Imagem de referência para modelos de hidrantes para a Fase Figura 32 - Imagem de referência para modelos de carrinhos de compras para a Fase Figura 33 - Imagem de referência para modelos de galpão para a Fase Figura 34 - Imagem de referência para o mapa da Fase Figura 35 - Mapa desenvolvido para a Fase Figura 36 - Captura de tela da Fase-Menu na versão 2.0 do jogo Figura 37 Modelos de galpão desenvolvidos para a fase-menu Figura 38 Modelo de alvo desenvolvido para a fase-menu Figura 39 Modelo de muro desenvolvido para a fase-menu Figura 40 Mapa desenvolvido para a fase-menu Figura 41 - Modelo base para elaboração do personagem principal Figura 42 Modelo para o personagem principal utilizado no jogo Figura 43 Modelos para a criação dos inimigos presentes na Fase Figura 44 Modelos 3D dos inimigos da primeira fase do jogo Figura 45 - Modelos para a criação dos inimigos presentes na Fase Figura 46 Modelos 3D dos inimigos da segunda fase do jogo Figura 47 - Modelos para a criação dos inimigos presentes na Fase Figura 48 - Modelos 3D dos inimigos da terceira fase do jogo Figura 49 Modelo de referência para a criação do inimigo final Figura 50 Modelo 3D de ônibus utilizado no jogo Figura 51 Modelo de referência para o desenvolvimento do projétil da arma padrão Figura 52 Modelo de referência para o projétil da arma especial da Fase Figura 53 - Modelo de referência para o projétil da arma especial da Fase Figura 54 Modelo de referência para o projétil da arma especial da Fase Figura 55 - Modelo de referência para o projétil da arma especial da Fase Figura 56 Modelo de referência para a mina terrestre Figura 57 Modelo de bandeira de aviso de mina terrestre Figura 58 Modelo de referência de um item de cura Figura 59 Fluxo da Estratégia Covarde Figura 60 - Fluxo da Estratégia Duelista Figura 61 - Fluxo da Estratégia Vingativo Figura 62 - Fluxo da Estratégia Kill Stealer... 75

5 Figura 63 - Fluxo da Estratégia Valentão Figura 64 - Fluxo da Estratégia Rambo Figura 65 - Fluxo da Estratégia Hipocondríaco Figura 66 - Desenho da Warner - Papa-léguas e coiote Figura 67 - Desenho da Disney - Pato Donald e Margarida Figura 68 - Mario Kart 3D Figura 69 Worms 3D Figura 70 Cadillac Figura 71 Volkswagen Fusca Figura 72 - Ônibus Figura 73 Modelos de Metralhadora e Lança - Mísseis Figura 74 - Explosões no estilo dos desenhos animados Figura 75 - Marca de Pólo Norte Figura 76 - Boneco de Neve Figura 77 Interface do jogo Worms 3D Figura 78 Visão geral dos Milestones Figura 79 Detalhes da etapa Figura 80 Detalhes da etapa

6 LISTA DE TABELAS Tabela 1 - Pesos para geração da pontuação da Fase Tabela 2 - Exemplo de pontuação após a conclusão da Fase Tabela 3 - Pesos para geração da pontuação da Fase Tabela 4 - Exemplo de pontuação após a conclusão da Fase Tabela 5 - Pesos para geração da pontuação da Fase Tabela 6 - Exemplo de pontuação após a conclusão da Fase Tabela 7 - Pesos para geração da pontuação da Fase Tabela 8 - Exemplo de pontuação após a conclusão da Fase 4 e do jogo Tabela 9 Parâmetros de equilíbrio de armas comuns Tabela 10 Parâmetros de equilíbrio de armas que variam por fase... 66

7 SUMÁRIO 1 NOME DO JOGO HISTÓRICO DO DOCUMENTO VISÃO GLOBAL DO JOGO CARACTERÍSTICAS GERAIS FILOSOFIA Ponto Filosófico # Ponto Filosófico # CONCEITO GERAL Descrição do jogo Motivação Ambientes a serem simulados Personagens controlados pelo jogador Personagens controlados pelo computador Principal objetivo do jogo Diferencial FLUXO DO JOGO PROGRESSÃO DO JOGO CENAS ENTRE FASES (CUT SCENES) HORAS DE JOGO CONDIÇÕES DE VITÓRIA SALVAR E CARREGAR INTERFACE SISTEMA VISUAL HUD Menus Câmera Iluminação dos modelos SISTEMAS DE CONTROLE Controles do usuário FASES FASE 1: A FLORESTA Descrição física FASE 2: A GELEIRA Descrição física... 37

8 6.3 FASE 3: O RALI Descrição física FASE 4: O ÚLTIMO DESAFIO Descrição física Fase-menu: Menu principal Descrição física PERSONAGENS PERSONAGEM PRINCIPAL INIMIGOS Primeira Fase Segunda Fase Terceira Fase Quarta Fase ARMAS E ITENS ARMAS Arma padrão Arma especial Mina terrestre Parâmetros de jogo ITENS Cura MÚSICAS E EFEITOS SONOROS DETALHES TÉCNICOS Músicas Efeitos sonoros INTELIGÊNCIA ARTIFICIAL CARACTERÍSTICAS COMUNS NÍVEIS DE DIFICULDADE ESTRATÉGIAS VISÃO MOVIMENTAÇÃO ARTE ARTE CONCEITUAL PERSONAGENS Armas e itens Fases Interfaces PRODUÇÃO... 87

9 12.1 Milestones do projeto Lista de tarefas E Cronograma do projeto Sistemas de Produção e Desafios ANEXOS ANEXO A - MÁRIO KART ANEXO B - TWISTED METAL ANEXO C - ARTE CONCEITUAL ANEXO D Documentação do projeto ANEXO E Softwares utilizados para o desenvolvimento de Survivors REFERÊNCIAS

10 8 1 NOME DO JOGO Survivors : Corrida pela sobrevivência.

11 9 2 HISTÓRICO DO DOCUMENTO Versão Descrição Data 1.0 Primeira versão do documento a ser entregue para avaliação e posterior aprimoramento. 31/08/ Final Atualização do documento. Feitas as correções sugeridas pelo professor. Adição do anexo referente aos scripts. Atualização do documento contendo os itens da versão 2.0 do jogo. Atualização do documento contendo os itens da versão final do jogo. 07/10/ /11/ /12/2010

12 10 3 VISÃO GLOBAL DO JOGO 3.1 CARACTERÍSTICAS GERAIS Nome do Jogo: "Survivors"; Modos de Jogo: Singleplayer (pré-requisito de desenvolvimento); Plataformas: Windows (pré-requisito de desenvolvimento); Gráficos: 3D (pré-requisito de desenvolvimento); Gênero: Corrida / Combate veicular; Principal forma de controle: Teclado; Plataforma de desenvolvimento: Unity 3D. 3.2 FILOSOFIA Nesta subseção, serão apresentados os pontos nos quais o jogo Survivors será baseado, considerados como fundamentais para o desenvolvimento do mesmo Ponto Filosófico #1 Jogo casual, para jogadores casuais 1 O jogo deve ser agradável a jogadores que não se consideram assíduos, e que gostariam de alguns minutos esporádicos de diversão Ponto Filosófico #2 Controle simples e gráficos caricaturizados Seguindo a linha de jogos como Mario Kart (ver Anexo A), o jogo deve buscar ser divertido também no modo visual, apresentando cenários, objetos e personagens caricaturizados e expressos em cores vivas. Além disto, o jogo deve 1 Jogadores casuais: Um jogador casual é um jogador não assíduo, sendo um de seus focos jogos fáceis de jogar, podendo, assim, em um primeiro contato com os mesmos, ser capaz de jogá-lo imediatamente.

13 11 apresentar controle de personagem simplificado, possibilitando que os jogadores sejam capazes assimilá-los facilmente e jogar de forma imediata. 3.3 CONCEITO GERAL Descrição do jogo "Survivors" consiste em um jogo singleplayer de combate veicular, onde o jogador controla um carro equipado com armas e itens especiais, os quais estarão espalhados pelas fases do jogo. Serão quatro fases com ambientações e desafios distintos. Nas três primeiras fases, o jogador terá como objetivo principal sobreviver após a destruição de todos os carros oponentes e, ao completá-las, ele será levado a uma arena especial, considerada como uma quarta fase, onde enfrentará um inimigo final, que é um carro mais resistente e que possui armas mais poderosas que os outros carros controlados pelo computador. Ao destruir este último inimigo, o jogo é concluído. Cada carro começa o jogo com uma única arma básica e uma quantidade de vida limitada, a qual diminui à medida que se é atingido por ataques dos carros oponentes, podendo recuperá-la, em parte, através da coleta de itens especiais espalhados pela arena de combate. Outras armas especiais podem ser coletadas durante o jogo. Desta forma, Survivors pretende ser um jogo divertido e envolvente, apresentando uma abordagem interessante em jogos de combate singleplayer, pois alia o dinamismo proporcionado pelos carros de corrida e uma atmosfera propositalmente não-realista 2, por meio de gráficos caricaturizados. 2 Diferente de um jogo não-realista, o realista apresenta uma simulação do ambiente e a apresentação gráfica se aproxima muito do real. O nível de realidade pode ser tanto gráfico quanto físico. Engines de física são fisicamente realistas, mas não necessariamente possuem componentes gráficos realistas. Jogos de jogabilidade simples e desprovidos de física podem ter gráficos extremamente realistas, tais como simulações fiéis de chamas e sistemas de partícula.

14 Motivação "Survivors" será desenvolvido devido à proposta de trabalho da disciplina IA369 de elaboração e criação de um jogo digital, aplicando na prática as etapas do processo de projeção e desenvolvimento do mesmo. As características particulares do jogo foram decididas em comum acordo entre a equipe de desenvolvimento, unindo características e idéias baseadas em alguns jogos bastante consagrados - como os da série Mario Kart (ver Anexo A), que teve sua primeira versão fabricada para o Super Nintendo (SNES) pela Nintendo em 1992 e os da série Twisted Metal (ver Anexo B), que teve sua primeira versão lançada para o PlayStation em 1995, fabricada pela SingleTrac - para a formação de um conceito de jogos de combate em tempo real que será abordado no decorrer do projeto [(WIKIPEDIA, 2010a); (WIKIPEDIA, 2010b)] Ambientes a serem simulados Conforme citado anteriormente, o jogo será composto por quatro fases distintas, que serão sequenciais. Os ambientes selecionados para serem simulados no jogo contribuem para a inserção de obstáculos e desafios, tornando as fases mais competitivas e exigindo habilidades diferentes do jogador de acordo com o foco de cada fase. Além disso, as fases apresentarão ambientações gráficas e sonoras de acordo com o ambiente em que serão simuladas e proporcionarão ao jogador a possibilidade de aquisição de armas especiais, condizentes às temáticas das fases, que estarão espalhadas pelo cenário. A sequência e uma breve descrição de cada fase são apresentadas nos seguintes itens: Primeira Fase: Ambiente: Floresta; Terreno: Pouco acidentado;

15 13 Principais obstáculos: Pedras, árvores, troncos, flores e mato, ou seja, obstáculos visuais 3 e posicionais 4 ; Principal habilidade exigida: Estratégia de posicionamento para defesa e ataque; Segunda Fase: Ambiente: Gelo; Terreno: Pouco acidentado; Principais obstáculos: Aglomerados de neve, ou seja, obstáculos visuais; Principal habilidade exigida: Habilidade de controle do carro; Terceira Fase: Ambiente: Planalto; Terreno: Altamente acidentado; Principais obstáculos: Mato, cactos, pedras e os acidentes de relevo, ou seja, obstáculos visuais; Principal habilidade exigida: Reflexo e controle de velocidade; Quarta Fase - Inimigo Final: Ambiente: Estacionamento; Terreno: Pouco acidentado; Principais obstáculos: Carros, caixotes e uma edificação em forma de galeria, ou seja, obstáculos visuais e posicionais; Habilidade principal exigida: Resistência e habilidade na coleta de armas e itens; 3 Obstáculos visuais: Os obstáculos visuais interferem apenas na visão do jogador, dificultando a observação do cenário por completo, no entanto, não obriga o jogador a desviar-se do obstáculo caso queira seguir o caminho por onde o mesmo se encontra. Um exemplo de obstáculo visual seria uma moita de mato, onde o carro possa passar por cima, sem desviar seu percurso. 4 Obstáculos posicionais: Os obstáculos posicionais interferem na direção em que o jogador irá seguir, isto é, o jogador é obrigado a alterar sua direção para poder desviar do obstáculo. Um exemplo de obstáculo posicional é uma árvore, a qual o carro não consegue transpassar. Neste caso, a árvore é um obstáculo posicional, pois interfere no percurso do jogador e também um obstáculo visual, pois também interfere no campo de visão do jogador.

16 Personagens controlados pelo jogador O jogador controlará um carro equipado com uma arma básica inicial e posteriormente poderá coletar e utilizar outras armas e itens que estarão espalhados pelas fases de acordo com cada ambiente em que se passam. O jogador será capaz de usufruir das armas e de alguns itens para causar danos a seus inimigos, além de utilizar outros itens para seu próprio benefício. O modelo do carro que será controlado pelo jogador será semelhante a um Fusca antigo (ver Anexo C). Dentre os controles que serão acessíveis pelo jogador estão: Controle de aceleração; Controle de direção; Utilização das armas; Utilização dos itens Personagens controlados pelo computador Como previamente mencionado, o jogador deverá sobreviver ao confronto com oponentes ao longo das fases do jogo. Cada oponente se comportará de maneira similar à do jogador, com acesso aos mesmos controles e limitações citadas na Seção 3.3.4, e seus comportamentos serão definidos como descrito posteriormente na Seção 10, sobre inteligência artificial Principal objetivo do jogo Como o próprio nome do jogo sugere, o principal objetivo do jogo é a sobrevivência. Não importa a quantidade de inimigos que serão destruídos pelo jogador, mas sim se o jogador conseguirá permanecer vivo durante as batalhas em que ele estará sujeito. No entanto, quanto mais oponentes destruídos pelo jogador, maior a chance de sobreviver, visto que, desta forma, o número de inimigos diminui. Conhecendo o objetivo do jogo e as particularidades que cada fase proporciona ao jogador, cabe a ele elaborar a melhor estratégia para vencer seus desafios e manter-se vivo diante das situações em que se encontrará.

17 Diferencial O diferencial apresentado pelo jogo Survivors é a combinação de elementos relacionados a jogos de corrida de carros singleplayer como Mario Kart, jogos de tiros como Twisted Metal e um ambiente caricaturizado, tornando-se, assim, uma opção divertida tanto para jogadores experientes nos estilos citados acima quanto para jogadores casuais, considerados como não assíduos e que buscam nos jogos somente uma forma de passar o tempo.

18 16 4 FLUXO DO JOGO Esta seção do GDD apresenta a descrição detalhada do progresso do jogo, especificando o que o jogador poderá fazer em cada uma das cenas que compõem o mesmo. Assim, serão descritos o diagrama de estados do jogo e cada uma das decisões a serem tomadas pelo usuário no decorrer do mesmo, as cenas entre as fases e as características do jogo, como tempo médio para concluí-lo e condição de término do mesmo. 4.1 PROGRESSÃO DO JOGO Ao iniciar o jogo, será apresentado ao usuário o logotipo do software utilizado para o desenvolvimento do jogo, Unity, e o símbolo da UNICAMP, como podem ser vistos nas imagens abaixo (Figura 1 e Figura 2): Figura 1 - Logotipo do Unity Figura 2 - Logotipo da Unicamp Em seguida, o usuário será levado ao menu principal, o qual na segunda versão do jogo passou a ser uma fase extra, onde poderá selecionar uma das seguintes opções: Novo, Carregar, Ranking ou Sair. Ao escolher a

19 17 primeira opção, o jogador será encaminhado à cena de seleção do nível de dificuldade em que deseja jogar, sendo estes 3 níveis: fácil, normal ou difícil. A segunda opção levará o jogador à cena para a escolha de um ponto do jogo salvo anteriormente, a terceira opção mostrará uma lista com os maiores pontuadores do jogo, enquanto que a quarta opção permite sair do jogo. O jogador poderá voltar para o menu principal ao pressionar a tecla ESC do teclado. Após a seleção do nível de dificuldade do jogo, irá aparecer uma cena com a visão geral do mapa da fase e após 4 segundos, será apresentada a primeira fase do mesmo, a qual iniciará com uma contagem regressiva de três segundos antes de a fase ser efetivamente iniciada. A fase terminará se o jogador morrer, em caso de derrota, ou se todos os inimigos presentes na fase morrerem, em caso de vitória. Ao término da primeira fase, será mostrado o número de pontos obtidos pelo jogador e, em seguida, ele será levado para a próxima fase do jogo. Assim como na primeira, antes do início das fases seguintes será apresentado ao jogador um mapa e após 4 segundos, iniciará a batalha, terminando também da mesma forma que a primeira fase. Após passar para a quarta fase do jogo, o jogador será apresentado ao chefão ou boss, o qual será um oponente mais forte que os enfrentados anteriormente. Nesta fase, o objetivo do jogador será apenas destruir o oponente. Caso vença, o jogador visualizará os pontos obtidos na fase e, em seguida, será apresentado o ranking atualizado do jogo e os créditos do mesmo. A Figura 3 exibe o diagrama de estados do jogo e a Figura 4 apresenta um diagrama de estados detalhado do estado Fases presente no primeiro diagrama.

20 Figura 3 Diagrama de Estados do Jogo 18

21 19 Figura 4 - Diagrama de estados detalhando o estado Fases da Figura CENAS ENTRE FASES (CUT SCENES) Ao todo, o jogo será composto por onze cenas entre fases: 1. Logo do Unity: esta cena será a primeira a ser apresentada ao jogador ao iniciar o jogo; 2. Logo da UNICAMP: logo após a apresentação do Unity;

22 20 3. Menu 01 (Novo, Carregar, Ranking e Sair): o Menu 01 será composto por quatro opções: Novo: nesta opção, o jogador poderá iniciar um novo jogo; Ranking: ao selecionar esta opção, poderá ser visualizado o ranking do jogo até o momento atual; Carregar: ao escolher esta opção, poderá ser carregado um jogo salvo anteriormente. Sair: aqui o jogador sairá do jogo. 4. Seleção de nível de dificuldade: após selecionar a opção iniciar um novo jogo no Menu 01, o jogador deverá escolher o nível de dificuldade em que deseja jogar. Os níveis disponíveis serão: fácil, normal e difícil; 5. Menu 02 (Reiniciar, Menu 01, Salvar e Carregar): o Menu 02 será composto por quatro opções: Reiniciar: o jogador poderá reiniciar a fase em que estiver jogando; Menu 01: esta opção permite que o jogador saia do jogo e volte para o menu inicial (Menu 01); Salvar: o jogo poderá ser salvo a qualquer momento pelo jogador ao selecionar esta opção do Menu 02; Carregar: a qualquer momento do jogo, o jogador poderá carregar um jogo salvo anteriormente. 6. Créditos: ao completar o jogo, será apresentada ao jogador a cena de créditos do jogo, a qual irá conter informações a respeito do mesmo, como o nome dos desenvolvedores entre outras; 7. Visualização do Ranking: esta cena poderá ser vista pelo jogador ao visualizar o mural de Ranking, no Menu 01, ou após o término do jogo, sendo esta última a versão atualizada do mesmo; 8. Carregar: a cena de carregar jogo poderá ser selecionada tanto no Menu 01 quanto no Menu 02 do jogo. Aqui, serão mostrados ao jogador todos os pontos salvos do jogo;

23 21 9. Salvar jogo: nesta cena, o jogador poderá salvar o jogo atual, podendo criar um novo ponto ou sobrescrever um ponto salvo anteriormente; 10. Início da Fase: antes do início de cada fase, será apresentada ao jogador uma visão geral do mapa em que ele irá jogar. 4.3 HORAS DE JOGO Para o término do jogo, está sendo previsto uma hora de jogo, visto que cada fase poderá durar em torno de quinze minutos. 4.4 CONDIÇÕES DE VITÓRIA O jogador será considerado vencedor de uma fase se este for o último carro a permanecer vivo na mesma. Para concluir o jogo, o jogador deverá vencer as quatro fases que compõem o mesmo. 4.5 SALVAR E CARREGAR Ao jogador, será permitido salvar o jogo a qualquer momento da fase que se está jogando, através do Menu 02. Para carregar um jogo salvo anteriormente, o jogador deverá acessar o Menu 01 ou o Menu 02.

24 22 5 INTERFACE Esta seção do GDD especifica o que será exibido ao usuário para que ele controle o jogo e o que ele pode fornecer de entrada para alterar o jogo. Assim, especifica câmeras, Head Up Display (HUD 5 ), menus, iluminação e controle, visando uma harmonia com as outras partes do projeto. A interface do usuário se dará através do teclado, para o controle, e do monitor, para exibição. As posições dos objetos ou teclas focam uma facilidade de jogo. Por isso, o campo visual do jogador será extenso e com pouca distração na HUD. Os menus servirão como um tutorial, sendo controlados pela posição do carro, que possui os mesmos comandos de dentro do jogo. Com isso, a única câmera que se movimenta estará acima do carro. A iluminação se dará inteiramente por luz ambiente e direcional. Como os menus possuirão os mesmos controles que as fases, o jogador ficará submergido no jogo, selecionando opções e seguindo as fases de maneira contínua, ou seja, sem passar de um visual dinâmico do jogo para um visual estático dos menus padrões. Detalhes sobre a arte (Seção 11), as fases (Seção 6) e os sons utilizados (Seção 9) são descritos em suas respectivas seções. 5.1 SISTEMA VISUAL O sistema visual se divide em duas partes diferentes: HUD e menus, que lidam com a maneira pela qual o jogador interage visualmente com o ambiente de jogo, e câmeras e iluminação, que se referem a como o mundo de jogo se apresenta ao jogador HUD O HUD durante as fases será semelhante à Figura 5, que foi esboçada manualmente no início do projeto para definir o conceito aproximado. 5 O HUD, sigla para Head Up Display, é um instrumento inicialmente desenvolvido para utilização em aeronaves visando a fornecer informações visuais ao piloto sem que este tenha que desviar os olhos do alvo à frente da aeronave (WIKIPEDIA, 2010c).

25 23 Figura 5 - Arte conceitual do HUD conforme a Figura 6. Baseado neste modelo, o esquema final da interface foi construído Figura 6 - Esquema de interface do HUD No esquemático apresentado na Figura 6, são apresentados 6 elementos que estão descritos nos seguintes itens: 1. Mini mapa: O mini mapa estará localizado no canto superior direito da tela do jogador. Em seu centro, aparecerá um triângulo representando o jogador e

26 24 círculos representando o inimigo. Quando o jogador altera sua direção, a posição dos inimigos será rotacionada da mesma quantidade em relação ao centro do círculo, fazendo com que o triângulo sempre aponte para cima. O mini mapa possuirá capacidade de visualizar todo o mapa; 2. Tacômetro: Localizado no canto inferior direito, o tacômetro mostrará qualitativamente e quantitativamente a velocidade do usuário. O valor numérico foi mantido por facilitar a visualização da velocidade atual do carro. O desenho do mostrador será igual ao do desenho conceitual, apresentando um arco de circunferência com uma seta apontando para a velocidade atual; 3. Mostrador de vida: Um mostrador de vida contínuo estará posicionado acima e à direita. Este mostrador não possuirá valores numéricos, tendo um coração ao seu lado. Ele alterará sua cor de verde (100%) para vermelho (0%) de acordo com a quantidade de vida do jogador no momento, fazendo uma média para valores intermediários. Quando o jogador pegar um item de vida, aparecerão sinais de '+' na barra entre a quantidade de vida anterior e a quantidade de vida atual, dando "fade out" gradativo durante 3 segundos; 4. Mostrador de arma: A arma selecionada e a quantidade de munição disponível ficarão no canto inferior esquerdo. O desenho mostrado será apenas uma representação em 2D do tiro da arma ou da mina, dependendo da arma utilizada. Caso a arma tenha munição limitada, um 'x' seguido do número de unidades disponíveis ficarão ao lado do desenho; 5. Jogador: Posição do carro do jogador em relação aos outros componentes; 6. Oponente: Um oponente exemplo. Sua barra de vida aparecerá em cima do carro, como mostrado no esquema. A Figura 7 exibe a tela do jogo em sua versão final. Nesta figura, nota-se a presença dos elementos do HUD descritos nos itens acima.

27 25 Figura 7 - HUD da versão final de Survivors Menus O menu inicial será como uma fase do jogo, sendo controlados pelo jogador. Quando ele estiver neste menu, um texto aparecerá explicando como controlar o carro. Este menu constitui-se de galpões assemelhados a garagens, que possuem o nome da opção na sua parte da frente e dentro de cada galpão haverão alvos simbolizando as opções que o jogador pode escolher naquela categoria. Para selecionar uma opção, ele deverá atirar no alvo, utilizando a arma básica ou a arma especial do carro, que no caso deste menu, é a mesma da fase 1. O menu 2 é o menu que pode ser acessado no decorrer do jogo, quando o jogador está em alguma fase. Ao pressionar a tecla P, surgem um menu 2D dotado de botões com as opções de Salvar, Carregar e Voltar ao jogo Câmera A câmera que reproduz a visão do jogador estará localizada acima do carro, um pouco atrás, gerando uma visão em terceira pessoa. A câmera principal será de perspectiva e seguirá o carro do jogador, girando e transladando com ele. Buscando-se um efeito visualmente mais agradável,

28 26 a princípio a câmera terá um atraso em relação ao movimento do carro, fazendo com que haja um pequeno deslocamento da posição do carro do jogador na tela quando ele realiza um movimento Iluminação dos modelos A iluminação se dará por luz difusa e direcional, simulando apenas a iluminação do sol e, na segunda fase, os carros possuirão faróis que ajudarão a iluminar o ambiente naquele cenário. 5.2 SISTEMAS DE CONTROLE O sistema de controle não possuirá comandos específicos do usuário, sendo o jogo inteiro baseado nos mesmos controles básicos Controles do usuário O usuário será capaz de controlar a abertura de um menu durante as fases, o carro e suas armas. Os controles do carro serão: Aceleração: Utilizando a tecla direcional para cima, o carro acelerará para frente. Caso o carro esteja indo para trás, o carro iniciará uma frenagem, reduzindo gradativamente sua velocidade. Como partes do jogo são sujeitas a um efeito de escorregamento das rodas do carro no solo do cenário, a aceleração obtida será a princípio inversamente proporcional ao escorregamento em questão, ou seja, quanto maior o escorregamento menor será a aceleração efetivamente alcançada. Caso a aceleração e o freio sejam ativados ao mesmo tempo, ambos funcionarão como se não tivessem sido apertados; Freio: Possuirá o mesmo comportamento da aceleração, mas em sentido oposto, sendo controlado pelo direcional para baixo. Caso o carro esteja parado, ele ativará a ré; Mudança de direção: A direção do carro será controlada pelas teclas direcionais para direita e esquerda. Eles alterarão o ângulo do carro de

29 27 acordo com o deslocamento linear, tornando impossível a rotação do carro parado. Caso os dois direcionais estejam ativados, nenhum terá efeito. A extremidade do carro controlada será a da frente da direção seguida, sendo normal se ele estiver se deslocando para frente ou ao contrário, caso esteja para trás. Os controles das armas serão: Disparo: A tecla Ctrl disparará a arma atual, criando um projétil e reduzindo sua munição, caso isso se aplique à arma. Como será visto em mais detalhes na Seção 8, no caso de a arma atual ser uma mina, ela será colocada atrás da posição atual do jogador; Troca de arma: A tecla espaço circulará pelas armas disponíveis. Anteriormente, isto seria feito pelas teclas Q e W (circulando em direções opostas), porém, como o número de armas é pequeno e a tecla espaço é mais próxima das demais teclas de controle que Q e W, julgou-se mais conveniente realizar esta mudança. A arma atual será exibida da maneira descrita pelo HUD na Seção 5.1.1; Troca de alvo: Com este comando, troca-se o alvo caso a arma equipa possua o recurso de mira automática. Como a antiga tecla para esse comando (espaço) está agora sendo utilizada para troca de arma, a tecla que ativará o comando será a tecla Z. O comando circula entre os possíveis alvos (que são aqueles visíveis na tela) da esquerda para a direita e de cima para baixo. Pressionando-se Shift+Z, circula-se no sentido contrário. Para abrir o menu disponível entre fases, a tecla utilizada será P. Quando pressionada dentro do jogo, o jogador será levado ao menu intermediário com opções de carregar e salvar o jogo, além de retornar ao jogo. O jogador poderá sair do jogo pressionando a tecla ESC e regular o volume do áudio através das teclas K e L.

30 28 6 FASES O enredo do jogo se desenvolverá em quatro fases distintas e que serão simuladas em ambientes e cenários com características particulares, viabilizando, desta forma, a inserção de itens, armas, objetos e oponentes diferentes para cada uma delas e também exigindo habilidades especiais de acordo com cada ambiente. Por se tratar de um jogo sequencial, ou seja, que obedece a uma certa sequência de fases, o ideal é que a dificuldade e a complexidade dos desafios oferecidos pelos ambientes e oponentes aumentam conforme o jogo se desenvolve. Nesta seção, serão apresentadas as fases do jogo e suas particularidades, descrevendo as características dos ambientes em que serão simuladas, os desafios, as habilidades exigidas e os itens que surgirão no decorrer do jogo. Em cada fase, serão encontradas diferentes armas especiais e personagens oponentes, e serão tocadas diferentes músicas e efeitos sonoros. Nesta seção, também será descrita a Fase-Menu do jogo, a qual, além de servir para a seleção das opções do Menu 01 descrito no Fluxo do Jogo (Seção 4), tem como função servir como uma apresentação dos controles do jogo. 6.1 FASE 1: A FLORESTA Resumo: A primeira fase tem por objetivo, além da sobrevivência do personagem controlado pelo jogador, oferecer um ambiente favorável à familiarização do jogador com os controles do jogo e com as armas e itens que surgirão durante o decorrer das fases. Como o jogo possui caráter sequencial, é normal que esta primeira fase seja um pouco mais fácil em seus desafios, quando comparada com as fases seguintes, desde que estejam no mesmo nível de dificuldade inicial selecionado pelo jogador. Pontuação final: A pontuação final da fase 1 será baseada nos seguintes itens: o o Porcentagem de tiros acertados; Porcentagem de vida restante;

31 29 o o o o o Quantidade de inimigos mortos pelo jogador; Quantidade de itens coletados pelo jogador; Quantidade de quilômetros percorridos pelo jogador; Tempo de conclusão da fase; Bônus por conclusão de fase. Por meio destes itens, serão aplicados alguns pesos, ou fatores multiplicadores, para a geração da pontuação final conforme exibido na Tabela 1: Tabela 1 - Pesos para geração da pontuação da Fase 1 Item Fator Multiplicador % Tiros acertados 10 % Vida restante 100 Inimigos mortos 1500 Itens coletados 50 Quilômetros rodados 100 Tempo de conclusão (15-TC) x 100 Bônus por conclusão 1000 Onde TC corresponde ao tempo que o jogador levou para concluir a fase em minutos, excluindo-se os segundos, o que leva a um decremento na pontuação caso TC > 15. Exemplo de Pontuação: da primeira fase: A Tabela 2 exibe um exemplo de pontuação de um jogador ao final

32 30 Tabela 2 - Exemplo de pontuação após a conclusão da Fase 1 Item Quantidade Fator Multiplicador Pontos % Tiros acertados % Vida restante Inimigos mortos 2/ Itens coletados Quilômetros rodados Tempo de conclusão 6:20 (15-TC) x Bônus por conclusão TOTAL Desta forma, o jogador passaria para a segunda fase e levando consigo 7760 pontos que serão acumulados com a pontuação das fases seguintes. Objetivos: Os objetivos da fase 1 estão descritos nos seguintes itens: o o o o o o Familiarização do jogador com os controles do carro; Familiarização do jogador com os tipos de obstáculos do jogo; Desenvolvimento de habilidades para coleta de armas e itens; Desenvolvimento de habilidades para posicionamento no cenário, elaborando estratégias de ataque e defesa; Eliminação dos inimigos; Sobrevivência ao final da fase (objetivo principal do jogo); Descrição física Pontos gerais: o o Ambiente: Floresta; Terreno: Pouco acidentado;

33 31 o o Principais obstáculos: Pedras, árvores, troncos, flores e cogumelos, ou seja, obstáculos visuais e posicionais; Principal habilidade exigida: Estratégia de posicionamento para defesa e ataque; Características do mundo de jogo: Esta fase se passará em uma floresta, portanto, suas características tenderão a simular este tipo de ambiente contendo terreno, árvores, pedras, flores e arbustos condizentes aos modelos que são comumente encontrados em uma floresta real. No entanto, a forma como estes elementos serão apresentados aos jogadores é relacionada com a proposta do jogo, por meio de gráficos caricaturizados. A fase é circundada por uma cadeia de montanhas, algumas mais altas que não permitem que os carros passem por elas e outras mais baixas que poderão ser "escaladas" pelos carros e, ao ultrapassar estas montanhas, o personagem cairá em um "buraco negro" e perderá uma quantidade de vida e retornará ao ponto onde iniciou a fase, caso sua vida não tenha se esgotado. A Figura 8 exibe o personagem controlado pelo jogador no cenário da primeira fase, na versão 1.0 do jogo. Figura 8 Captura de tela da Fase 1 na versão 1.0 do jogo

34 32 Ambientação física do mundo de jogo: o o Escala: A princípio, o ambiente desta fase será simulado em um mapa circular com diâmetro de aproximadamente 400 metros. Objetos: Os objetos desta fase consistem em: Personagem principal controlado pelo jogador (ver seção 7.1); 3 oponentes (ver seção 7.2.1); Árvores; Figura 9 Imagens de referência para modelos de árvores para a Fase 1 Troncos de árvores cortados; Figura 10 - Imagens de referência para modelos de troncos para a Fase 1 Pedras; Figura 11 - Imagem de referência para modelos de pedras para a Fase 1

35 33 Montanhas; Flores; Figura 12 - Imagens de referência para modelos de flores para a Fase 1 Cogumelos; Figura 13 - Imagens de referência para modelos de cogumelos para a Fase 1 Pontes; Grama; Arma (ver Seção 8.1); Mina terrestre (ver Seção 8.1.3); Itens restauradores de vida (ver Seção 8.2.1). o o o o Clima: Verão, ou seja, céu azul com sol e poucas nuvens. Período: Diurno, vespertino. Tempo de jogo estimado: 15 minutos. Mapa de referência:

36 34 Figura 14 - Imagem de referência para o mapa da Fase 1 o Mapa desenvolvido: Figura 15 - Mapa desenvolvido para a Fase 1

37 FASE 2: A GELEIRA Resumo: Como o jogador já concluiu a primeira fase ao chegar à fase 2, nesta se exigirá do jogador várias habilidades adquiridas na fase anterior, além de impor uma dificuldade a mais neste ambiente. Por se tratar de um ambiente frio, com gelo espalhado pelo mapa, uma atmosfera enevoada dificultará a visão do jogador e o terreno ficará escorregadio (o coeficiente de atrito entre o solo e as rodas dos veículos será reduzido para uma fração do original, sendo tal fração decidida de forma experimental durante o desenvolvimento do jogo), o que na prática significa que o controle do carro será mais difícil, principalmente nas curvas. Pontuação final: A pontuação final da fase 2, assim como na fase 1, será baseada nos seguintes itens: o o o o o o o Porcentagem de tiros acertados; Porcentagem de vida restante; Quantidade de inimigos mortos pelo jogador; Quantidade de itens coletados pelo jogador; Quantidade de Quilômetros percorridos pelo jogador; Tempo de conclusão da fase; Bônus por conclusão de fase. No entanto, esta pontuação se acumula com a obtida no decorrer da primeira fase. Como esta fase possui maior dificuldade de controle do carro, algumas habilidades exigidas geram uma maior pontuação. Isso significa dizer que os pesos de alguns itens são maiores quando comparados com os pesos estipulados para a fase 1. Para a geração da pontuação final da fase 2, serão utilizados os fatores multiplicadores conforme os exibidos na Tabela 3:

38 36 Tabela 3 - Pesos para geração da pontuação da Fase 2 Item Fator Multiplicador % Tiros acertados 10 % Vida restante 100 Inimigos mortos 1500 Itens coletados 100 Quilômetros rodados 200 Tempo de conclusão (15-TC) x 100 Bônus por conclusão 2000 Onde TC corresponde ao tempo que o jogador levou para concluir a fase em minutos, excluindo-se os segundos. Exemplo de Pontuação: da segunda fase: A Tabela 4 exibe um exemplo de pontuação de um jogador ao final Tabela 4 - Exemplo de pontuação após a conclusão da Fase 2 Item Quantidade Fator Multiplicador Pontos % Tiros acertados % Vida restante Inimigos mortos 2/ Itens coletados Quilômetros rodados Tempo de conclusão 6:20 (15-TC) x Bônus por conclusão Pontuação Fase TOTAL

39 37 Desta forma, o jogador estaria passando para a terceira fase e levando consigo pontos que serão acumulados com a pontuação das fases seguintes. Objetivos: Os objetivos da fase 2 estão descritos nos seguintes itens: o o o o Desenvolvimento de habilidades para controle do carro em pisos escorregadios; Desenvolvimento de habilidades de velocidade de ataque e defesa em ambientes com pouca visibilidade; Eliminação dos inimigos; Sobrevivência ao final da fase (objetivo principal do jogo); Descrição física Pontos gerais: o o o o Ambiente: Gelo; Terreno: Pouco acidentado; Principais obstáculos: Aglomerados de neve, ou seja, obstáculos visuais; Principal habilidade exigida: Habilidade de controle do carro; Características do mundo de jogo: O ambiente desta fase será composto por uma base que foi atingida por uma avalanche de gelo. O clima a ser simulado será bastante frio, o que contextualizará a criação de um ambiente enevoado, dificultando a visão do jogador. Neste mundo de jogo, o controle do carro também será comprometido devido ao piso escorregadio, gerando derrapagens nas curvas. Assim como a fase 1, a fase 2 também será circulada por uma cadeia de montanhas. No entanto, nesta fase, todas as montanhas serão altas, cobertas de neve e não poderão ser "escaladas" e/ou ultrapassadas pelos carros. A Figura 16 exibe o personagem controlado pelo jogador no cenário da segunda fase, na versão 2.0 do jogo.

40 38 Figura 16 - Captura de tela da Fase 2 na versão 2.0 do jogo Ambientação física do mundo de jogo: o o Escala: A princípio, o ambiente desta fase será simulado em um mapa circular com diâmetro de aproximadamente 500 metros. Objetos: Os objetos desta fase consistem em: Personagem principal controlado pelo jogador (ver Seção 7.1); 3 oponentes (ver Seção 7.2.2); Árvores com gelo; Bonecos de neve; Figura 17 - Imagens de referência para modelos de bonecos de neve para a Fase 2

41 39 Aglomerados de neve; Iglus; Figura 18 - Imagem de referência para modelos de iglus para a Fase 2 Montanhas; Chalé; Figura 19 - Imagem de referência para modelos de chalé para a Fase 2 Papai Noel; Figura 20 - Imagem de referência para modelos de Papai Noel para a Fase 2

42 40 Poço; Figura 21 - Imagem de referência para modelos de poço para a Fasa 2 Arma (ver seção 8.1); Mina terrestre (ver seção 8.1.3); Itens restauradores de vida (ver seção 8.2.1). o o o o Clima: Inverno, ou seja, ambiente frio com bastante neblina. Período: Diurno, vespertino. Tempo de jogo estimado: 15 minutos. Mapa de referência: Figura 22 - Imagem de referência para o mapa da Fase 2

43 41 o Mapa desenvolvido: Figura 23 - Mapa desenvolvido para a Fase FASE 3: O RALI Resumo: Esta fase possuirá uma abordagem um pouco diferente das duas anteriores, pois nela será exigido um alto controle sobre o carro e bastante reflexo para atacar e defender, dada a imprevisibilidade dos movimentos fruto do escorregamento previamente comentado. O foco principal desta fase será a velocidade, uma vez que o campo de batalha não conterá tantos obstáculos como nas duas primeiras fases. Pontuação final: A pontuação final da fase 3 será baseada nos seguintes itens: o o o o o o o Porcentagem de tiros acertados; Porcentagem de vida restante; Quantidade de inimigos mortos pelo jogador; Quantidade de itens coletados pelo jogador; Quantidade de quilômetros percorridos pelo jogador; Tempo de conclusão da fase; Bônus por conclusão de fase.

44 42 No entanto, esta pontuação se acumula com a obtida no decorrer das duas primeiras fases. Assim como na segunda fase, a fase 3 exige mais controle sobre algumas habilidades do que outras. Desta forma, alguns itens geram uma maior pontuação. Para a geração da pontuação final da fase 3, serão utilizados os fatores multiplicadores conforme os exibidos na Tabela 5. Tabela 5 - Pesos para geração da pontuação da Fase 3 Item Fator Multiplicador % Tiros acertados 20 % Vida restante 100 Inimigos mortos 1500 Itens coletados 200 Quilômetros rodados 200 Tempo de conclusão (15-TC) x 150 Bônus por conclusão 3000 Onde TC corresponde ao tempo que o jogador levou para concluir a fase em minutos, excluindo-se os segundos. Exemplo de Pontuação: da terceira fase: A Tabela 6 exibe um exemplo de pontuação de um jogador ao final

45 43 Tabela 6 - Exemplo de pontuação após a conclusão da Fase 3 Item Quantidade Fator Multiplicador Pontos % Tiros acertados % Vida restante Inimigos mortos 2/ Itens coletados Quilômetros rodados Tempo de conclusão 6:20 (15-TC) x Bônus por conclusão Pontuação Acumulada TOTAL Desta forma, o jogador estaria passando para a quarta e última fase levando consigo pontos que serão acumulados com a pontuação da próxima fase. Objetivos: Os objetivos da fase 3 estão descritos nos seguintes itens: o o o o o Desenvolvimento de capacidade de coleta de itens em alta velocidade; Desenvolvimento de capacidade de atacar e defender em alta velocidade; Desenvolvimento do controle do carro em terreno altamente acidentado; Eliminação dos inimigos; Sobrevivência ao final da fase (objetivo principal do jogo); Descrição física Pontos gerais: o Ambiente: Planalto;

46 44 o o o Terreno: Altamente acidentado; Principais obstáculos: Mato, cactos, pedras e os acidentes de relevo, ou seja, obstáculos visuais e obstáculos posicionais; Principal habilidade exigida: Reflexo e controle de velocidade; Características do mundo de jogo: Esta fase se passará em um ambiente deserto com pouca vegetação e terreno altamente acidentado. Este fato contextualizará a simulação de um ambiente contendo poucos obstáculos, possibilitando que o jogador mantenha o carro na maior parte do tempo de jogo em alta velocidade e, desta forma, exigindo que o jogador tenha habilidade de controle do carro suficiente para coletar itens atacar seus oponentes e se defender. Assim como as duas primeiras fases, esta também será circulada por montanhas. No entanto estas montanhas não poderão ser escaladas ou ultrapassadas pelos carros. Figura 24 - Captura de tela da Fase 3 na versão final do jogo Ambientação física do mundo de jogo: o o Escala: A princípio, o ambiente desta fase será simulado em um mapa circular com diâmetro de aproximadamente 700 metros. Objetos: Os objetos desta fase consistem em: Personagem principal controlado pelo jogador (ver Seção 7.1); 3 oponentes (ver Seção 7.2.3);

47 45 Cactos; Figura 25 - Imagens de referência para modelos de cactos para a Fase 3 Pedras; Figura 26 - Imagem de referência para modelos de pedras para a Fase 3 Montanhas; Areia; Arma (ver seção 8.1); Mina terrestre (ver seção 8.1.3); Itens restauradores de vida (ver seção 8.2.1). o o o o Clima: Verão, ou seja, tempo seco, céu limpo com sol e sem nuvens. Período: Diurno. Tempo de jogo estimado: 15 minutos. Mapa de referência:

48 46 Figura 27 - Imagem de referência para o mapa da Fase 3 o Mapa desenvolvido: Figura 28 - Mapa desenvolvido para a Fase FASE 4: O ÚLTIMO DESAFIO Resumo: A quarta fase será a última do jogo. Ela possuirá algumas particularidades como a existência de um único oponente. No entanto, este oponente será mais resistente e mais poderoso do que os encontrados nas fases anteriores.

49 47 Pontuação final: A pontuação final da fase 4 será também a pontuação final do jogo. Seu cálculo será baseado nos seguintes itens: o o o o o o Porcentagem de tiros acertados; Porcentagem de vida restante; Quantidade de itens coletados pelo jogador; Quantidade de quilômetros percorridos pelo jogador; Tempo de conclusão da fase; Bônus por conclusão de fase. Assim como nas fases 2 e 3, a pontuação da fase 4 se acumula com a obtida no decorrer das fases anteriores. Para a geração da pontuação final da fase 4, serão utilizados os fatores multiplicadores conforme os exibidos na Tabela 7: Tabela 7 - Pesos para geração da pontuação da Fase 4 Item Fator Multiplicador % Tiros acertados 20 % Vida restante 300 Itens coletados 200 Quilômetros rodados 200 Tempo de conclusão (15-TC) x 150 Bônus por conclusão 5000 Onde TC corresponde ao tempo que o jogador levou para concluir a fase em minutos, excluindo-se os segundos. Exemplo de Pontuação: da quarta e última fase: A Tabela 8 exibe um exemplo de pontuação de um jogador ao final

50 48 Tabela 8 - Exemplo de pontuação após a conclusão da Fase 4 e do jogo Item Quantidade Fator Multiplicador Pontos % Tiros acertados % Vida restante Itens coletados Quilômetros rodados Tempo de conclusão 6:20 (15-TC) x Bônus por conclusão Pontuação Acumulada TOTAL acumulados. Desta forma, o jogador concluiria o jogo com pontos Objetivos: Os objetivos da fase 4 estão descritos nos seguintes itens: o o o Coleta de itens; Eliminação do único oponente; Sobrevivência ao final da fase (objetivo principal do jogo); Descrição física Pontos gerais: o o o Ambiente: Estacionamento; Terreno: Pouco acidentado; Principais obstáculos: Carros, caixotes e uma edificação em forma de galeria, ou seja, obstáculos visuais e posicionais;

51 49 o Principal habilidade exigida: Resistência, para usar constantemente as estratégias aprendidas nas primeiras fases, e habilidade na coleta de armas e itens; Características do mundo de jogo: A quarta e última fase se desenvolve em um estacionamento amplo com poucos obstáculos, o que permite que o ambiente seja simulado em um terreno pouco acidentado. Os obstáculos que serão encontrados no ambiente auxiliarão o jogador em suas estratégias de ataque e defesa, permitindo que o mesmo esconda-se de um ataque do oponente e possa atacar no momento que considerar o mais adequado. Este mapa será cercado por um muro que poderá ser ultrapassado tanto pelo jogador, quanto pelo oponente. Ao ultrapassar esse muro, através de explosões causadas pelas minas terrestres ou pelos mísseis, o carro cai em um buraco negro e retorna para a posição inicial da fase. A fase acaba quando a vida de um dos dois jogadores termina. A Figura 29 exibe o personagem controlado pelo jogador no cenário da quarta fase, na versão final do jogo. Figura 29 - Captura de tela da Fase 4 na versão final do jogo

52 50 Ambientação física do mundo de jogo: o o Escala: A princípio, o ambiente desta fase será simulado em um mapa quadrangular com lado de aproximadamente 800 metros. Objetos: Os objetos desta fase consistem em: Personagem principal controlado pelo jogador (ver seção 7.1); 1 oponente (ver seção 7.2.4); Carros estacionados (ver Figura 30); Figura 30 - Imagens de referência para modelos de carros estacionados para a Fase 4 que funcionarão como obstáculos no cenário. Hidrantes; Figura 31 - Imagem de referência para modelos de hidrantes para a Fase 4

53 51 Carrinhos de compras; Figura 32 - Imagem de referência para modelos de carrinhos de compras para a Fase 4 1 galpão; Figura 33 - Imagem de referência para modelos de galpão para a Fase 4 Arma (ver seção 8.1); Mina terrestre (ver seção 8.1.3); Itens restauradores de vida (ver seção 8.2.1). o o o o Clima: Verão, ou seja, céu limpo com sol e poucas nuvens. Período: Diurno, vespertino. Tempo de jogo estimado: 15 minutos. Mapa de referência:

54 52 Figura 34 - Imagem de referência para o mapa da Fase 4 o Mapa desenvolvido: Figura 35 - Mapa desenvolvido para a Fase FASE-MENU: MENU PRINCIPAL Resumo: Esta será uma introdutória, onde o jogador pode aprender e experimentar os controles do carro, bem como escolher dentre as opções disponíveis: New Game, Load Game e Quit, descritas no Fluxo do Jogo (Seção 4). Objetivo: O objetivo nesta fase é: o Acertar o alvo do galpão com a opção desejada

55 Descrição física Pontos gerais: o o o o Ambiente: Galpão; Terreno: Pouco acidentado; Principais obstáculos: Galpões e alvos; Principal habilidade exigida: Não irá exigir nenhuma habilidade, visto que esta fase servirá como treinamento dos controles do jogo; Características do mundo de jogo: A Fase-Menu se desenvolve em um espaço amplo com poucos obstáculos, sendo estes apenas um muro que irá limitar a movimentação do jogador no cenário, galpões para cada opção do Menu 01 descrito no fluxo do Jogo (Seção 4) e os alvos que irão ser utilizados para a seleção destas opções. A fase acaba quando o jogador acerta um dos alvos presentes nos galpões. A Figura 36 exibe o personagem controlado pelo jogador no cenário da fase, na versão 2.0 do jogo. Figura 36 - Captura de tela da Fase-Menu na versão 2.0 do jogo

56 54 Ambientação física do mundo de jogo: o o Escala: A princípio, o ambiente desta fase será simulado em um mapa quadrangular com lado de aproximadamente 80 metros. Objetos: Os objetos desta fase consistem em: Personagem principal controlado pelo jogador (ver seção 7.1); 3 galpões; Figura 37 Modelos de galpão desenvolvidos para a fase-menu 7 alvos; Figura 38 Modelo de alvo desenvolvido para a fase-menu 4 muros;

57 55 Figura 39 Modelo de muro desenvolvido para a fase-menu 1 Mural com o Ranking; o o o o Clima: Verão. Período: Diurno. Tempo de jogo estimado: 5 minutos. Mapa desenvolvido: Figura 40 Mapa desenvolvido para a fase-menu

58 56 7 PERSONAGENS Todos os personagens de Survivors serão carros e poderão tanto ser baseados em carros reais quanto em modelos criados ou adaptados pelos desenvolvedores do jogo. Cada um destes personagens será equipado com armas e itens os quais serão utilizados durante o jogo para eliminar os carros adversários. O jogo conterá um personagem principal, o qual será controlado pelo jogador, três carros oponentes em cada uma das três primeiras fases que compõe o jogo e um oponente final, na quarta fase, que será um ônibus mais forte que os demais adversários das fases anteriores. Durante o jogo, ao ser atingido por uma arma ou bater em um obstáculo, o carro não sofrerá nenhuma deformação física visível, entretanto, irá sofrer alguns efeitos causados pelos mesmos, como escorregar ou rodar em seu próprio eixo. 7.1 PERSONAGEM PRINCIPAL O personagem principal do jogo, o qual será controlado pelo usuário, será um carro semelhante a um Volkswagen Fusca (ver Figura 41) de cor vermelha. Ele conterá uma arma básica para começar cada fase do jogo (ver seção 8.1.1), e poderá adquirir novas armas e itens, que ficarão disponíveis apenas durante a fase em que forem coletadas (ver seções 8.1.2, e 8.2). A velocidade do carro irá variar de 0 km/h (carro parado) até 150 km/h (velocidade máxima atingida). A Figura 41 exibe a imagem utilizada como base para a criação do personagem e a Figura 42 mostra o modelo final que será utilizado no jogo:

59 57 Figura 41 - Modelo base para elaboração do personagem principal Figura 42 Modelo para o personagem principal utilizado no jogo 7.2 INIMIGOS De acordo com o tema de cada fase do jogo, serão utilizados modelos de carros diferentes como oponentes para o jogador. Cada oponente irá iniciar a fase com 100% de vida, com uma arma básica (ver seção 8.1.1) e uma

60 58 arma especial (ver seção 8.1.2) com munição limitada, entretanto este poderá coletar mais munição e itens durante as fases (ver seções 8.1.2, e 8.2). O local no carro onde estas armas estarão acopladas será escolhido na fase de modelagem dos personagens. Assim, nas subseções 7.2.1, 7.2.2, e 7.2.4, podem ser vistos os modelos 3D que serão utilizados como base para a construção destes personagens Primeira Fase Os carros que serão utilizados nesta fase do jogo serão modelos tipicamente utilizados para terrenos acidentados, como jipes e caminhonetes. As velocidades atingidas por estes carros irão variar de 0 km/h até 130 km/h, dependendo do modelo. A Figura 43, exibe alguns modelos utilizados como base para a criação dos personagens inimigos da primeira fase e a Figura 44 mostra os modelos finais dos mesmos. Figura 43 Modelos para a criação dos inimigos presentes na Fase 1 Figura 44 Modelos 3D dos inimigos da primeira fase do jogo

61 Segunda Fase Nesta fase, os personagens não estarão restritos a modelos de um determinado tipo como na fase 1, e poderão apresentar tanto modelos de carros mais antigos quanto modelos mais novos, como pode ser visto nas imagens abaixo. Os carros irão variar suas velocidades de 0 km/h até 120 km/h. A Figura 45, exibe alguns modelos utilizados como base para a criação dos personagens inimigos da segunda fase e na Figura 46, podem ser vistos os modelos utilizados no jogo. Figura 45 - Modelos para a criação dos inimigos presentes na Fase 2 Figura 46 Modelos 3D dos inimigos da segunda fase do jogo Terceira Fase Para a terceira fase do jogo, os modelos de carros escolhidos como base para a criação dos personagens foram modelos de carros clássicos, como o Mustang e o Cadillac. Estes carros poderão variar sua velocidade de 0 km/h até 200 km/h. As imagens que servirão como modelo para estes personagens são exibidas na Figura 47:

62 60 Figura 47 - Modelos para a criação dos inimigos presentes na Fase 3 Figura 48 - Modelos 3D dos inimigos da terceira fase do jogo Quarta Fase Na quarta e última fase do jogo, o jogador irá enfrentar apenas um adversário, o qual terá como modelo base para a sua construção um ônibus de viagem, como se pode ver abaixo. Este personagem será maior e mais forte que os enfrentados anteriormente no jogo. Ele não poderá coletar as armas e itens que estarão espalhados na arena de batalha. A velocidade do personagem irá variar de 0 km/h até 110 km/h. Devido ao seu tamanho, manobras como curvas deverão ser executadas mais lentamente que os carros das fases anteriores. A Figura 49 exibe um modelo no qual o oponente final foi baseado e o modelo utilizado no jogo pode ser visto na Figura 50:

63 61 Figura 49 Modelo de referência para a criação do inimigo final Figura 50 Modelo 3D de ônibus utilizado no jogo

64 62 8 ARMAS E ITENS Em Survivors, será disponibilizada ao jogador, em princípio, uma arma básica, com munição ilimitada, no entanto, esta se tratará de uma arma pouco eficaz. No decorrer do jogo, aparecerão pacotes contendo armas, que serão coletadas ao se passar o carro sobre os mesmos. Essas armas, embora tenham munição limitada, causarão mais danos ao adversário atingido, além de aplicar a ele um efeito especial que o prejudicará. Além disso, surgirão durante o jogo pacotes contendo itens especiais, que darão vantagens ao jogador que os coletar. Nesta seção, serão descritas as armas e itens que farão parte do jogo. Também, serão encontrados screenshots de modelos de referência para os projéteis e itens. 8.1 ARMAS Cada uma das armas tem seu comportamento básico descrito abaixo. Todas as armas serão posteriormente equilibradas, visando garantir a diversão do jogo. Os parâmetros de equilíbrio serão descritos ao final desta seção. Toda arma será disparada pelo jogador, conforme descrito na seção A seguir, são descritos os comportamentos de cada arma, bem como o contexto no qual cada uma delas se insere Arma padrão Trata-se da arma básica do jogo. Terá munição ilimitada, no entanto, causará pouco dano nos adversários que forem atingidos. Estará disponível em todas as fases do jogo. A Figura 51 exibe um modelo de projétil que será utilizado como base para o desenvolvimento da arma padrão:

65 63 Figura 51 Modelo de referência para o desenvolvimento do projétil da arma padrão Arma especial Cada fase possuirá uma arma especial, que além de causar o dano normal (igual para todas as fases), causará também um efeito especial sobre o adversário atingido. Essas armas deverão ser coletadas em pacotes que aparecerão na arena no decorrer do jogo. Fase 1: Projéteis em formato de fruta. Ao atingir o adversário, além de causar dano, diminuirão a capacidade de seu carro fazer curvas por alguns segundos (ver Figura 52). Figura 52 Modelo de referência para o projétil da arma especial da Fase 1 Fase 2: Cubos de gelo que, ao atingir o adversário, causam dano e reduzem sua velocidade por alguns segundos (a princípio algo em torno de 10 segundos). O modelo de projétil para essa arma é um cubo simples (ver Figura 53). Figura 53 - Modelo de referência para o projétil da arma especial da Fase 2

66 64 Fase 3: Poderoso míssil de longo alcance. Tem a capacidade de alterar sua trajetória para atingir oponentes, mesmo que eles se movimentem. Ao atingir um oponente, causa dano e empurra-o alguns metros (ver Figura 54). Figura 54 Modelo de referência para o projétil da arma especial da Fase 3 Fase 4: Míssil simples que, ao atingir o adversário, não tem efeitos adicionais além de causar dano (ver Figura 55). Figura 55 - Modelo de referência para o projétil da arma especial da Fase Mina terrestre A mina terrestre deverá ser depositada e, quando um carro passar sobre ela, causará sua explosão e considerável dano. Deverá ser coletada em pacotes encontrados no decorrer do jogo. Seu modelo de referência é exibido na Figura 56. Figura 56 Modelo de referência para a mina terrestre

67 65 bandeira (ver Figura 57). O local onde a mina terrestre for depositada ficará marcado por uma Figura 57 Modelo de bandeira de aviso de mina terrestre Parâmetros de jogo saber: Trata-se de parâmetros que farão parte do equilíbrio do jogo, a Velocidade do projétil (em km/h) Dano Tempo mínimo entre dois tiros (tempo de recarga) Quanta munição é encontrada em cada pacote Com que frequência os pacotes são encontrados visando à diversão do jogador. Tais parâmetros deverão ser ajustados durante a fase de testes, Armas comuns a todas as fases Tabela 9 Parâmetros de equilíbrio de armas comuns Parâmetro Arma Padrão Mina Terrestre Velocidade 200 km/h N/A Dano 5% 40 % Tempo de recarga 0.5s 2s Munição por pacote N/A 1 Freqüência de pacotes N/A 1/60s

68 66 Armas que variam por fase Além dos parâmetros das armas comuns, estas devem ser ajustadas de acordo com a duração e intensidade de seu efeito especial conforme exibido na Tabela 10. Tabela 10 Parâmetros de equilíbrio de armas que variam por fase Parâmetro Fase 1 Fase 2 Fase 3 Fase 4 Velocidade 200 km/h 200 km/h 100 km/h 150 km/h Dano 20% 20% 20% 30% Tempo de recarga Munição por pacote Freqüência de pacotes Duração do efeito especial 0.5s 2s 2s 2s /30s 1/30s 1/30s 1/30s 5s 2.5s N/A N/A Intensidade do efeito especial Redução de 80% Redução de 50% Empurra 10m N/A 8.2 ITENS Itens coletáveis são encontrados no decorrer do jogo e conferem vantagens ao jogador que os coletar Cura Aparece como um conjunto de ferramentas (ver Figura 58), indicando que o carro será consertado. Quando é coletado, aumenta a quantidade de vida do carro em 20% (esse parâmetro deverá ser ajustado futuramente), com o limite de não ultrapassar o valor inicial de 100%.

69 Figura 58 Modelo de referência de um item de cura 67

70 68 9 MÚSICAS E EFEITOS SONOROS Esta seção trata da descrição da sonoridade do jogo, incluindo efeitos sonoros e músicas de fundo. 9.1 DETALHES TÉCNICOS A mídia sonora é dividida em dois tipos: músicas e efeitos sonoros. As músicas tocam durante toda a fase. Efeitos sonoros, mais curtos, tocam quando eventos específicos soam. A seguir, serão descritas quais músicas e efeitos sonoros farão parte do jogo Músicas As músicas do jogo deverão ter temas marcantes, que não enjoam caso se repitam por toda a duração da fase. Adicionalmente, existirão temas para os menus e para cut-scenes. Segue a lista de músicas que deverão ser incorporadas ao projeto: Fase 1 (floresta) Fase 2 (gelo) Fase 3 (deserto) Fase 4 (estacionamento) Menu inicial do jogo Tema de "estou quase perdendo" (toca quando o jogador está com pouca vida) Tema que toca após Vencer uma fase Tema que toca após Perder uma fase Tema que toca após Terminar o jogo (derrotando o boss)

71 Efeitos sonoros Efeitos sonoros são curtos, devendo conter grande energia numa faixa de frequências facilmente reprodutível por auto-falantes de laptop (acima de 400 Hz). É importante equalizar suas intensidades, de forma que não hajam efeitos que sejam muito mais altos que os demais. Segue a lista de efeitos sonoros que deverão ser incorporados ao jogo: Carro o o o o Parado (motor em baixa rotação) Andando (motor em alta rotação) Barulho de pneus (ângulo da roda maior que 30 graus) Bateu em obstáculo Arma 1 (ilimitada) o o Tiro Atingiu alvo Arma 2 (míssil - efeitos diferentes para cada fase, de acordo com o discutido na seção ) o o o Tiro Atingiu alvo Foi coletada Arma 3 (mina terrestre) o o o Tiro Atingiu alvo Foi coletada Item de cura o Foi coletado

72 70 10 INTELIGÊNCIA ARTIFICIAL Esta seção do GDD especifica as principais características da inteligência artificial (IA) do jogo. Serão descritas diferenças entre os níveis de dificuldade, estratégias variadas e sua combinação, com o objetivo de prover o jogador de oponentes que não possuem comportamento previsível e desestimulante. Todos os oponentes utilizarão a mesma IA, mas sua aleatoriedade faz com que se comportem de maneira diferente CARACTERÍSTICAS COMUNS Os oponentes, que serão controlados pelo computador, serão aqui denominados BOTs, para facilitar a escrita. Um BOT conhecerá as regras do jogo, ou seja, conhecerá todas as características de todas as armas, fases e o comportamento do carro, como velocidade máxima, aceleração, etc. Com isso, poupar-se-á a necessidade de ter uma IA que aprenda o jogo enquanto o joga, como o jogador faz. Isso simplificará sua arquitetura, implementação e teste. Um BOT será capaz de utilizar todas as mesmas informações que um jogador humano, como posição dos oponentes disponível no mini mapa, quantidade de munição disponível das armas e outras coisas. A IA possuirá estratégias disponíveis para escolha dos BOTs, sendo esta aleatória e sujeita a mudanças durante o jogo NÍVEIS DE DIFICULDADE Os três níveis de dificuldade diferirão no nível dos oponentes. Assim, os oponentes terão modificações em seus atributos para que se comportem de maneiras diferentes, sem haver necessidade de alteração do código utilizado. Variando-se esses atributos, pode-se gerar BOTs com comportamento aparentemente mais inteligente. A única alteração que o personagem do jogador sofrerá será em relação à sua quantidade de vida inicial que será menor quanto mais difícil for o nível escolhido.

73 ESTRATÉGIAS Cada BOT iniciará o jogo com uma estratégia escolhida aleatoriamente entre as disponíveis abaixo. A 10% de perda de vida, o BOT alterará sua estratégia também de maneira aleatória. As estratégias serão implementadas através de funções de estratégias que podem chamar outras funções, simulando uma máquina de estados, fazendo com que a estratégia mude temporariamente, enquanto uma condição específica não for satisfeita. Por exemplo, um Hipocondríaco se comporta como Covarde enquanto não houver nenhum item de cura em jogo. Assim que algum aparecer, ele volta a se comportar como Hipocondríaco. As estratégias disponíveis serão: Covarde o o o Duelista o o o Vingativo o o o Kill Stealer o o Objetivo principal: Fugir da mira dos oponentes. Comportamento: Apenas atira em inimigos se eles estiverem na sua mira e de costas, perseguindo-os. Mudança de estado: Nenhuma. Objetivo principal: Atirar em quem está atirando nele. Comportamento: Quando está na mira de alguém, tenta manobrar o carro de tal maneira que esse alguém fique em sua mira. Mudança de estado: Caso não esteja na mira de ninguém, se compota como Vingativo. Objetivo principal: Atirar em quem lhe causou dano. Comportamento: Atacar quem causou maior dano a ele, ordenado pelo mais recente. Mudança de estado: Caso não tenha sofrido dano, se comporta como Kill Stealer. Objetivo principal: Tentar finalizar oponentes. Comportamento: Procura e atira no jogador que possuir menor vida, escolhendo o mais próximo se houver dois ou mais com a mesma vida.

74 72 o Valentão o o o Rambo o o o Mudança de estado: Se estiver na mira de um oponente, se comporta como Covarde. Objetivo principal: Enfrentar o inimigo aparentemente mais forte. Comportamento: Procura e atira no jogador que possui a maior vida, escolhendo o mais próximo se houver dois ou mais com a mesma vida. Mudança de estado: Se estiver na mira, se comporta como Duelista. Objetivo principal: Coletar armas. Comportamento: Tenta coletar todas as armas do jogo, atirando em qualquer um em seu caminho. Mudança de estado: Caso não haja armas a serem coletadas (essa informação estará disponível ao BOT), se comporta como Valentão. Hipocondríaco o o o Objetivo principal: Coletar os itens de cura. Comportamento: Tentar coletar todos os itens de cura, atirando apenas em inimigos que estão em seu caminho. Mudança de estado: Caso não haja itens de cura na fase (essa informação estará disponível ao BOT), se comporta como o Covarde. As mudanças de estado estão resumidas nas próximas figuras (de Figura 59 à Figura 65). A condição para troca de estratégia é conferida em todos estados possíveis para todas as estratégias e não está representada nas figuras para evitar sobrecarga. Figura 59 Fluxo da Estratégia Covarde

75 Figura 60 - Fluxo da Estratégia Duelista 73

76 Figura 61 - Fluxo da Estratégia Vingativo 74

77 75 Figura 62 - Fluxo da Estratégia Kill Stealer Figura 63 - Fluxo da Estratégia Valentão

78 Figura 64 - Fluxo da Estratégia Rambo 76

79 77 Figura 65 - Fluxo da Estratégia Hipocondríaco 10.4 VISÃO Dada a complexidade de um ambiente tridimensional, é importante ter certo cuidado na determinação do sistema de visão dos BOTs. Dado o grande número de objetos e inimigos no ambiente, um projeto descuidado pode levar a uma sucessão de testes computacionalmente custosos. Para minimizar os cálculos, a visão é utilizada apenas para detectar se há algum oponente na mira do BOT ou se o BOT está na mira de algum oponente. Essa detecção é feita através de um cone com base arredondada com 100 unidades de altura e 10º de ângulo. Esse cone tem sua ponta no centro do carro direcionado para sua frente. Se o carro 1 estiver com alguma parte dentro do cone do carro 2, então o carro 1 está na mira do carro 2. Foi desconsiderado bloqueios do terreno, por serem custosos de serem detectados. Através de testes, notou-se que essa aproximação não gerou distúrbios significativos com relação ao movimento dos oponentes.

80 MOVIMENTAÇÃO Foi utilizada uma biblioteca para a plataforma utilizada que é capaz de gerar a malha do terreno e fornecer caminhos utilizando A* independente do ambiente, bastando configurar algumas opções. Isso simplificou a utilização da inteligência artificial, já que o algoritmo implementado é muito rápido e a construção da malha permite uma grande flexibilidade com relação ao formato do terreno. Um exemplo de sua flexibilidade é a capacidade de definir o ângulo máximo que liga dois vértices da malha e, se essa condição não for satisfeita para um par de vértices, não há uma aresta ligando-os diretamente, permitindo que montanhas não sejam consideradas na busca pelo caminho através do A*. Essa malha é determinada antes de o jogo executar, não gerando penalidades ao carregar a fase. Assim, as estratégias definem quais são seus objetivos, como um Medkit ou uma caixa de arma, e a biblioteca fornece a posição dos vértices na ordem que devem ser percorridos para que se chegue ao objetivo. A determinação do caminho demora de milissegundos, caso o alvo esteja muito longe, até microssegundos, caso o alvo a uma distância média ou menor. Isso permitiu a todos os carros gerarem suas trajetórias sem se preocupar com o possível impacto na velocidade do jogo. O objeto que é utilizado para traçar as malhas é um cilindro que se pode determinar diâmetro e altura. No entanto, como alguns obstáculos das fases são muito finos, como as árvores da fase 1, foi necessário acrescentar colisões que apenas fossem notadas pelo algoritmo de determinação da malha. Isso resolveu o problema de colisão muito frequente dos BOTs com objetos finos também sem gerar custos em tempo de execução.

81 79 11 ARTE Nesta seção é abordada a arte gráfica de Survivors. Em primeiro lugar será descrita a Arte Conceitual, onde são definidos os aspectos essenciais da arte, isto é, que tipo de impressão visual o jogo quer passar ao jogador, e de que forma isso será feito. Definem-se assim, na arte conceitual, aqueles elementos que serão comuns a todos os elementos visuais do jogo. Nos tópicos seguintes, mostram-se como esses conceitos de arte são aplicados aos diversos elementos do jogo: personagens, armas e itens, fases e interfaces. Tendo em vista que esses elementos são descritos em suas próprias seções neste documento, procura-se aqui harmonizar esses elementos quanto à sua representação visual e dar uma visão de conjunto. Além disso, embora não seja o foco da seção, serão mencionados aspectos da arte sonora sempre que necessário ARTE CONCEITUAL Survivors adotará um padrão de arte semelhante a desenhos animados clássicos (com os da Disney e da Warner) e jogos como Mario Kart (ver Anexo A) e Worms, isto é, um visual mais estilizado e caricato, com predomínio de cores básicas e vivas, de forma a criar uma ambientação mais leve e cômica. Para manter a consistência na representação do jogo, essas características estéticas serão aplicadas também à arte sonora do jogo, que está detalhada na seção 9. Um visual caricato e estilizado significa que certas características visuais de um objeto são exageradas, o que por si só engloba uma variedade de estilos possíveis. Nos jogos e desenhos animados tomados como referência (ver Figura 66, Figura 67, Figura 68 e Figura 69), destacam-se as seguintes características, que serão seguidas também em Survivors: Ênfase em traços curvos, cores vivas (em geral as básicas e claras) e desenho simples (poucos detalhes); Movimentos e reações estilizadas: é comum nos desenhos animados a cena em que um personagem se machuca e fica com passarinhos ou estrelas rodando sobre a cabeça; temos também o caso do personagem que é pego

82 80 por uma explosão e fica todo preto, chamuscado. No Mario Kart, um carro atingido por um casco capota e rodopia várias vezes, enquanto no Worms as minhocas voam para bem longe ao serem atingidas por uma 'bazooka'; Baixa violência: elementos de violência (como quedas, explosões, tiros) são suavizados por meio da ausência de sangue e ferimentos e pouco uso de fogo (por exemplo, nas explosões, mais fumaça e menos chamas). Figura 66 - Desenho da Warner - Papa-léguas e coiote Figura 67 - Desenho da Disney - Pato Donald e Margarida

83 81 Figura 68 - Mario Kart 3D Figura 69 Worms 3D 11.2 PERSONAGENS Os personagens de Survivors serão carros para os personagens comuns e um ônibus para o chefe. Para os personagens comuns serão utilizados modelos de carros atuais, carros antigos (como o Volkswagen Fusca ou o Cadillac clássico) e jipes, todos pintados em cores vivas, de forma a dar um visual bem chamativo aos personagens. Já o chefe terá o modelo de um ônibus de viagem

84 82 grande e escuro, criando um contraste e uma maior impressão de vilão. Os carros terão movimentos semelhantes ao de um carro real, porém não há necessidade de uma física extremamente realista. Figura 70 Cadillac Figura 71 Volkswagen Fusca Figura 72 - Ônibus

85 ARMAS E ITENS Durante o jogo os carros poderão coletar diversos itens e armas em pacotes espalhados pelo mapa. O modelo para os pacotes deverá ser chamativo, para que o jogador possa facilmente encontrá-lo caso esteja em seu campo de visão. Para isso, deverão ter tamanho semelhante ao dos carros e cores vivas. As armas, básica e especiais (ver Figura 73), que são armas de fogo, ficarão acopladas ao carro caso ele as possua. A arma básica, que dispara tiros comuns, terá seu modelo baseado em metralhadoras, porém o som para os tiros será mais agudo, para dar uma impressão mais inofensiva à arma. As armas especiais, que disparam projéteis maiores (abacaxi, cubos de gelo, mísseis), terão o aspecto de um lança granadas ou lança mísseis. O som deverá variar conforme a arma especial (um som de foguete para os mísseis, enquanto para o abacaxi e para o cubo serão usados efeitos sonoros mais suaves e cômicos). O efeito das armas é de grande importância para definir o tom do jogo, visualmente falando. Explosões (das minas e mísseis) devem conter mais fumaça e menos chamas, e o barulho da explosão deve ser mais suave e agudo do que o normal, para criar um efeito mais inofensivo, como visto nos desenhos animados (ver Figura 74). Se possível pelos recursos gráficos, incluir efeitos secundários temporários como estrelinhas ou passarinhos rodopiando sobre o personagem, deixar o personagem chamuscado pela explosão, ou azulado por causa da arma de gelo, mas nada mais violento como fogo, buracos de bala e partes amassadas. Figura 73 Modelos de Metralhadora e Lança - Mísseis

86 84 Figura 74 - Explosões no estilo dos desenhos animados 11.4 FASES Seguindo os princípios estabelecidos para a arte do jogo, as fases terão um visual bastante colorido, criando um ambiente mais leve e amigável. É importante povoar as fases com objetos diversos, para fornecer maior variedade ao ambiente da fase, especialmente no quesito de cores, pois caso contrário, a fase terá predomínio da cor de seu piso (verde para floresta, branco para a geleira, marrom para o deserto...). Por exemplo, a marca de pólo norte (vermelha, ver Figura 75), ajuda a quebrar o predomínio do branco na fase da geleira. Objetos mais lúdicos, como o boneco de neve (ver Figura 76), ajudam também a dar uma atmosfera mais amistosa para o cenário. Por fim, para criar um ambiente mais próximo de desenho animado, serão utilizados modelos mais simples de elementos como árvores, arbustos e pedras, assim como texturas menos detalhadas. Figura 75 - Marca de Pólo Norte

87 85 Figura 76 - Boneco de Neve 11.5 INTERFACES Survivors possuirá alguns menus e vários ícones representando itens e informações de jogo; todos eles seguirão o mesmo estilo cartum de cores vivas e desenhos simples. Ao mesmo tempo, as interfaces deverão ser eficientes. Em linhas gerais, isto significa que: Devem ser facilmente localizáveis pelo jogador. O jogador deve entender rapidamente o que elas informam. O jogador não deve ser surpreendido pela interface. A disposição dos elementos na HUD deverá seguir padrão semelhante ao de jogos do mesmo estilo (como Twisted Metal e Mario Kart), como mostrado na seção Interfaces. O estilo gráfico para a interface será inspirada na do jogo Worms, como na Figura 77.

88 86 Figura 77 Interface do jogo Worms 3D Por fim, a fonte utilizada deverá ser simples (em estilo semelhante à Arial) para palavras pequenas ou textos mais longos, mas podendo ser mais estilizada para palavras e números avulsos e maiores, como ocorre na imagem do Worms acima.

89 87 12 PRODUÇÃO No início da era dos videogames e dos primeiros jogos para computadores, a equipe de produção de um determinado título geralmente se resumia a um único programador, que fazia o papel de artista e programador. Diferente destes primeiros anos, atualmente desenvolver tais jogos exige um número grande de profissionais de áreas distintas e complementares. E para que tais projetos sejam levados a cabo de maneira eficiente é preciso um controle do processo de produção do mesmo. Tendo isto em vista o objetivo desta seção é então definir: Milestones 6 para o projeto, a serem entregues; Lista de tarefas e suas atribuições aos desenvolvedores da equipe; O cronograma de produção. A definição dos itens supracitados será feita baseada no conteúdo deste GDD e com o auxílio do web site do projeto: MILESTONES DO PROJETO Milestone Deadline Entrega e apresentação da proposta do jogo. 12/08/2010 Entrega e apresentação do GDD. 31/08/2010 Entrega e apresentação do jogo versão 1 (documentação e executável). Entrega e apresentação do jogo versão 2 (documentação e executável). Entrega e apresentação do jogo versão final (documentação e executável). 05/10/ /11/ /12/ Milestone: parte do projeto a ser entregue em uma data determinada.

90 LISTA DE TAREFAS E CRONOGRAMA DO PROJETO O cronograma do projeto foi delineado a partir das tarefas identificadas pelos líderes de cada área e com o auxílio de um diagrama de Gantt. Em essência, para a versão 1 do jogo foram definidas as tarefas que constituem a etapa 1 de produção. Nesta primeira etapa será entregue a primeira fase completa do jogo, como pode ser visto no diagrama referente à etapa 1. A partir dos resultados obtidos na etapa 1, será dado início à etapa 2, que terminará de construir o arcabouço principal do jogo, com todas as fases e mecânica do mesmo, e culminará na versão 2, a ser entregue no prazo estipulado. Figura 78 Visão geral dos Milestones O término da etapa 2 foi registrado com um dia a mais que o esperado pelo cronograma inicial, contingência esta já esperada e levada em consideração na demarcação dos milestones. A importante fase de testes permitiu a identificação e correção de uma série de imprevistos na dinâmica e implementação do jogo como um todo. Os detalhes de cada etapa podem ser vistos nas figuras a seguir. Todas as tarefas propostas para o desenvolvimento do jogo foram concluídas com êxito.

91 Figura 79 Detalhes da etapa 1 89

92 Figura 80 Detalhes da etapa 2 90

93 SISTEMAS DE PRODUÇÃO E DESAFIOS Nesta seção serão abordadas as técnicas de produção adotadas no desenvolvimento do jogo como um todo, e também os desafios enfrentados tanto do ponto de vista tecnológico quanto do logístico. O método de desenvolvimento do jogo aproximou-se do Waterfall, mas com um estilo iterativo. No método Waterfall, há um desenvolvimento sequencial do projeto, no qual as fases requeridas pela análise fluem de forma contínua. Como pode ser visto nos cronogramas, o projeto foi dividido em fases sequenciais. Houve uma ênfase forte no planejamento, desenvolvimento do cronograma, definição de deadlines visando o projeto do sistema total já de início. Entretanto, devido às incertezas inerentes ao desenvolvimento de um jogo de computador, tais como imprevisibilidade de tempo e problemas diversos, o projeto como um todo foi quebrado em segmentos menores, referentes às etapas 1, 2 e de testes do cronograma. Isso teve a função importante de reduzir os riscos do projeto como um todo e permitir mudanças potencialmente necessárias ao longo do desenvolvimento. A abordagem acima descrita foi importante para contornar alguns imprevistos ao longo do projeto: Problemas com o SVN: o sistema de controle de versão foi implementado em um servidor Google code ( e foi fundamental para o desenvolvimento a distância. Ele apresentou, no entanto algumas incompatibilidades com Unity 3D. Acreditamos que essas incompatibilidades decorram do fato de estarmos utilizando a versão free do software. Mudanças pontuais no cronograma: Algumas áreas da etapa 1 foram postergadas para serem implementadas na etapa 2 do projeto, tais como a implementação efetiva dos comportamentos de IA e o fluxo de jogo. Ambas as medidas foram necessárias, pois se constatou no fim da etapa 1 que o jogo demandava um certo grau de maturidade, ainda não alcançado, para que esses pontos fossem implementados.

94 92 ANEXOS ANEXO A - MÁRIO KART Super Mario Kart é um jogo eletrônico de corrida com personagens da série Mario lançado em 1992 para o Super Nintendo (videogame). Foi o primeiro jogo de corrida da série Mario Kart, que acabou tornando-se uma das séries mais famosas da Nintendo (WIKIPEDIA, 2010a). Sobre o Jogo A diferença desse jogo para os demais jogos de corrida é a possibilidade de usar trapaças e utensílios para vencer a corrida. As pistas estão localizadas em locais bastante incomuns, todos utilizando um tema dos jogos de Mario, como lagos, lavas, buracos, castores e muito mais.

95 93 Modos de Jogo MarioKart GP: você compete contra sete competidores controlados pelo computador. Há três modalidades para esse modo: 50cc (fácil), 100cc (médio) e 150cc (difícil). Esse modo também pode ser jogado com dois jogadores, no qual os dois competem contra os outros seis personagens. Também há as três modalidades citadas acima. Time Trial: você pode correr em qualquer pista do jogo com o motor de 100cc. Os 5 melhores tempos e a melhor volta ficam salvos, estimulando o jogador a quebrar seus recordes. Se você fizer uma corrida perfeita (sem cometer erros grosseiros), um "ghost' surge, na próxima vez que você jogar a mesma pista, o ghost irá repetir exatamente o que você fez na corrida anterior.

96 94 Battle Mode: é uma espécie de batalha para dois jogadores. O objetivo é jogar itens no outro jogador até que ele perca os três balões que o ficam rodeando. Cada item que acerta um jogador elimina um balão. Em todos os modos, Lakitu aparece para resgatar jogadores que tenham saído da pista, ou entrado em um lago, em troca de duas moedas. Personagens Há oito pilotos simultâneos. No modo Mario Kart GP, sete personagens são controlados pelo computador. O piloto controlado pelo jogador pode obter diversos itens. Os que são controlados pelo computador só possuem um ataque especial.

97 95 ANEXO B - TWISTED METAL Twisted Metal é uma série de videogames de corrida, com foco em combate veicular, publicada pela Sony Computer Entertainment. O primeiro jogo da série foi lançado em 1995 para o PlayStation, e desde então mais seis jogos seguiram, com um oitavo em produção. Os jogos da série já venderam cinco milhões de unidades apenas na América do Norte (WIKIPEDIA, 2010b).

98 96 ANEXO C - ARTE CONCEITUAL desenvolvidos para o jogo. Desenhos criados para ilustrar os carros e cenários a serem

99 97

100 98 ANEXO D DOCUMENTAÇÃO DO PROJETO RESUMO Esta é a documentação da engine do jogo Survivors, desenvolvido no contexto do programa pedagógico da disciplina IA369. A disciplina compõe parte da integralização do programa de pós-graduação da Faculdade de Engenharia Elétrica e de Computação FEEC UNICAMP.

101 99 HISTÓRICO DO DOCUMENTO Versão Descrição Data 1.0 Primeira versão do documento apresentando os conteúdos dos códigos utilizados na primeira versão do jogo Survivors e suas funcionalidades. 07/10/ (FINAL) Segunda versão do documento contendo os códigos e seus comentários, referentes à versão 2.0 do jogo Survivors. Terceira e última versão do documento contendo os componentes de desenvolvimento, referentes à versão Final do jogo Survivors. 04/11/ /12/2010

102 100 LISTA DE SCRIPTS Quadro 1 - Script contido no arquivo AddAmmo.js AddAmmo.js - Repassa mensagens sobre adição de munição para o controlador de arma AdicionarEspecial(Municao) - Adiciona munição da arma especial AdicionarMina(Municao) - Adiciona munição de mina terrestre. Quadro 2 - Script contido no arquivo Arma.js Arma.js - Controle de tiros, troca de armas e munição EstaNaMira (alvo : Vector3, base : Transform) - Retorna true se o alvo é visível pela base, false caso contrário. EstaNaMira() - verifica se alvo está próximo do jogador. settarget() - verifica os alvos próximo e escolhe um (mantendo a opção anterior se possível). nexttarget() - passa para próximo alvo. Start() - Inicializa arma básica, desativando-a para o jogador humano na fase 4. Ajusta parâmetros de dificuldade para o inimigo da fase final. MudaArma(proxArma) - Muda arma para a arma especificada. MudaArma() - Muda arma para a próxima arma disponível. Update() - Verifica entradas de teclado e chama funções adequadas. Fire () - Dispara uma arma. Acertei() - Informa ao juiz que um tiro foi disparado. AddEspecial(Municao) - Adiciona munição da arma especial ao contador. AddMina(Municao) - Adiciona munição da mina terrestre ao contador. Quadro 3 - Script contido no arquivo ControladorArmaBasica.js ControladorArmaBasica.js - Desativa modelo da arma básica sobre o veículo. desativaarmabasica () - Chamado quando deseja-se desativar a arma básica. Quadro 4 - Script contido no arquivo ControladorArmaEspecial.js ControladorArmaEspecial.js - Desativa modelo da arma especial sobre o veículo. desativaarmaespecial () - Chamado quando deseja-se desativar a arma básica. Quadro 5 - Script contido no arquivo Projetil.js Projetil.js - Controla o comportamento de projéteis disparados Start() - Inicializa contador de tempo. OnCollisionEnter( hit : Collision ) - Ações a tomar quando o projétil colide com algum objeto. Update() - Verifica se já se passaram 20s desde a criação do projétil. Quadro 6 - Script contido no arquivo ProjetilHoming.js ProjetilHoming.js - Controla o comportamento de projéteis perseguidores Start() - Inicializa contador de tempo. OnCollisionEnter( hit : Collision ) - Ações a tomar quando o projétil colide com algum objeto. Update() - Modifica velocidade do projétil para que persiga o alvo.

103 101 Quadro 7 - Script contido no arquivo esferafumaca.js esferafumaca.js - Controla o comportamento da esfera de fumaça que é exibida durante uma explosão Start() - Inicia tamanho e transparência. Update() - Expande a esfera até um certo limite, então a destrói. Quadro 8 - Script contido no arquivo estrela.js estrela.js - Controla o comportamento da estrela que é exibida durante uma explosão Start() - Inicia orientação e transparencia. Update() - Expande a estrela até um certo limite, então a destrói. Quadro 9 - Script contido no arquivo Controlador.js Controlador.js - Controla o carro para atingir um objetivo especificado checasevelocidadezero (): confere se o carro está travado. Start (): inicializa o controlador como BOT. Update(): estabelece as entradas simuladas para o Movimentacao.js necessárias para atingir o alvo. Quadro 10 - Script contido no arquivo ControledeVida.js ControledeVida.js - Controle de vida do jogador humano OnCollisionEnter(collision : Collision) - Define dano por bater em objetos do cenário ou outros carros. TomarDano (Parametros) - Reduz contador de vida e toma as outras providências necessárias. AdicionarVida(QuantaVida) - Adiciona vida e toma as outras providências necessárias. RadioVitoria() - Comuta para a música de vitória. Morrer() - Avisa ao juiz sobre derrota e comuta para música de derrota. Start() - Ajusta a vida inicial de acordo com a dificuldade. Update() - Verifica se o carro está capotado, se saiu do mapa e se foi derrotado e toma as providências necessárias. Quadro 11 - Script contido no arquivo ControledeVidaInimigos.js ControledeVidaInimigos.js - Controle de vida dos oponentes OnCollisionEnter(collision : Collision) - Define dano por bater em objetos do cenário ou outros carros. TomarDano (Parametros) - Reduz contador de vida e toma as outras providências necessárias. AdicionarVida(QuantaVida) - Adiciona vida e toma as outras providências necessárias. Start() - Inicializa a barra de vida sobre o carro. Update() - Verifica se o carro está capotado e se saiu do mapa e toma as providências necessárias. Quadro 12 - Script contido no arquivo Movimentacao.js Movimentacao.js - Especifica a maneira que o carro se movimenta de acordo com os comandos do jogador Start(): inicializa o centro de massa. CalculaAnguloSteer(): calcula o ângulo máximo de rotação da roda. FixedUpdate(): atualiza a quantidade de frenagem, torque e rotação do volante aplicados. Update(): rotaciona a roda de acordo com sua rotação, toca o som de pneu derrapando e controla o tempo de penalidade por ter levado tiro especial. ReduzirVelocidade(ReduzVelocidade): reduz a velocidade em ReduzVelocidade unidades. ReduzirManobra(ReduzManobra): reduz a manobra em ReduzManobra unidades.

104 102 Quadro 13 - Script contido no arquivo AtivarMenu2.js AtivarMenu2.js - Ativa o menu2 quando a tecla 'p' é pressionada Update() - verifica se a tecla 'p' foi pressionada, pausa o jogo e ativa o script Menu2. Quadro 14 - Script contido no arquivo ControleRanking.js ControleRanking.js - Realiza as ações de controle do ranking do jogo SomaPontuacao() Soma as pontuações das quatro fases do jogo. Update() Carrega a cena inicial do jogo caso o jogador pressione a tecla enter após a visualização do ranking. Awake() Esta função carrega o ranking salvo, soma a pontuação total do jogador e verifica em que colocação o mesmo se encaixa. Caso ele esteja entre os três primeiros colocados, ativa o script Ranking.js() OnGUI() - Após o jogador inserir um nome, atualiza o ranking e o desenha na cena Ranking. DesenharRanking() Desenha na tela o ranking do jogo. CarregarRanking() Lê o arquivo de texto onde é salvo o ranking e atualiza as variáveis de controle do mesmo. VerificarRanking() Verifica em que colocação o jogador se encaixa após o término do jogo. AtualizarRanking() Atualiza as variáveis de controle do ranking dependendo da colocação que o jogador se encaixar. SalvarRanking() Escreve em um arquivo de texto o ranking final do jogo. Quadro 15 - Script contido no arquivo Instanciador.js Instanciador.js - Controle do surgimento de itens coletáveis durante as fases do jogo Start() - Inicializa o contador de tempo com o tempo atual. Update() - Instancia novos itens coletáveis se o tempo de instância for atingido em locais aleatórios acessíveis aos jogadores. Quadro 16 - Script contido no arquivo Juiz.js Juiz.js - Controle das regras do jogo Start() - Inicializa o contador de tempo de jogo. ContaPontos() - Calcula a quantidade de pontos do jogador. Update() - Verifica condição de vitória, recalcula número de pontos, calcula distância percorrida pelo jogador. ModInimigo(n) - Modifica contador de inimigos vivos. JogadorMatou() - Adiciona um ao contador de inimigos mortos pelo jogador humano. Derrota() - Determina que o jogo terminou com derrota do jogador humano. Atirar() - Adiciona um ao contador de tiros. Acertar() - Acidiona um ao contador de tiros certeiros. ColetouItem() - Adiciona um ao contador de itens coletados. ModificaVida(NovaVida) - Modifica contador interno de vida do jogador, usado para calcular pontos. Quadro 17 - Script contido no arquivo RankingInicio.js RankingInicio.js instancia os textos 3D na cena Menu Inicial com os nomes e pontuações que estiverem salvas no arquivo de texto Pontuacao.txt Start() Chama a função para carregar o ranking salvo no arquivo de texto Pontuacao.txt. Update() Instancia um texto 3D para cada nome e pontuação dos três primeiros colocados salvos. CarregarRaking() Lê o arquivo de texto Pontuacao.txt.

105 103 Quadro 18 - Script contido no arquivo Restart.js Restart.js - Interfaces para reiniciar a fase ou sair do jogo Update() - Verifica se R ou ESC foram pressionados e toma as providências necessárias. Quadro 19 - Script contido no arquivo SaveGame.js SaveGame.js - Faz o controle de salvar e carregar o jogo. LoadGame(slot:int) - Carrega o jogo salvo no slot passado como parâmetro. LoadGame() - Carrega o jogo assumindo slot 1. slotexiste() - Verifica se o slot existe. SaveGame(slot:int) - Salva o jogo no slot passado como parâmetro. SaveGame() - Salva o jogo assumindo slot 1. Salvar() - Realiza as operações de salvamento. Carregar() - Realiza as operações de carregamento. carregaritens(objeto) - Carrega itens na fase. carregarprojeteis(objeto) - Carrega projeteis na fase. carregarcarros(objeto) - Carrega os estados dos carros na fase. eliminacarrosextras() - Elimina carros carregados a mais no load. levelquedevesercarregado() - Retorna o level a ser carregado. devocarregar() - Verifica se o carregamento deve ser feito. carregueporfavor() - Marca o jogo para carregamento. naocarregueporfavor() - Marca o jogo para não carregar. Quadro 20 - Script contido no arquivo SelecionarMenuInicial.js SelecionarMenuInicial.js - Controla as ações a serem executadas no menu incial OnCollisionEnter(): executa operação desejada quando alvo é atingido. Quadro 21 - Script contido no arquivo IA_astar.js IA_astar.js - Gerencia o BOT, fazendo com que ele siga a estratégia escolhida DoIA(): Co-rotina que coordena as estratégias e gera a trajetória até o alvo. Atira(): Co-rotina que coordena dos tiros. EscolheEstrategia(): Sorteia uma estratégia. EstaNaMira(alvo, base): Determina se o alvo está na mira da base. ExecutaEstrategias(estrategia): Chama a função correta para cada tipo de estratégia. AchaMaisPerto(objetos): Acha o objeto mais próximo do carro dentros os objetos especificados. PegaVida(alvo): Retorna a vida do alvo, necessária por existir dois controladores de vida distintos. Covarde(): Implementa a estratégia Covarde. Duelista(): Implementa a estratégia Duelista. Vingativo(): Implementa a estratégia Vingativo. KillStealer(): Implementa a estratégia KillStealer. Valentao(): Implementa a estratégia Valentao. Rambo(): Implementa a estratégia Rambo. Hipocondriaco(): Implementa a estratégia Hipocondriaco. Start(): Inicializa os dados necessários para o script. PathComplete(newPoints): Função chamada quando a biblioteca acaba de executar o PathFind, retornando a lista de pontos intermediários. PathError(): Chamada se ocorreu um erro no PathFind. FindPoint(cpoint): Função que coloca o próximo ponto da lista retornada em PathComplete como próximo alvo. TomarDano (origem, quantidade): Informa ao script que ele tomou "quantidade" de dano de "origem".

106 104 Quadro 22 - Script contido no arquivo HideCursor.js HideCursor.js - Esconde o cursor do mouse enquanto o jogo está sendo executado Update() - Seta o booleano de exibição do cursor do mouse como false. Quadro 23 - Script contido no arquivo Ranking.js Ranking.js - Guarda uma string digitada pelo jogador e sua pontuação Update() Salva a string digitada pelo jogador e desabilita o script Ranking.js. OnGUI() Desenha na tela uma caixa de texto para o jogador inserir o nome para ser salvo juntamente com a pontuação. Quadro 24 - Script contido no arquivo Volume.js Volume.js - Controle de volume de som Update() - Verifica se as teclas 'k' ou 'l' foram pressionados e modifica o volume do áudio jogo. VolumeFX(change) - Modifica o volume da quantidade determinada. Quadro 25 - Script contido no arquivo ControleCamera.js ControleCamera.js Controla a distância entre a câmera principal e o personagem principal Start() Inicia a distância entre a câmera e o carro do jogador OnCollisionEnter(hit:Collision) Detecta a posição da colisão da câmera com um objeto do cenário Update() Calcula a inclinação do carro e se for maior ou igual a 10º reajusta a distância entre a câmera e o carro do jogador caso a câmera colida com um objeto do cenário. Quadro 26 - Script contido no arquivo SmoothFollowSurvivors.js SmoothFollowSurvivors.js Segue o carro à uma distância e altura pré-configurada. LateUpdate() Move a câmera conforme os movimentos do personagem principal. Quadro 27 - Script contido no arquivo Creditos.js Creditos.js Controla a câmera na cena de créditos Update() Deslisa a câmera no eixo Z de acordo com um fator de tempo e chama o ranking. Quadro 28 - Script contido no arquivo Splash.js Splash.js Controla a câmera na cena de splash Update() Deslisa a câmera no eixo Y por 3 segundos e chama o menu inicial. Quadro 29 - Script contido no arquivo HUD.js HUD.js - Controla o comportamento dos componentes do HUD Start() - inicializa valores, adaptando dependendo do formato da tela. Update() - gerencia o marcador para mira automática do carro do jogador (para arma especial da fase 3). OnGui() - gerencia os demais elementos do HUD: tacômetro, minimap, barra de vida, mostrador de pontos e icone da arma escolhida.

107 105 Quadro 30 - Script contido no arquivo Menu2.js Menu2.js - Controla as ações do Menu2 OnGui() - tem como objetivo apenas mostrar o cursor do mouse. PauseMenu() - a interface gráfica do menu é desenhada na tela. Quadro 31 - Script contido no arquivo SelectSlotLoadMenu.js SelectSlotLoadMenu.js - Responsável por desenhar na tela o menu de seleção de slot do load game OnGui() - tem como objetivo apenas mostrar o cursor do mouse. SelectSlot() - a interface gráfica do menu é desenhada na tela. Quadro 32 - Script contido no arquivo SelectSlotSaveMenu.js GetEspecial.js - Coleta de arma especial OnCollisionEnter(hit:Collision) - Informa ao carro que coletou o item para que adicione munição à arma especial. Quadro 33 - Script contido no arquivo GetEspecial.js GetEspecial.js - Coleta de arma especial OnCollisionEnter(hit:Collision) - Informa ao carro que coletou o item para que adicione munição à arma especial. Quadro 34 - Script contido no arquivo GetMedkit.js GetMedkit.js - Coleta de Medkit OnCollisionEnter(hit:Collision) - Informa ao carro que coletou o item para que adicione vida ao contador. Quadro 35 - Script contido no arquivo GetMina.js GetMina.js - Coleta de mina terrestre OnCollisionEnter(hit:Collision) - Informa ao carro que coletou o item para que adicione munição à mina terrestre. Quadro 36 - Script contido no arquivo GetTrofeu.js GetTrofeu.js - Coleta de troféu OnCollisionEnter(hit:Collision) - Carrega a próxima fase

108 106 SUMÁRIO 1. INTRODUÇÃO ANIMAÇÕES Armas Equipar Recolher ÁUDIOS Efeitos Sonoros Musicas FONTES HUD MATERIAIS Armas arma arma arma arma basica arma especial Explosao Projeteis abacaxi bala bandeira mina bomba missil fase Carros Bus Fusca blb blf brb brf fusca OP op11lb op11lf

109 op11rb op11rf op OP op12lb op12lf op12rb op12rf op OP op13lb op13lf op13rb op13rf op OP op21lb op21lf op21rb op21rf op OP op22lb op22lf op22rb op22rf op OP op23lb op23lf op23rb op23rf op OP op31lb op31lf op31rb op31rf op OP op32lb op32lf op32rb op32rf op OP

110 op33lb op33lf op33rb op33rf op Controle de Jogo arrow Itens cubo abacaxi cubo gelo cubo medkit cubo mina cubo missilfase cubo missilfase trofeu Objetos Arvore Arvore Arvore com Neve Arvore Seca Boneco de Neve Boneco de Neve Cactus Cactus Cadillac Preto Cadillac Verde Carrinho Carruagem Casa com Neve Chevrolet Civic Cogumelo Cogumelo Creditos Flor Flor

111 Flor Galpao Galpao Inicial Hidrante Igloo Kombi Logo Unicamp Muro Niveis Dificuldade Noel Pedra Pedra Deserto Placas Poco Ponte Snowman Target Tijolo Tronco Troncos Skyboxes Terrenos MALHAS Armas Projeteis Carros Bus Fusca OP OP OP OP OP OP

112 OP OP OP Controle de Jogo Itens Objetos PREFABS Armas Explosao Projeteis Carros Controle de Jogo Inteligencia Artificial Interface HUD Objetos CENAS SCRIPTS Armas Explosao Carros Controle de Jogo Inteligencia Artificial Interface Audio Camera Cenas Especiais HUD Itens SKINS TERRENOS TEXTURAS Armas Explosao Carros Bus

113 Subaru HUD Objetos arvore com neve arvore seca boneco de neve cactus Carrinho carruagem casa com neve Cogumelo Creditos Galpao Hidrante pedra_deserto placas poco Ponte snowman Tronco Troncos Skyboxes Ceu Terrenos

114 INTRODUÇÃO O jogo Survivors foi desenvolvido de agosto a dezembro de 2010 utilizando a plataforma Unity 7. Neste documento, serão descritos com detalhes os algoritmos utilizados para a confecção da engine (funcionamento interno do jogo), bem como suas implementações. O objetivo deste documento é permitir, se necessária, a re-implementação de todo o código computacional gerado e prover ao leitor a capacidade de identificação dos objetos do projeto do jogo no texto, detalhando as características de tais objetos. Este documento é complementar ao Game Design Document (GDD), que contém a descrição ampla do jogo. O escopo deste texto se restringe a aspectos algorítmicos e detalhes de implementação, necessários à compreensão da engine. A organização deste documento baseia-se na arquitetura adotada para o desenvolvimento do projeto. Desta forma, os capítulos estão diretamente ligados aos diretórios do projeto e, consequentemente, As sub-sessões estão ligados aos subdiretórios (ver Imagem 1.1). Imagem Estrutura de diretórios do jogo Survivors 7

115 113 Portanto, são dedicados capítulos especiais a cada um dos seguintes aspectos: Animações (diretório Animations); Áudios (diretório Audios); Fontes (diretório Fonts); Materiais (diretório Materials); Malhas (diretório Meshes); Prefabs (diretório Prefabs); Cenas (diretório Scenes); Scripts (diretório Scripts); Terrenos (diretório Terrains); Texturas (diretório Textures).

116 ANIMAÇÕES Nesta sessão, serão expostas as animações que foram utilizadas no desenvolvimento do jogo Survivors. As animações são responsáveis pela imposição e controle de movimentações em objetos estáticos. O caminho a partir do diretório principal do projeto para encontrar os arquivos das animações é: Survivors/Assets/Assets Survivors/Animations. No interior deste diretório, encontra-se o subdiretório Armas, descrito na sub-sessão 2.1. Nota: Todas as animações utilizadas no desenvolvimento do jogo Survivors foram criadas e editadas no ambiente de desenvolvimento do software Unity 3D, versão Armas No subdiretório Armas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Animations/Armas, encontram-se outros dois subdiretórios: o Equipar e o Recolher. O conteúdo destes é descrito nas sub-sessões e Equipar No subdiretório Equipar, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Animations/Armas/Equipar, encontram-se alguns dos arquivos de animação que produzem o efeito visual de troca de arma. Neste caso, a animação é responsável pelo deslocamento do componente contendo a malha e os materiais da arma do interior para o exterior (parte superior) do carro. Os arquivos de animação contidos neste subdiretório são apresentados a seguir:

117 115 Arquivo Tamanho Formato Descrição Desloca a malha da arma básica acima do equipaarmabasica op1.anim 11 KB ANIM oponente 1. Desloca a malha da arma básica acima do equipaarmabasica op2.anim 11 KB ANIM oponente 2. Desloca a malha da arma básica acima do equipaarmabasica op3.anim 11 KB ANIM oponente 2. equipaarmabasica_player.a Desloca a malha da arma básica acima do 11 KB ANIM nim jogador. equipaarmaespecial Desloca a malha da arma especial acima 11 KB ANIM op1.anim do oponente 1. equipaarmaespecial Desloca a malha da arma especial acima 11 KB ANIM op2.anim do oponente 2. equipaarmaespecial Desloca a malha da arma especial acima 11 KB ANIM op3.anim do oponente 3. equipaarmaespecia_player. Desloca a malha da arma especial acima 11 KB ANIM anim do jogador Recolher No subdiretório Recolher, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Animations/Armas/Recolher, encontram-se alguns dos arquivos de animação que produzem o efeito visual de troca de arma. Neste caso, a animação é responsável pelo deslocamento do componente contendo a malha e os materiais da arma do exterior (parte superior) do carro para o interior do mesmo, deixando a arma invisível ao jogador. Os arquivos de animação contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Descrição Desloca a malha da arma básica para recolhearmabasica.anim 11 KB ANIM dentro do carro. Desloca a malha da arma básica para recolhearmabasica op1.anim 11 KB ANIM dentro do oponente 1. Desloca a malha da arma básica para recolhearmabasica op2.anim 11 KB ANIM dentro do oponente 2. Desloca a malha da arma básica para recolhearmabasica op3.anim 11 KB ANIM dentro do oponente 3. recolhearmabasica_player.an Desloca a malha da arma básica para 11 KB ANIM im dentro do jogador. Desloca a malha da arma especial para recolhearmaespecial.anim 11 KB ANIM dentro do carro. recolhearmaespecial Desloca a malha da arma especial para 11 KB ANIM op1.anim dentro do oponente 1. recolhearmaespecial Desloca a malha da arma especial para 11 KB ANIM op2.anim dentro do oponente 2. recolhearmaespecial Desloca a malha da arma especial para 11 KB ANIM op3.anim dentro do oponente 3.

118 116 recolhearmaespecial_player. anim 11 KB ANIM Desloca a malha da arma especial para dentro do jogador.

119 ÁUDIOS Nesta sessão, serão exibidos os áudios que foram utilizadas no desenvolvimento do jogo Survivors. O caminho a partir do diretório principal do projeto para encontrar os arquivos dos áudios é: Survivors/Assets/Assets Survivors/Audios. No interior deste diretório, encontram-se os subdiretórios Efeitos Sonoros e Musicas, que serão descritos, respectivamente, nas sub-sessões 3.1 e 3.2. Nota: Todos os áudios utilizados no desenvolvimento do jogo Survivors foram criados e editados utilizando os programas Ardour e Audacity, ambos disponíveis gratuitamente para uso Efeitos Sonoros No subdiretório Efeitos Sonoros, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Audios/Efeitos Sonoros, encontram-se os arquivos de áudio que são reproduzidos no decorrer do jogo, quando alguma ação solicita sua reprodução. Efeitos sonoros são sons ligados a eventos específicos. Auxiliam na realimentação do jogador com informações sobre o que está acontecendo - por exemplo, quando o jogador é atingido, um efeito sonoro específico é disparado. Cada efeito sonoro tem um significado (embora significados semelhantes possam estar ligados ao mesmo efeito sonoro). Para a criação dos efeitos, foram utilizadas gravações acústicas que foram, posteriormente, normalizadas de forma que a intensidade sonora audível fosse semelhante para todos os efeitos. Assim, o volume de reprodução de qualquer efeito sonoro, definido no próprio ambiente de programação, define a intensidade audível do efeito, e, portanto, a intensidade da informação relacionada. No caso específico do som do motor, trata-se de um som que é reproduzido em loop contínuo, e tem seu pitch alterado de forma que, quando as rodas do carro giram mais rapidamente, o som se torna mais agudo, de forma

120 118 semelhante a carros reais. Assim, através do som, o jogador é capaz de ter uma idéia aproximada de sua velocidade. Os arquivos de áudio contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Evento relacionado abacaxi_acertou.wav 114 KB Som Wave Arma especial da primeira fase atinge carro. abacaxi_atirou.wav 47 KB Som Wave Tiro de qualquer arma especial. armabasica_acertou.wav 66 KB Som Wave Arma básica atinge carro. armabasica_tiro.wav 73 KB Som Wave Arma básica é disparada. batida.wav 73 KB Som Wave Colisão é forte suficiente para causar dano no carro. coletei_algo.wav 42 KB Som Wave Item é coletado ou arma ativa é modificada. explosao_mina.wav 102 KB Som Wave Mina ou míssil explode. motor_baixarotacao.wav 101 KB Som Wave Ruído de motor. pneus_cantando.wav 41 KB Som Wave Carro derrapa (uma curva muito fechada é feita em velocidade muito alta) Musicas No subdiretório Musicas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Audios/Musicas, encontram-se os arquivos de áudio que são reproduzidos no decorrer do jogo dependendo da fase em que o jogador se encontra. Músicas são arquivos de áudio relacionados à ambientação do jogador na fase. Diferentemente dos efeitos sonoros, as músicas não são relacionadas a informações específicas, mas sim à ambientação de cada cenário. Todas as músicas foram construídas visando ter ritmos acelerados e harmonias simples e, desta forma, tentando caracterizarem-se como temas marcantes, induzindo o jogador a manter seu carro em movimento, a exemplo de outras músicas para jogos. Os arquivos de áudio contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Descrição demo_fase1.mp KB Som MP3 Música tema para a fase 1 e para os créditos finais. demo_fase2.mp KB Som MP3 Música tema para a fase 2.

121 119 demo_fase3.mp KB Som MP3 Música tema para a fase 3. demo_fase4.mp KB Som MP3 Música tema para a fase 4. derrota.mp3 329 KB Som MP3 Tema para quando o jogador é derrotado. drama.mp KB Som MP3 Tema para momentos em que o jogador tem pouca vida restante. Prologue_BassDrift.mp KB Som MP3 Música tema para o menu inicial. vitoria.mp3 196 KB Som MP3 Tema para quando o jogador vence a fase.

122 FONTES Nesta sessão, serão exibidas as fontes que foram utilizadas no desenvolvimento do jogo Survivors. As fontes foram utilizadas neste projeto apenas nos textos que precisariam ser editados em tempo real, como o ranking. Em outros momentos, como cenas entre fases e menus, preferiu-se utilizar texturas. O caminho a partir do diretório principal do projeto para encontrar os arquivos das fontes é: Survivors/Assets/Assets Survivors/Fonts. No interior deste diretório, encontram-se alguns arquivos de fonte que foram utilizadas em objetos do cenário das fases do jogo e o subdiretório HUD que será descrito na sub-sessão 4.1. As fontes contidas na raiz do diretório Fonts são apresentadas a seguir: Arquivo Tamanho Formato Descrição Pré-visualização AgentOrange.t Fonte: Agente 40 KB TrueType Font tf Orange chumbly.ttf 69 KB TrueType Font Fonte: Chumbly BRK Fontformerlyk nownasfont. ttf 95 KB TrueType Font Fonte: Font formely know as FONT 4.1. HUD No subdiretório HUD, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Fonts/HUD, encontram-se as fontes que foram utilizadas para escrever as mensagens do HUD. As fontes contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Descrição Pré-visualização sundaycomics bb_big.ttf sundaycomics bb_bold.ttf 46 KB TrueType Font 43 KB TrueType Font Fonte: SundayComics BB Fonte: SundayComics BB Bold

123 121 sundaycomics bb_little.ttf sundaycomics bb_reg.ttf 46 KB TrueType Font 46 KB TrueType Font Fonte: SundayComics BB Fonte: SundayComics BB

124 MATERIAIS Nesta sessão, serão exibidos os materiais que foram utilizados no desenvolvimento do jogo Survivors. Um material é uma combinação de texturas e parâmetros utilizados para modelar o comportamento de uma superfície em um modelo 3D. Uma cadeira, por exemplo, pode ter um material aplicado a ela com o nome madeira. Este material, além das texturas que podem ser aplicadas, apresenta parâmetros como difusão, reflexão especular e transparência, os quais podem ser configurados para deixar o objeto o mais real possível. O caminho a partir do diretório principal do projeto para encontrar os arquivos dos materiais é: Survivors/Assets/Assets Survivors/Materials. No interior deste diretório, encontram-se os subdiretórios Armas, Carros, Controle de Jogo, Itens, Objetos e Skyboxes, que serão descritos nas subsessões 5.1, 5.2, 5.3, 5.4, 5.5 e 5.6, respectivamente. Nota: Todos os materiais utilizados no desenvolvimento do jogo Survivors foram criados e editados no ambiente de desenvolvimento do software Unity 3D, versão Armas No subdiretório Armas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas, encontram-se outros subdiretórios contendo os materiais dos modelos das armas do jogo. As sub-sessões de a descrevem estes materiais arma1 No subdiretório arma1, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/arma1, encontram-se os materiais utilizados no modelo arma1 do jogo.

125 arma2 No subdiretório arma2, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/arma2, encontram-se os materiais utilizados no modelo arma2 do jogo arma3 No subdiretório arma3, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/arma3, encontram-se os materiais utilizados no modelo arma3 do jogo arma basica No subdiretório arma basica, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/arma basica, encontram-se os materiais utilizados no modelo arma basica do jogo arma especial No subdiretório arma especial, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/arma especial, encontram-se os materiais utilizados no modelo arma especial do jogo Explosao No subdiretório Explosao, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/Explosao, encontram-se os materiais utilizados nas simulações de explosões do jogo.

126 Projeteis No subdiretório Projeteis, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/Projeteis, encontram-se outros subdiretórios contendo os materiais dos modelos dos projéteis das armas do jogo. As sub-sessões de a descrevem estes materiais abacaxi No subdiretório abacaxi, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/Projeteis/abacaxi, encontram-se os materiais utilizados no modelo abacaxi do jogo bala No subdiretório abacaxi, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/Projeteis/bala, encontram-se os materiais utilizados no modelo bala do jogo bandeira mina No subdiretório bandeira mina, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/Projeteis/bandeira mina, encontram-se os materiais utilizados no modelo bandeira mina do jogo bomba No subdiretório bomba fase 3, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/Projeteis/bomba fase 3, encontram-se os materiais utilizados no modelo bomba do jogo.

127 missil fase 4 No subdiretório missil fase 4, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Armas/Projeteis/missil fase 4, encontram-se os materiais utilizados no modelo missil fase 4 do jogo Carros No subdiretório Carros, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros, encontram-se outros subdiretórios contendo os materiais dos modelos dos carros do jogo. As sub-sessões de a descrevem estes materiais Bus No subdiretório Bus, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/Bus, encontram-se os materiais utilizados no modelo Bus do jogo Fusca No subdiretório Fusca, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/Fusca, encontram-se outros subdiretórios contendo os materiais dos modelos do fusca e suas rodas. As sub-sessões de a descrevem estes materiais blb No subdiretório blb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/Fusca/blb, encontram-se os materiais utilizados no modelo blb do fusca do jogo.

128 blf No subdiretório blf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/Fusca/blf, encontram-se os materiais utilizados no modelo blf do fusca do jogo brb No subdiretório brb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/Fusca/brb, encontram-se os materiais utilizados no modelo brb do fusca do jogo brf No subdiretório brf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/Fusca/brf, encontram-se os materiais utilizados no modelo brf do fusca do jogo fusca No subdiretório fusca, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/Fusca/fusca, encontram-se os materiais utilizados no modelo fusca do jogo OP11 No subdiretório OP11, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP11, encontram-se outros subdiretórios contendo os materiais dos modelos do OP11 e suas rodas. As sub-sessões de a descrevem estes materiais.

129 op11lb No subdiretório op11lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP11/op11lb, encontram-se os materiais utilizados no modelo op11lb do op11 do jogo op11lf No subdiretório op11lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP11/op11lf, encontram-se os materiais utilizados no modelo op11lf do op11 do jogo op11rb No subdiretório op11rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP11/op11rb, encontram-se os materiais utilizados no modelo op11rb do op11 do jogo op11rf No subdiretório op11rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP11/op11rf, encontram-se os materiais utilizados no modelo op11rf do op11 do jogo op11 No subdiretório op11, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP11/op11, encontram-se os materiais utilizados no modelo op11 do jogo.

130 OP12 No subdiretório OP12, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP12, encontram-se outros subdiretórios contendo os materiais dos modelos do OP12 e suas rodas. As sub-sessões de a descrevem estes materiais op12lb No subdiretório op12lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP12/op12lb, encontram-se os materiais utilizados no modelo op12lb do op12 do jogo op12lf No subdiretório op12lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP12/op12lf, encontram-se os materiais utilizados no modelo op12lf do op12 do jogo op12rb No subdiretório op12rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP12/op12rb, encontram-se os materiais utilizados no modelo op12rb do op12 do jogo op12rf No subdiretório op12rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP12/op12rf, encontram-se os materiais utilizados no modelo op12rf do op12 do jogo.

131 op12 No subdiretório op12, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP12/op12, encontram-se os materiais utilizados no modelo op12 do jogo OP13 No subdiretório OP13, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP13, encontram-se outros subdiretórios contendo os materiais dos modelos do OP13 e suas rodas. As sub-sessões de a descrevem estes materiais op13lb No subdiretório op12lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP12/op12lb, encontram-se os materiais utilizados no modelo op12lb do op12 do jogo op13lf No subdiretório op13lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP13/op13lf, encontram-se os materiais utilizados no modelo op13lf do op13 do jogo op13rb No subdiretório op13rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP13/op13rb, encontram-se os materiais utilizados no modelo op13rb do op13 do jogo.

132 op13rf No subdiretório op13rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP13/op13rf, encontram-se os materiais utilizados no modelo op13rf do op13 do jogo op13 No subdiretório op13, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP13/op13, encontram-se os materiais utilizados no modelo op13 do jogo OP21 No subdiretório OP21, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP21, encontram-se outros subdiretórios contendo os materiais dos modelos do OP21 e suas rodas. As sub-sessões de a descrevem estes materiais op21lb No subdiretório op21lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP21/op21lb, encontram-se os materiais utilizados no modelo op21lb do op21 do jogo op21lf No subdiretório op21lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP21/op21lf, encontram-se os materiais utilizados no modelo op12lf do op12 do jogo.

133 op21rb No subdiretório op21rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP21/op21rb, encontram-se os materiais utilizados no modelo op21rb do op21 do jogo op21rf No subdiretório op21rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP21/op21rf, encontram-se os materiais utilizados no modelo op21rf do op21 do jogo op21 No subdiretório op21, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP21/op21, encontram-se os materiais utilizados no modelo op21 do jogo OP22 No subdiretório OP22, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP22, encontram-se outros subdiretórios contendo os materiais dos modelos do OP22 e suas rodas. As sub-sessões de a descrevem estes materiais op22lb No subdiretório op22lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP22/op22lb, encontram-se os materiais utilizados no modelo op22lb do op22 do jogo.

134 op22lf No subdiretório op22lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP22/op22lf, encontram-se os materiais utilizados no modelo op22lf do op22 do jogo op22rb No subdiretório op22rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP22/op22rb, encontram-se os materiais utilizados no modelo op22rb do op22 do jogo op22rf No subdiretório op22rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP22/op22rf, encontram-se os materiais utilizados no modelo op22rf do op22 do jogo op22 No subdiretório op22, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP22/op22, encontram-se os materiais utilizados no modelo op22 do jogo OP23 No subdiretório OP23, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP23, encontram-se outros subdiretórios contendo os materiais dos modelos do OP23 e suas rodas. As sub-sessões de a descrevem estes materiais.

135 op23lb No subdiretório op23lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP23/op23lb, encontram-se os materiais utilizados no modelo op23lb do op23 do jogo op23lf No subdiretório op23lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP23/op23lf, encontram-se os materiais utilizados no modelo op23lf do op23 do jogo op23rb No subdiretório op23rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP23/op23rb, encontram-se os materiais utilizados no modelo op23rb do op23 do jogo op23rf No subdiretório op23rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP23/op23rf, encontram-se os materiais utilizados no modelo op23rf do op23 do jogo op23 No subdiretório op23, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP23/op23, encontram-se os materiais utilizados no modelo op23 do jogo.

136 OP31 No subdiretório OP31, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP31, encontram-se outros subdiretórios contendo os materiais dos modelos do OP31 e suas rodas. As sub-sessões de a descrevem estes materiais op31lb No subdiretório op31lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP31/op31lb, encontram-se os materiais utilizados no modelo op31lb do op31 do jogo op31lf No subdiretório op31lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP31/op31lf, encontram-se os materiais utilizados no modelo op31lf do op31 do jogo op31rb No subdiretório op31rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP31/op31rb, encontram-se os materiais utilizados no modelo op31rb do op31 do jogo op31rf No subdiretório op31rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP31/op31rf, encontram-se os materiais utilizados no modelo op31rf do op31 do jogo.

137 op31 No subdiretório op31, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP31/op31, encontram-se os materiais utilizados no modelo op31 do jogo OP32 No subdiretório OP32, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP32, encontram-se outros subdiretórios contendo os materiais dos modelos do OP32 e suas rodas. As sub-sessões de a descrevem estes materiais op32lb No subdiretório op32lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP32/op32lb, encontram-se os materiais utilizados no modelo op32lb do op32 do jogo op32lf No subdiretório op32lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP32/op32lf, encontram-se os materiais utilizados no modelo op32lf do op32 do jogo op32rb No subdiretório op32rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP32/op32rb, encontram-se os materiais utilizados no modelo op32rb do op32 do jogo.

138 op32rf No subdiretório op32rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP32/op32rf, encontram-se os materiais utilizados no modelo op32rf do op32 do jogo op32 No subdiretório op32, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP32/op32, encontram-se os materiais utilizados no modelo op32 do jogo OP33 No subdiretório OP33, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP33, encontram-se outros subdiretórios contendo os materiais dos modelos do OP33 e suas rodas. As sub-sessões de a descrevem estes materiais op33lb No subdiretório op32lb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP33/op33lb, encontram-se os materiais utilizados no modelo op33lb do op33 do jogo op33lf No subdiretório op33lf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP33/op33lf, encontram-se os materiais utilizados no modelo op33lf do op33 do jogo.

139 op33rb No subdiretório op33rb, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP33/op33rb, encontram-se os materiais utilizados no modelo op33rb do op33 do jogo op33rf No subdiretório op33rf, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP33/op33rf, encontram-se os materiais utilizados no modelo op33rf do op33 do jogo op33 No subdiretório op33, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Carros/OP33/op33, encontram-se os materiais utilizados no modelo op33 do jogo Controle de Jogo No subdiretório Controle de Jogo, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Controle de Jogo, encontra-se outro subdiretório contendo materiais. A sub-sessão descreve estes materiais arrow No subdiretório arrow, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Controle de Jogo/arrow, encontram-se os materiais utilizados no modelo arrow do jogo.

140 Itens No subdiretório Itens, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Itens, encontram-se outros subdiretórios contendo os materiais das caixas de itens do jogo. As sub-sessões de a descrevem estes materiais cubo abacaxi No subdiretório cubo abacaxi, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Itens/cubo abacaxi, encontram-se os materiais utilizados no modelo cubo abacaxi do jogo cubo gelo No subdiretório cubo abacaxi, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Itens/cubo gelo, encontram-se os materiais utilizados no modelo cubo gelo do jogo cubo medkit No subdiretório cubo medkit, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Itens/cubo medkit, encontram-se os materiais utilizados no modelo cubo medkit do jogo cubo mina No subdiretório cubo mina, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Itens/cubo mina, encontram-se os materiais utilizados no modelo cubo mina do jogo.

141 cubo missilfase3 No subdiretório cubo missilfase3, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Itens/cubo missilfase3, encontram-se os materiais utilizados no modelo cubo missilfase3 do jogo cubo missilfase4 No subdiretório cubo missilfase4, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Itens/cubo missilfase4, encontram-se os materiais utilizados no modelo cubo missilfase4 do jogo trofeu No subdiretório trofeu, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Itens/trofeu, encontram-se os materiais utilizados no modelo trofeu do jogo Objetos No subdiretório Objetos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos, encontram-se outros subdiretórios contendo os materiais das objetos das cenas do jogo. As sub-sessões de a descrevem estes materiais Arvore1 No subdiretório Arvore1, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Arvore1, encontram-se os materiais utilizados no modelo arvore1 do jogo.

142 Arvore2 No subdiretório Arvore2, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Arvore2, encontram-se os materiais utilizados no modelo arvore2 do jogo Arvore com Neve No subdiretório Arvore com Neve, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Arvore com Neve, encontram-se os materiais utilizados no modelo arvore com neve do jogo Arvore Seca No subdiretório Arvore Seca, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Arvore Seca, encontram-se os materiais utilizados no modelo arvore seca do jogo Boneco de Neve No subdiretório Boneco de Neve, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Boneco de Neve, encontram-se os materiais utilizados no modelo boneco de neve do jogo Boneco de Neve 2 No subdiretório Boneco de Neve 2, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Boneco de Neve 2, encontram-se os materiais utilizados no modelo boneco de neve 2 do jogo.

143 Cactus No subdiretório Cactus, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Cactus, encontramse os materiais utilizados no modelo cactus do jogo Cactus 2 No subdiretório Cactus 2, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Cactus 2, encontram-se os materiais utilizados no modelo cactus 2 do jogo Cadillac Preto No subdiretório Cadillac Preto, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Cadillac Preto, encontram-se os materiais utilizados no modelo cadillac preto do jogo Cadillac Verde No subdiretório Cadillac Verde, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Cadillac Verde, encontram-se os materiais utilizados no modelo cadillac verde do jogo Carrinho No subdiretório Carrinho, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Carrinho, encontram-se os materiais utilizados no modelo carrinho do jogo.

144 Carruagem No subdiretório Carruagem, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Carruagem, encontram-se os materiais utilizados no modelo carruagem do jogo Casa com Neve No subdiretório Casa com Neve, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Casa com Neve, encontram-se os materiais utilizados no modelo casa com neve do jogo Chevrolet No subdiretório Chevrolet, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Chevrolet, encontram-se os materiais utilizados no modelo chevrolet do jogo Civic No subdiretório Civic, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Civic, encontram-se os materiais utilizados no modelo civic do jogo Cogumelo1 No subdiretório Cogumelo1, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Cogumelo1, encontram-se os materiais utilizados no modelo cogumelo1 do jogo.

145 Cogumelo2 No subdiretório Cogumelo2, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Cogumelo2, encontram-se os materiais utilizados no modelo cogumelo2 do jogo Creditos No subdiretório Creditos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Creditos, encontram-se os materiais utilizados nos creditos do jogo Flor1 No subdiretório Flor1, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Flor1, encontram-se os materiais utilizados no modelo flor1 do jogo Flor2 No subdiretório Flor2, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Flor2, encontram-se os materiais utilizados no modelo flor2 do jogo Flor3 No subdiretório Flor3, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Flor3, encontram-se os materiais utilizados no modelo flor3 do jogo.

146 Galpao No subdiretório Galpao, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Galpao, encontram-se os materiais utilizados no modelo galpao do jogo Galpao Inicial No subdiretório Galpao Inicial, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Galpao Inicial, encontram-se os materiais utilizados no modelo galpao inicial do jogo Hidrante No subdiretório Hidrante, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Hidrante, encontram-se os materiais utilizados no modelo hidrante do jogo Igloo No subdiretório Igloo, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Igloo, encontram-se os materiais utilizados no modelo igloo do jogo Kombi No subdiretório Kombi, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Kombi, encontramse os materiais utilizados no modelo kombi do jogo.

147 Logo Unicamp No subdiretório Logo Unicamp, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Logo Unicamp, encontram-se os materiais utilizados no plano logo Unicamp do jogo Muro No subdiretório Muro, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Muro, encontram-se os materiais utilizados no plano muro do jogo Niveis Dificuldade No subdiretório Niveis Dificuldade, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Niveis Dificuldade, encontram-se os materiais utilizados nos planos de niveis dificuldade do jogo Noel No subdiretório Noel, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Noel, encontram-se os materiais utilizados no modelo noel do jogo Pedra1 No subdiretório Pedra1, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Pedra1, encontram-se os materiais utilizados no modelo pedra1 do jogo.

148 Pedra Deserto No subdiretório Pedra Deserto, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Pedra Deserto, encontram-se os materiais utilizados no modelo pedra deserto do jogo Placas No subdiretório Placas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Placas, encontramse os materiais utilizados no modelo placas do jogo Poco No subdiretório Poco, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Poco, encontram-se os materiais utilizados no modelo poco do jogo Ponte No subdiretório Ponte, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Ponte, encontramse os materiais utilizados no modelo ponte do jogo Snowman No subdiretório Snowman, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Snowman, encontram-se os materiais utilizados no modelo snowman do jogo.

149 Target No subdiretório Target, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Target, encontramse os materiais utilizados no modelo target do jogo Tijolo No subdiretório Tijolo, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Tijolo, encontram-se os materiais utilizados para compor um plano com tijolos no jogo Tronco No subdiretório Tronco, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Tronco, encontramse os materiais utilizados no modelo tronco do jogo Troncos No subdiretório Troncos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Objetos/Troncos, encontram-se os materiais utilizados no modelo troncos do jogo Skyboxes No subdiretório Skyboxes, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Skyboxes, encontram-se os materiais utilizados na composição do céu dos cenários do jogo.

150 Terrenos No subdiretório Terrenos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Materials/Terrenos, encontra-se o material utilizado na composição do terreno de gelo do jogo.

151 MALHAS Nesta sessão, serão exibidas as malhas que foram utilizadas no desenvolvimento do jogo Survivors. Uma malha consiste em uma coleção de vértices e polígonos utilizados na representação de um objeto 3D. Para o desenvolvimento de Survivors, os modelos 3D foram obtidos no acervo do Google Wirehouse ( e editados utilizando o software Blender 3D (ver softwares utilizados). O caminho a partir do diretório principal do projeto para encontrar os arquivos das malhas é: Survivors/Assets/Assets Survivors/Meshes. No interior deste diretório, encontram-se os subdiretórios Armas, Carros, Controle de Jogo, Itens e Objetos, que serão descritos nas sub-sessões 6.1, 6.2, 6.3, 6.4 e 6.5, respectivamente. Nota: As ferramentas para criação e edição das malhas estão descritas no ANEXO E Softwares utilizados para o desenvolvimento de Survivors Armas No subdiretório Armas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Armas, encontram-se as malhas dos modelos das armas do jogo e um subdiretório que é descrito na subsessão As malhas contidas no subdiretório Armas são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Vértices arma1.dae 131 KB Collada DAE arma2.dae 190 KB Collada DAE arma3.dae 453 KB Collada DAE arma basica.dae 135 KB Collada DAE arma especial.dae Quantidade de Triângulos 1119 KB Collada DAE

152 Projeteis No subdiretório Projeteis, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Armas/Projeteis, encontram-se as malhas dos modelos dos projéteis das armas do jogo. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos abacaxi.dae 330 KB Collada DAE bala.dae 229 KB Collada DAE bandeira mina.dae 509 KB Collada DAE bomba.dae 440 KB Collada DAE missil Fase4.dae 85 KB Collada DAE Carros No subdiretório Carros, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros, encontram-se as malhas de um dos modelos dos carros do jogo, além de subdiretórios contendo as outras malhas de todos os modelos de carros controláveis. Estes subdiretórios são descritos nas sub-sessões de a A malha contida no subdiretório Carros é apresentada a seguir: Quantidade de Quantidade de Arquivo Tamanho Formato Vértices Triângulos fusca.dae 5072 KB Collada DAE Bus No subdiretório Bus, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/Bus, encontram-se as malhas dos modelos do ônibus. As malhas contidas neste subdiretório são apresentadas a seguir:

153 151 Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos bus1.dae 3107 KB Collada DAE bus2.dae 5195 KB Collada DAE Fusca No subdiretório Fusca, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/Fusca, encontram-se as malhas dos modelos do fusca e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos BLB.dae 198 KB Collada DAE BLF.dae 197 KB Collada DAE BRB.dae 198 KB Collada DAE BRF.dae 198 KB Collada DAE fusca.dae 3712 KB Collada DAE OP11 No subdiretório OP11, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP11, encontram-se as malhas dos modelos do op11 e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos OP11.dae 2581 KB Collada DAE OP11LB.dae 123 KB Collada DAE OP11LF.dae 124 KB Collada DAE OP11RB.dae 122 KB Collada DAE OP11RF.dae 122 KB Collada DAE

154 OP12 No subdiretório OP12, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP12, encontram-se as malhas dos modelos do op12 e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos OP12.dae 5225 KB Collada DAE OP12LB.dae 372 KB Collada DAE OP12LF.dae 372 KB Collada DAE OP12RB.dae 372 KB Collada DAE OP12RF.dae 372 KB Collada DAE OP13 No subdiretório OP13, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP13, encontram-se as malhas dos modelos do op13 e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos OP13.dae 332 KB Collada DAE OP13LB.dae 115 KB Collada DAE OP13LF.dae 114 KB Collada DAE OP13RB.dae 116 KB Collada DAE OP13RF.dae 116 KB Collada DAE OP21 No subdiretório OP21, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP21, encontram-se as malhas dos modelos do op21 e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir:

155 153 Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos OP21.dae 141 KB Collada DAE OP21LB.dae 32 KB Collada DAE OP21LF.dae 53 KB Collada DAE OP21RB.dae 32 KB Collada DAE OP21RF.dae 32 KB Collada DAE OP22 No subdiretório OP22, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP22, encontram-se as malhas dos modelos do op22 e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos OP22.dae 4336 KB Collada DAE OP22LB.dae 458 KB Collada DAE OP22LF.dae 458 KB Collada DAE OP22RB.dae 457 KB Collada DAE OP22RF.dae 385 KB Collada DAE OP23 No subdiretório OP23, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP23, encontram-se as malhas dos modelos do op23 e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos OP23.dae 1385 KB Collada DAE OP23LB.dae 227 KB Collada DAE OP23LF.dae 225 KB Collada DAE OP23RB.dae 227 KB Collada DAE OP23RF.dae 225 KB Collada DAE

156 OP31 No subdiretório OP31, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP31, encontram-se as malhas dos modelos do op31 e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos OP31.dae 6410 KB Collada DAE OP31LB.dae 32 KB Collada DAE OP31LF.dae 53 KB Collada DAE OP31RB.dae 32 KB Collada DAE OP31RF.dae 32 KB Collada DAE OP32 No subdiretório OP32, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP32, encontram-se as malhas dos modelos do op32 e suas rodas. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos OP32.dae 1269 KB Collada DAE OP32LB.dae 457 KB Collada DAE OP32LF.dae 457 KB Collada DAE OP32RB.dae 458 KB Collada DAE OP32RF.dae 458 KB Collada DAE OP33 No subdiretório OP33, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Carros/OP33, encontra-se a malha dos modelos do op33. A malha contida neste subdiretório é apresentada a seguir:

157 155 Quantidade de Quantidade de Arquivo Tamanho Formato Vértices Triângulos OP33.dae 368 KB Collada DAE Controle de Jogo No subdiretório Controle de Jogo, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Controle de Jogo, encontra-se a malha do modelo do arrow. A malha contida neste subdiretório é apresentada a seguir: Quantidade de Quantidade de Arquivo Tamanho Formato Vértices Triângulos arrow.dae 23 KB Collada DAE Itens No subdiretório Itens, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Itens, encontra-se a malha do modelo do troféu. A malha contida neste subdiretório é apresentada a seguir: Quantidade de Quantidade de Arquivo Tamanho Formato Vértices Triângulos trofeu.dae 5347 KB Collada DAE Objetos No subdiretório Objetos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Meshes/Objetos, encontram-se as malhas dos modelos dos objetos dos cenários do jogo. As malhas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Quantidade de Quantidade de Vértices Triângulos arvore1.dae 376 KB Collada DAE Não especificado Não especificado arvore2.dae 3945 KB Collada DAE Não especificado Não especificado

158 156 arvore com neve.dae 3396 KB Collada DAE Não especificado Não especificado arvore seca.dae 949 KB Collada DAE Não especificado Não especificado boneco de neve 2.dae 361 KB Collada DAE Não especificado Não especificado boneco de neve.dae 2059 KB Collada DAE Não especificado Não especificado cactus2.dae 1035 KB Collada DAE Não especificado Não especificado cactus.dae 186 KB Collada DAE Não especificado Não especificado cadillacpreto.dae 652 KB Collada DAE Não especificado Não especificado cadillacverde.dae 4744 KB Collada DAE Não especificado Não especificado carrinho.dae 295 KB Collada DAE Não especificado Não especificado carruagem.dae 9879 KB Collada DAE Não especificado Não especificado casa com neve.dae 454 KB Collada DAE Não especificado Não especificado chevrolet.dae 5256 KB Collada DAE Não especificado Não especificado civic.dae 1272 KB Collada DAE Não especificado Não especificado cogumelo1.dae 137 KB Collada DAE Não especificado Não especificado cogumelo2.dae 254 KB Collada DAE Não especificado Não especificado combi.dae 1577 KB Collada DAE Não especificado Não especificado flor1.dae 399 KB Collada DAE Não especificado Não especificado flor2.dae 340 KB Collada DAE Não especificado Não especificado flor3.dae 1402 KB Collada DAE Não especificado Não especificado galpao.dae KB Collada DAE Não especificado Não especificado hydrant.dae 1380 KB Collada DAE Não especificado Não especificado igloo.dae 126 KB Collada DAE Não especificado Não especificado noel.dae 1499 KB Collada DAE Não especificado Não especificado pedra1.blend 136 KB Blender File Não especificado Não especificado pedra_deserto.dae 28 KB Collada DAE Não especificado Não especificado placas.dae 87 KB Collada DAE Não especificado Não especificado poco.dae 551 KB Collada DAE Não especificado Não especificado ponte.fbx 655 KB FBX Não especificado Não especificado snowman.dae 1357 KB Collada DAE Não especificado Não especificado tronco.dae 141 KB Collada DAE Não especificado Não especificado troncos.dae 326 KB Collada DAE Não especificado Não especificado

159 PREFABS Nesta sessão, serão exibidos os prefabs que foram utilizadas no desenvolvimento do jogo Survivors. Quando um objeto é adicionado a uma cena no Unity, ele passa a ser chamado de GameObject, ou seja, passa a se tornar um objeto do jogo. Assim, quando se quer adicionar várias cópias de um mesmo objeto, o Unity oferece um recurso chamado de Prefab, o qual pode ser entendido como um template do objeto desejado. Assim, ao alterar alguma propriedade no prefab do objeto, todas as suas cópias também serão alteradas. O caminho a partir do diretório principal do projeto para encontrar os arquivos dos prefabs é: Survivors/Assets/Assets Survivors/Prefabs. No interior deste diretório, encontram-se os subdiretórios Armas, Carros, Controle de Jogo, Inteligencia Artificial, Interface e Objetos, que serão descritos nas sub-sessões 7.1, 7.2, 7.3, 7.4, 7.5 e 7.6, respectivamente. Nota: Todos os prefabs utilizados no desenvolvimento do jogo Survivors foram criados e editados no ambiente de desenvolvimento do software Unity 3D, versão Armas No subdiretório Armas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Armas, encontram-se os prefabs das armas do jogo e dois subdiretórios Explosao e Projeteis - que serão descritos nas sub-sessões e 7.1.2, respectivamente. Os prefabs contidos no subdiretório Armas são apresentados a seguir: Arquivo Tamanho Formato Descrição Atirador.prefab 24 KB Prefab Implementa o atirador dos carros. pfb_armabasica.dae 10 KB Prefab Implementa a arma básica dos carros. pfb_armaespecial.dae 10 KB Prefab Implementa a arma especial dos carros

160 Explosao No subdiretório Explosao, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Armas/Explosao, encontram-se os prefabs desenvolvidos para gerar um efeito de explosão. Os prefabs contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Descrição pfb_esferafumaca.prefab 9 KB Prefab Prefab para a esfera de fumaça da explosão. pfb_estrela.prefab 8 KB Prefab Prefab para a estrela que aparece na explosão Projeteis No subdiretório Explosao, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Armas/Projeteis, encontram-se os prefabs dos modelos dos projéteis do jogo. Os prefabs contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Descrição pfb_abacaxi.prefab 12 KB Prefab Implementa o projétil da arma especial. pfb_bandeiramina.prefab 13 KB Prefab Implementa a bandeira da mina terrestre Carros No subdiretório Carros, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Carros, encontram-se os prefabs dos modelos dos carros controláveis do jogo. Os prefabs contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Descrição farol.prefab 7 KB Prefab Implementa o farol dos carros. Implementa a estrutura básica do OP11.prefab 62 KB Prefab OP11. OP12.prefab 61 KB Prefab Implementa a estrutura básica do OP12.

161 159 OP21.prefab 56 KB Prefab OP22.prefab 60 KB Prefab OP31.prefab 58 KB Prefab OP32.prefab 57 KB Prefab OponenteGenerico.prefab 32 KB Prefab Implementa a estrutura básica do OP21. Implementa a estrutura básica do OP22. Implementa a estrutura básica do OP31. Implementa a estrutura básica do OP32. Implementa a estrutura básica de um Oponente Genérico Controle de Jogo No subdiretório Controle de Jogo, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Controle de Jogo, encontra-se o prefab responsável pelo controle das regras do jogo. O prefab contido neste subdiretório é apresentado a seguir: Arquivo Tamanho Formato Descrição Juiz.prefab 28 KB Prefab Implementa o juiz do jogo Inteligencia Artificial No subdiretório Inteligencia Artificial, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Inteligencia Artificial, encontram-se os prefabs responsáveis pelo controle da inteligência artificial do jogo. Os prefabs contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Descrição pfb_astar.prefab 13 KB Prefab Prefab gerador da malha para o A* em cada mapa. Prefab para aumentar a pfb_colisao das arvores.prefab 6 KB Prefab largura de colisão das árvores da fase 1. Funciona apenas para detecção da malha. pfb_controlador.prefab 10 KB Prefab Prefab que contém o controlador da IA completo, com todos os scripts necessários.

162 Interface No subdiretório Interface, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Interface, encontra-se o subdiretório HUD que será descrito na sub-sessão HUD No subdiretório HUD, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Interface/HUD, encontra-se o prefab responsável HUD do jogo. O prefab contido neste subdiretório é apresentado a seguir: Arquivo Tamanho Formato Descrição pfb_newhud.prefab 27 KB Prefab Implementa um HUD completo Objetos No subdiretório Objetos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Prefabs/Objetos, encontram-se os prefabs dos objetos dos cenários do jogo. Os prefabs contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Descrição arvore com neve e collider.prefab 97 KB Prefab Prefab com modelo de árvore com collider. Prefab com modelo de árvore arvore seca com collider.prefab 89 KB Prefab seca com collider. boneco de neve 2 com collider.prefab 19 KB Prefab Prefab com modelo de boneco de neve com collider. boneco de neve com collider.prefab 48 KB Prefab Prefab com modelo de boneco de neve com collider. Carro1.prefab 18 KB Prefab Prefab com modelo de carro com collider. Carro2.prefab 12 KB Prefab Prefab com modelo de carro com collider. Carro3.prefab 16 KB Prefab Prefab com modelo de carro com collider. Carro4.prefab 17 KB Prefab Prefab com modelo de carro com collider.

163 161 Carro5.prefab 51 KB Prefab Prefab com modelo de carro com collider. casa com neve e collider.prefab 48 KB Prefab Prefab com modelo de casa com collider. Galpao Inicial.prefab 27 KB Prefab Prefab com modelo de galpão com collider. igloo1 com collider.prefab 14 KB Prefab Prefab com modelo de iglu com collider. noel com collider.prefab 38 KB Prefab Prefab com modelo de papai noel com collider. pfb_arvore1.prefab 10 KB Prefab Prefab com modelo de árvore com collider. pfb_cactus2.prefab 34 KB Prefab Prefab com modelo de cactus com collider. pfb_cactus.prefab 17 KB Prefab Prefab com modelo de cactus com collider. pfb_carrinho.prefab 48 KB Prefab Prefab com modelo de carrinho de compras com collider. pfb_carruagem.prefab 273 KB Prefab Prefab com modelo de carruagem com collider. pfb_cogumelo1.prefab 8 KB Prefab Prefab com modelo de cogumelo com collider. pfb_cogumelo2.prefab 9 KB Prefab Prefab com modelo de cogumelo com collider. pfb_flor1.prefab 9 KB Prefab Prefab com modelo de flor. pfb_flor2.prefab 8 KB Prefab Prefab com modelo de flor. pfb_flor3.prefab 9 KB Prefab Prefab com modelo de flor. pfb_galpao.prefab 10 KB Prefab Prefab com modelo de galpão com collider. pfb_galpaofinal.prefab 580 KB Prefab Prefab com modelo de galpão com collider. pfb_hydrant.prefab 14 KB Prefab Prefab com modelo de hidrante com collider. pfb_muro.prefab 8 KB Prefab Prefab com modelo de parede com collider. pfb_pedra1.prefab 9 KB Prefab Prefab com modelo de pedra com collider. pfb_pedra_deserto.prefab 10 KB Prefab Prefab com modelo de pedra com collider. pfb_placas.prefab 13 KB Prefab Prefab com modelo de placas com collider. pfb_ponte.prefab 10 KB Prefab Prefab com modelo de ponte com collider. pfb_tronco.prefab 10 KB Prefab Prefab com modelo de tronco de árvore com collider. pfb_troncos.prefab 11 KB Prefab Prefab com modelo de troncos de árvores com collider. poco com collider.prefab 76 KB Prefab Prefab com modelo de poço com collider. snowman com collider.prefab 23 KB Prefab Prefab com modelo de boneco de neve. Wall.prefab 9 KB Prefab Prefab com modelo de parede com collider.

164 CENAS Nesta sessão, serão exibidas as cenas que foram utilizadas no desenvolvimento do jogo Survivors. Uma cena representa uma tela do jogo. Ela pode representar o menu, uma fase do jogo, a tela de créditos e afins. O caminho a partir do diretório principal do projeto para encontrar os arquivos das cenas é: Survivors/Assets/Assets Survivors/Scenes. No interior deste diretório, encontram-se as cenas que compõem as fases do jogo, além da cena de splash inicial, a cena de créditos finais e a cena de ranking. Nota: Todas as cenas utilizadas no desenvolvimento do jogo Survivors foram criadas e editadas no ambiente de desenvolvimento do software Unity 3D, versão As cenas contidas neste subdiretório são apresentadas a seguir: Arquivo Tamanho Formato Descrição Cena - Creditos.unity 27 KB Unity Cena de créditos do jogo Cena Fase 1.unity 650 KB Unity Cena da Fase 1 Cena Fase 2.unity 3585 KB Unity Cena da Fase 2 Cena Fase 3.unity 3886 KB Unity Cena da Fase 3 Cena Fase 4.unity 3054 KB Unity Cena da Fase 4 Cena Menu Inicial.unity 190 KB Unity Cena do Menu Inicial do jogo Cena Ranking.unity 18 KB Unity Cena do ranking do jogo Cena Splash Logo Unicamp.unity 17 KB Unity Cena de splash com o logotipo da Unicamp

165 SCRIPTS Nesta sessão, serão exibidos os scripts que foram utilizadas no desenvolvimento do jogo Survivors. O caminho a partir do diretório principal do projeto para encontrar os arquivos dos scripts é: Survivors/Assets/Assets Survivors/Scripts. Buscando uma melhor organização do desenvolvimento e da depuração do código computacional gerado, assim como nos outros capítulos deste documento, os arquivos foram divididos em subcategorias, como segue: Armas, categoria relacionada ao funcionamento das armas e dos projéteis do jogo (ver subsessão 9.1); Carros, contendo scripts que garantem o movimento e o controle dos carros (ver sub-sessão 9.2); Controle de Jogo, categoria responsável pelo controle das regras do jogo, tais como as condições de vitória, derrota e outras regras (ver sub-sessão 9.3); Inteligencia Artificial, contendo scripts através dos quais o computador toma decisões relacionadas ao controle dos carros oponentes (ver subsessão 9.4); Interface, relacionada às informações visuais e auditivas que são fornecidas ao usuário (ver sub-sessão 9.5); e Itens, categoria relacionada ao funcionamento de itens que podem ser coletados em cada uma das fases do jogo (ver sub-sessão 9.6). Diversos aspectos da implementação computacional dos algoritmos estão ligadas ao uso da plataforma de desenvolvimento Unity 3D. Uma breve apresentação das características da plataforma Unity 3D, visando à compreensão do esquema de desenvolvimento é fornecida no ANEXO E Softwares utilizados para o desenvolvimento de Survivors Armas No subdiretório Armas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Armas, encontram-se alguns scripts relacionados ao funcionamento das armas do jogo e o subdiretório Explosao, que será descrito na sub-sessão As funcionalidades relacionadas às armas, no jogo, se baseiam na existência de objeto chamado Atirador, que marca uma posição pouco a frente do

166 164 carro a partir da qual projéteis são instanciados. A esse objeto, é vinculado o script Arma.js (ver Quadro 2), que define as ações realizadas ao se pressionar os botões relacionados a atirar ou mudar de arma. A mudança de arma depende do controle de munição relacionado ao script. A ação atirar, em termos computacionais, significa instanciar um projétil e atribuir a ele uma determinada velocidade. O projétil é vinculado a um script de comportamento (Projetil.js (ver Quadro 5) ou ProjetilHoming.js (ver Quadro 6)) que contém instruções para que, ao colidir com um carro, sejam tomadas as providências relacionadas. Alguns projéteis causam explosões, que são controladas pelos scripts da subcategoria Explosao (ver subsessão 9.1.1). A seguir, cada um dos scripts do subdiretório Armas é comentado individualmente. AddAmmo.js O script AddAmmo.js (ver Quadro 1), vinculado ao objeto Carro, tem funções que são ativadas quando um carro coleta um item contendo munição. Ele informa ao objeto Atirador que a munição de um determinado tipo deverá ser acrescida de um valor pré-determinado, definido pelo item (ver sub-sessão 9.6). Quadro 1 - Script contido no arquivo AddAmmo.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Armas/AddAmmo.js var ControladorDeArma : GameObject; function AdicionarEspecial( Municao ){ ControladorDeArma.gameObject.SendMessageUpwards("AddEspecial", Municao, SendMessageOptions.DontRequireReceiver); function AdicionarMina( Municao ){ ControladorDeArma.gameObject.SendMessageUpwards("AddMina", Municao, SendMessageOptions.DontRequireReceiver);

167 165 Arma.js O script Arma.js (ver Quadro 2), vinculado ao objeto Atirador, controla as ações relacionadas a atirar. A função MudaArma() é responsável pela troca da arma ativa. Realiza essa ação verificando a munição disponível de cada arma a arma ativa é comutada para a próxima arma com munição suficiente. A função Fire() instancia um projétil do tipo que foi ativado pelo MudaArma() e então atribui a ele uma velocidade pré-definida. Caso não se trate da arma básica, a função também reduz o contador de munição relacionado e, se a munição se esgota, a função MudaArma() é chamada. No caso de tratar-se do jogador humano, o objeto Juiz é informado que a função foi chamada (essa contagem se relaciona à contagem de pontos). Quando o objeto é informado sobre ter acertado um tiro (ver Projetil.js), também informa o juiz sobre esse evento. As funções AddMina() e AddEspecial() são responsáveis por adicionar munição ao contador, e são chamadas por mensagens vindas do script AddAmmo.js. Por fim, algumas funcionalidades especiais são adicionadas para comportamentos específicos: Na fase final, é excluída a possibilidade de se utilizar a arma básica; Caso o projétil a ser disparado seja um míssil perseguidor (arma especial da terceira fase), então a velocidade atribuída a ele é vertical para cima, e não horizontal para a frente. O próprio script de comportamento será responsável por modificar essa velocidade para que o míssil persiga seu alvo; Caso a flag AutoAim esteja habilitada, o atirador sempre aponta na direção de um alvo pré-definido. Essa funcionalidade é utilizada pelo oponente da fase final, tornando o jogo mais difícil; O script também é responsável, no caso do oponente final, de verificar se há uma linha de tiro entre o oponente e o jogador. Em caso afirmativo, um projétil é disparado;

168 166 A freqüência de disparos do oponente final é, também, ajustada, de acordo com o nível de dificuldade do jogo. Além destas funcionalidades, o script implementa a mira automatica para a arma especial da fase 3 (míssil perseguidor). O alvo é representado pela variavel missile_target. A função settarget() verifica quais oponentes estão em uma certa região de proximidade: caso um deles seja o atual valor de missile_target, este permanece o mesmo, caso contrário o próximo alvo dispónivel é selecionado (ou null caso nenhum esteja disponível). A função nexttarget() muda para o próximo valor de alvo possível (Target1 para Target2, por exemplo), sem se preocupar se esse alvo está ou não próximo (isso é verificado pela função settarget()). Quadro 2 - Script contido no arquivo Arma.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Armas/Arma.js var isbot : boolean = false; var autoaim : boolean = false; var TargetToShoot : Transform; var ArmaBasica:GameObject; var ShootUpHoming : boolean = false; public var ArmaEspecial:GameObject; var Juiz:GameObject; //numero da fase atual var fase: int; var recolhearmabasica: String; var equipaarmabasica: String; var recolhearmaespecial: String; var equipaarmaespecial: String; public var ArmaAtiva = 1; // 1 = Arma Basica, 2 = Arma Especial, 3 = Mina var TenhoArmaBasica : boolean = true; // Variaveis relacionadas a pontuacao var Tiros = 0; var Acertos = 0; var ProjetilBasica : Rigidbody; var VelocidadeBasica = 100.0; var ReloadBasica :float = 2; private var LastShotBasica = -10; var SomArmaBasica : AudioSource; var ProjetilEspecial : Rigidbody; var VelocidadeEspecial = 100.0; var ReloadEspecial = 10; private var LastShotEspecial = -10; var SomArmaEspecial : AudioSource;

169 167 var ProjetilMina : Rigidbody; var LocalMina : Transform; var ReloadMina = 10; private var LastShotMina = -10; var SomMina : AudioSource; var SomTrocaDeArma : AudioSource; var MunicaoEspecial = 0; var MunicaoMina = 0; var missile_target: GameObject = null; var Self: GameObject; var Target1: GameObject; var Target2: GameObject; var Target3: GameObject; // link para o script do missil perseguidor var ScriptMissil : ProjetilHoming; var angulolimite : float = 90; // Angulo do cone que diz se o carro esta na mira var distancialimite : float = 100; // Altura do cone que diz se o carro esta na mira function EstaNaMira (alvo : Vector3, base : Transform) { var angulo : float = Vector3.Angle(base.forward,alvo-base.position); // Calcula o angulo entre a frente do carro e o vetor que sai do carro em direcao ao alvo var dist : float = (alvo-base.position).sqrmagnitude; // Calcula a distancia entre a base e o alvo if(angulo > 90 && dist > 20) return false; else if(angulo > 45 && dist > 500) return false; else if(dist > 5000) return false; else return true; function settarget(){ var t = new Array(); if(target1 && EstaNaMira(Target1.transform.position, transform)) t[0] = true; else t[0] = false; if(target2 && EstaNaMira(Target2.transform.position, transform)) t[1] = true; else t[1] = false; if(target3 && EstaNaMira(Target3.transform.position, transform)) t[2] = true; else t[2] = false; if(missile_target == Target1){ if(t[0]) missile_target = Target1; else if(t[1]) missile_target = Target2; else if(t[2]) missile_target = Target3; else missile_target = null; if(missile_target == Target2){ if(t[1]) missile_target = Target2; else if(t[2]) missile_target = Target3; else if(t[0]) missile_target = Target1; else missile_target = null; if(missile_target == Target3){ if(t[2]) missile_target = Target3; else if(t[0]) missile_target = Target1;

170 168 else if(t[1]) missile_target = Target2; else missile_target = null; if(missile_target == null){ if(t[0]) missile_target = Target1; else if(t[1]) missile_target = Target2; else if(t[2]) missile_target = Target3; else missile_target = null; if (ScriptMissil) { if (missile_target) { ScriptMissil.Enemy = missile_target.transform; else { ScriptMissil.Enemy = null; function nexttarget(){ if(missile_target == Target1) missile_target = Target2; else if(missile_target == Target2) missile_target = Target3; else missile_target = Target1; function Start() { //Se a fase for diferente da fase 4, começa a fase com a arma basica. if (fase!= 4 isbot){ if (TenhoArmaBasica) { ArmaBasica.active = true; ArmaEspecial.active = false; else{ // na fase 4, começa com a arma especial ArmaBasica.active = false; ArmaEspecial.active = true; // Ajusta velocidade de tiros de acordo com a dificuldade if (isbot && autoaim) { var dif : int = GameObject.Find("Juiz").GetComponent("SaveGame").dificuldade; if (dif==2) { ReloadBasica = ReloadBasica*0.5; if (dif==3) { ReloadBasica = ReloadBasica*0.1; function MudaArma(proxArma) { if (ArmaAtiva==2) { ArmaEspecial.active=false; else if (ArmaAtiva==1) { ArmaBasica.active=false; if (proxarma==1) { SomTrocaDeArma.Play(); ArmaBasica.active = true;

171 169 ArmaAtiva = 1; if (proxarma==2) { SomTrocaDeArma.Play(); ArmaEspecial.active = true; ArmaAtiva = 2; if (proxarma==3) { SomTrocaDeArma.Play(); ArmaEspecial.active = false; ArmaAtiva = 3; function MudaArma() { if (ArmaAtiva==1) { if (MunicaoEspecial>0) { MudaArma(2); else if (MunicaoMina>0) { MudaArma(3); else if (ArmaAtiva ==2 ) { if (MunicaoMina>0){ MudaArma(3); else if (TenhoArmaBasica) { MudaArma(1); else if (ArmaAtiva == 3) { if (TenhoArmaBasica) { MudaArma(1); else if (MunicaoEspecial >0) { MudaArma(2); function Update () { if (!isbot) { if(input.getkeydown("space")) { // Ao pressionar o botao para mudar de arma... MudaArma(); if(input.getkeydown("left ctrl")) { Fire(); if(armaativa == 2 && fase == 3 && Input.GetKeyDown("z")) nexttarget(); if (autoaim) { transform.lookat(targettoshoot.position); var fwd = transform.transformdirection (Vector3.forward); var hit : RaycastHit; if (Physics.Raycast (transform.position, fwd, hit)) { if (hit.transform.position==targettoshoot.position) { print("bus has a clear shot!"); Fire();

172 170 settarget(); function Fire () { Tiros+=1; // Did the time exceed the reload time? if (ArmaAtiva==1) { if (TenhoArmaBasica) { if (Time.time > ReloadBasica + LastShotBasica) { // create a new projectile, use the same position and rotation as the Launcher. var instantiatedprojectile : Rigidbody = Instantiate (ProjetilBasica, transform.position, transform.rotation); // Give it an initial forward velocity. The direction is along the z-axis of // the missile launcher's transform. instantiatedprojectile.velocity = transform.transformdirection(vector3 (0, 0, VelocidadeBasica))+Vector3(1,1,1)*Random.Range(-2,2) ; LastShotBasica = Time.time; SomArmaBasica.Play(); if(juiz)juiz.gameobject.sendmessageupwards("atirar"); else { MudaArma(); else if (ArmaAtiva==2) { if (Time.time > ReloadEspecial + LastShotEspecial) { if (MunicaoEspecial > 0){ // create a new projectile, use the same position and rotation as the Launcher. var instantiatedprojectile2 : Rigidbody = Instantiate (ProjetilEspecial, transform.position, transform.rotation);//*projetilespecial.rotation); instantiatedprojectile2.addtorque (Vector3.up*10); if (ShootUpHoming) { // If it is a homing missile, give it speed in the y direction instantiatedprojectile2.velocity = transform.transformdirection(vector3 (0, VelocidadeEspecial, 0)); else { instantiatedprojectile2.velocity = transform.transformdirection(vector3 (0, 0, VelocidadeEspecial)); // Give it an initial forward velocity. The direction is along the z-axis of // the missile launcher's transform. LastShotEspecial = Time.time; SomArmaEspecial.Play(); if(fase!= 0){ MunicaoEspecial = MunicaoEspecial-1; Juiz.gameObject.SendMessageUpwards("Atirar");

173 171 if (MunicaoEspecial==0) { MudaArma(); else if (ArmaAtiva==3) { if (Time.time > ReloadMina + LastShotMina) { if (MunicaoMina > 0){ // create a new projectile, use the same position and rotation as the Launcher. var instantiatedprojectile3 : Rigidbody = Instantiate (ProjetilMina, LocalMina.position, Quaternion.identity);//LocalMina.rotation); // Give it an initial forward velocity. The direction is along the z-axis of // the missile launcher's transform. //instantiatedprojectile2.velocity = transform.transformdirection(vector3 (0, 0, VelocidadeEspecial)); LastShotMina = Time.time; SomMina.Play(); if(fase!= 0){ MunicaoMina = MunicaoMina-1; Juiz.gameObject.SendMessageUpwards("Atirar"); if (MunicaoMina==0) { MudaArma(); function Acertei() { // Se eu acertei, informa ao juiz que acertei (usado para contagem de tiros) Juiz.gameObject.SendMessageUpwards("Acertar"); Acertos=Acertos+1; function AddEspecial(Municao) { MunicaoEspecial += Municao; function AddMina(Municao) { MunicaoMina += Municao; ControladorArmaBasica.js e ControladorArmaEspecial.js Os scripts ControladorArmaBasica.js (ver Quadro 3) e ControladorArmaEspecial.js (ver Quadro 4), tratam-se de scripts vinculados às malhas relativas à arma básica e à arma especial, respectivamente, que definem

174 172 uma função que desativa as malhas. A função é chamada como parte do processo de troca de armas (ver Arma.js). Quadro 3 - Script contido no arquivo ControladorArmaBasica.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Armas/ControladorArmaBasica.js function desativaarmabasica (){ this.gameobject.active = false; Quadro 4 - Script contido no arquivo ControladorArmaEspecial.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Armas/ControladorArmaEspecial.js function desativaarmaespecial (){ this.gameobject.active = false; Projetil.js O script Projetil.js (ver Quadro 5), é vinculado a cada projétil e define seu comportamento. Ao ser instanciado, o projétil ativa um contador que permite que ele seja destruído após 20 segundos de sua criação (essa proteção evita que um número muito grande de projéteis tenha que ser controlado pelo jogo, o que prejudicaria o desempenho do programa). Quando colide com um carro, o projétil envia uma mensagem que ativa a função TomarDano() do carro, na qual parâmetros sobre a colisão são passados. Pasa isso, é utilizada a classe ParametrosColisao, que também é definida neste script. Quadro 5 - Script contido no arquivo Projetil.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Armas/Projetil.js var Dano = 10; // Quantidade de dano causada pelo projétil var SoundToPlay : AudioClip; // Som que toca quando o projetil atinge um carro var ReduzVelocidade = 0; // Define quanta redução na velocidade é causada pelo projétil var ReduzManobra = 0; // Define quanto a manobrabilidade do carro é afetada pelo projétil var SouMina : boolean = false; // Comuta para comportamento de mina terrestre var Atirador : GameObject; // Link para o atirador que disparou o tiro var OrigemJogador : boolean = false; // Verdadeiro se o projétil foi disparado pelo jogador humano // Variáveis relacionadas à explosão

175 173 var Expl: GameObject; var Fumaca: GameObject; var Estrela: GameObject; var explode: boolean = false; var Remetente : GameObject = null; //Link para o carro que disparou o tiro private var TempoInicio; class ParametrosColisao // Informa dados sobre a colisao { var Dano = 10; var OrigemJogador = false; var Remetente : GameObject = null; function Start() { TempoInicio = Time.time; function OnCollisionEnter( hit : Collision ) // Ao colidir com um objeto... { if ((hit.gameobject!= Remetente ) SouMina) { if (hit.gameobject.tag=="carro" hit.gameobject.tag=="carroplayer") { P = new ParametrosColisao(); P.Dano = Dano; P.OrigemJogador = OrigemJogador; P.Remetente = Remetente; AudioSource.PlayClipAtPoint (SoundToPlay, transform.position); hit.collider.sendmessageupwards("tomardano", P);//, SendMessageOptions.DontRequireReceiver); hit.collider.sendmessageupwards("reduzirvelocidade", ReduzVelocidade, SendMessageOptions.DontRequireReceiver); hit.collider.sendmessageupwards("reduzirmanobra", ReduzManobra, SendMessageOptions.DontRequireReceiver); if (Atirador!= null) { // Informa ao atirador que acertou o tiro Atirador.SendMessageUpwards("Acertei", Dano, SendMessageOptions.DontRequireReceiver); if ( (hit.gameobject.tag=="carro") (hit.gameobject.tag=="carroplayer")!(soumina)) { Destroy( gameobject ); if(explode){ var expl_tmp : GameObject = Instantiate (Expl,transform.position, transform.rotation); var fumaca_tmp : GameObject = Instantiate (Fumaca,transform.position, transform.rotation); var estrela_tmp : GameObject = Instantiate (Estrela,transform.position, transform.rotation); function Update() { if (Time.time > TempoInicio+20) Destroy (gameobject);

176 174 ProjetilHoming.js O script ProjetilHoming.js (ver Quadro 6) está relacionado ao projétil perseguidor e seu funcionamento é essencialmente idêntico ao do Projetil.js, sendo adicionadas funcionalidades que modificam a velocidade do projétil para que ele altere sua trajetória, buscando um alvo definido quando o projétil é instanciado. Quadro 6 - Script contido no arquivo ProjetilHoming.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Armas/ProjetilHoming.js var Dano = 10; var SoundToPlay : AudioClip; var ReduzVelocidade = 0; var ReduzManobra = 0; var SouMina : boolean = false; var Atirador : GameObject; var OrigemJogador : boolean = false; var Expl: GameObject; var Fumaca: GameObject; var Estrela: GameObject; var Remetente : GameObject = null; var explode: boolean = false; var magneticforce : float = 10; var Enemy : Transform; var FloatTime : float = 0.5; private var TempoInicio; function Start() { TempoInicio = Time.time; function OnCollisionEnter( hit : Collision ) // Ao colidir com um objeto... { if (hit.gameobject.tag=="carro" hit.gameobject.tag=="carroplayer") { P = new ParametrosColisao(); P.Dano = Dano; P.OrigemJogador = OrigemJogador; AudioSource.PlayClipAtPoint (SoundToPlay, transform.position); hit.collider.sendmessageupwards("tomardano", P);//, SendMessageOptions.DontRequireReceiver); hit.collider.sendmessageupwards("reduzirvelocidade", ReduzVelocidade, SendMessageOptions.DontRequireReceiver); hit.collider.sendmessageupwards("reduzirmanobra", ReduzManobra, SendMessageOptions.DontRequireReceiver); if (Atirador!= null) { // Informa ao atirador que acertou o tiro Atirador.SendMessageUpwards("Acertei", Dano, SendMessageOptions.DontRequireReceiver); if ( (hit.gameobject.tag=="carro") (hit.gameobject.tag=="carroplayer")!(soumina)) { Destroy( gameobject ); if(explode){

177 175 transform.rotation); transform.rotation); transform.rotation); var expl_tmp : GameObject = Instantiate (Expl,transform.position, var fumaca_tmp : GameObject = Instantiate (Fumaca,transform.position, var estrela_tmp : GameObject = Instantiate (Estrela,transform.position, function Update() { if (Time.time > TempoInicio+50) { Destroy (gameobject); if (Enemy) { if (Time.time > TempoInicio+FloatTime) { t = rigidbody.velocity; //print(enemy.position); rigidbody.velocity= ((Enemy.position - transform.position).normalized* magneticforce); rigidbody.velocity = rigidbody.velocity.normalized * t.magnitude; transform.lookat(enemy.position); Explosao No subdiretório Explosao, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Armas/Explosao, encontram-se os scripts que implementam os efeitos de explosão. São eles: esferafumaca.js (ver Quadro 7) e estrela.js (ver Quadro 8). Além dos scripts são importantes também os prefabs esferafumaca, estrela e Detonator-Base (do pacote Detonator), aos quais estão associados os scripts (Detonator-Base possui um script próprio que vem com o pacote). Para criar uma explosão, devem ser instanciados no momento desejado cada um dos três prefabs, que então passam a ser animados por seus scripts.

178 176 esferafumaca.js O script esferafumaca.js (ver Quadro 7) consiste de dois metodos, Start() e Update(). Start() inicializa as variveis da esfera de fumaça, fazendo-a de tamanho zero (escala zero) e nenhuma transparência. A função Update() cuida de, a cada quadro, aumentar o tamanho da esfera e sua transparencia. Assim que a esfera fica totalmente transparente ela é destruída. Quadro 7 - Script contido no arquivo esferafumaca.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Armas/Explosao/esferafumaca.js //incremento de escala e escala máxima var inc:float = 1.0; var max:float = 8.0; function Update () { if(gameobject.transform.localscale.x < max){ //aumenta a escala e a transparência gameobject.transform.localscale.x+=inc; gameobject.transform.localscale.y+=inc; gameobject.transform.localscale.z+=inc; gameobject.renderer.materials[0].color.a -= 0.1; else{ //após atingir certo tamanho, destrói o objeto Destroy(gameObject); function Start(){ //ajusta escala e transparência iniciais: escala zero e nenhuma transparência. gameobject.transform.localscale.x=0; gameobject.transform.localscale.y=0; gameobject.transform.localscale.z=0; gameobject.renderer.materials[0].color.a = 1; estrela.js O script estrela.js (ver Quadro 8) é semelhante ao script esferafumaca.js, Start() inicia atributos e Update() atualiza. Porém, além de escala e transparência, esse script faz também rotação da estrela.

179 177 Quadro 8 - Script contido no arquivo estrela.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Armas/Explosao/estrela.js //incremento de escala var inc:float = ; function Update () { if(gameobject.renderer.materials[0].color.a>0){ //aumenta a escala e a transparência e rotaciona a estrela gameobject.transform.localscale.x+=inc; gameobject.transform.localscale.y+=inc; gameobject.transform.localscale.z+=inc; gameobject.transform.localrotation.x+=0.1; gameobject.transform.localrotation.y+=0.1; gameobject.transform.localrotation.z+=0.1; else{ gameobject.renderer.materials[0].color.a -= 0.1; //após atingir certo tamanho, destrói o objeto Destroy(gameObject); function Start(){ //ajusta escala e transparência iniciais: escala zero e nenhuma transparência. gameobject.transform.localrotation.x=1; gameobject.transform.localrotation.y=0; gameobject.transform.localrotation.z=0; gameobject.renderer.materials[0].color.a = 1; 9.2. Carros No subdiretório Carros, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Carros, encontram-se os scripts que implementam os códigos e funções responsáveis pela movimentação e controle dos carros do jogo. Estes scripts e seus códigos serão descritos a seguir: Controlador.js O script Controlador.js (ver Quadro 9) controla os carros dos oponentes, ou bots. Os bots utilizam o mesmo script de movimentação do

180 178 carro que o jogador, ou seja, possuem as mesmas restrições e benefícios do jogador. O script de movimentação do carro, Movimentacao.js (ver Quadro 12), possui algumas variáveis disponíveis publicamente para alteração, entre as quais uma que determina se o carro controlado é um bot e outras que correspondem à entrada que o jogador fornece. Atribuindo valores a essas variáveis, este script controla o carro como se fosse um jogador fornecendo a entrada. Isso permite que se altere a estrutura da IA ou do próprio script de movimentação do carro, desde que a interface permaneça a mesma, facilitando a manutenção e entendimento do código. Um alvo, na forma de uma posição no espaço, é fornecido por algum script externo para o controlador, o qual tenta alcançá-lo. Para tal, o controlador determina qual o ângulo de correção e a aceleração necessária para chegar ao objetivo e descobre a entrada necessária para que o script de movimentação tenha o comportamento desejado. Como o carro pode não conseguir virar a quantidade desejada, ele pode colidir com um objeto do terreno. Para evitar que ele fique travado, essa condição é detectada e tratada de maneira especial por um curto espaço de tempo, sendo este suficiente para que possa prosseguir em direção ao alvo. Quadro 9 - Script contido no arquivo Controlador.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Carros/Controlador.js // Variaveis relacionadas ao movimento do carro var distmax : float = 100; // Distancia a partir da qual o torque do motor e maximo var target : Vector3; // Posicao a qual se deseja chegar private var carro : Movimentacao; // Carro ao qual esse script se refere var dist : float; // Distância entre o carro e o alvo var travou : boolean = false; // Diz se o carro estava travado var limiarvelocidade : float = 0.01; // Velocidade mínima que deve ser atingida para que o carro não seja considerado travado var tempodeespera : float = 2; // Quantidade de segundos que se deve esperar para o carro se recuperar de uma travada var contador : int = 0; // Contador da quantidade de frames que o carro estava travado var contadorlimite : int = 10; // Limite do contador de frames que o carro ficou travado var tempo : float; // Contador do tempo que o carro ainda tem para se recuperar de uma travada var angulo_roda : float; // Angulo da roda // Determina se o carro travou. Se a velocidade for abaixo do limite ou a inclinação do carro estiver acima do limite, incrementa o contador. Caso contrário, o zera.

181 179 // Se o contador estourar, significa que o bot travou ou está tentando atingir uma inclinacao proibida. Em ambos casos ativa o flag que indica travamento. function checasevelocidadezero () { // Se a velocidade esta baixa ou a inclinação estiver acima do limite... if (carro.velocidade <= limiarvelocidade carro.inclinacao > carro.inclinacaolimite) { // Se o contador está abaixo do limite, incrementa-o if (contador < contadorlimite) { contador++; return; // Indica que o carro travou travou = true; // Inicializa o tempo que o carro tem para se destravar tempo = tempodeespera; else { contador = 0; // Ao iniciar o script, informa o script de movimentacao que quem controlara o carro e um BOT, permitindo que esse script apenas gere os comandos da mesma maneira que uma pessoa faria function Start () { carro = transform.parent.getcomponent(movimentacao); carro.isbot = true; function Update () { // Se esta travado, ve se passou do tempo disponivel para destravar... if (travou) { // Decrementa o tempo de processamento do ultimo frame do tempo atual tempo -= Time.deltaTime; // Se for negativo, passou do tempo e considera o carro destravado. Nao se chama a funcao checasevelocidadezero para que o carro possa tentar mover para frente if (tempo <= 0) { travou = false; contador = 0; else // Se nao estava travado, checa se esta travado checasevelocidadezero (); // Ignora a direcao y no calculo do erro do angulo do carro, que sera passado para a roda target.y = 0; var pos : Vector3 = carro.transform.position; pos.y = 0; var erro : Vector3 = target-pos; angulo_roda = Vector3.Angle(erro,carro.transform.forward); // Como a funcao Vector3.Angle apenas determina o angulo, ha necessidade de saber se o angulo e positivo ou negativo para que o ajuste da roda seja feito corretamente. Foi utilizado o produto vetorial que e capaz de fornecer essa informacao var sinal : float = Vector3.Cross(erro,carro.transform.forward).y; angulo_roda = (sinal >= 0? angulo_roda : -angulo_roda); // Limita os valores do angulo da roda entre [ ] if (angulo_roda > 180)

182 180 angulo_roda -= 360; else if (angulo_roda < -180) angulo_roda += 360; // Multiplica-se o angulo desejado por 2 para se ter um ajuste mais rapido. Esse valor deve ser alterado nos proximos ajustes com os carros mais estaveis angulo_roda *= 2; // Determina a distancia entre o alvo e o carro, que sera utilizada para determinar o torque aplicado no motor dist = Vector3.Distance(target, pos); // Caso a distancia seja maior do que a distancia que o torque e maximo, coloca-a como a distancia de torque maximo, ja que nao seria possivel aplicar um torque maior if (dist > distmax) dist = distmax; // Como a tendencia do carro e sempre seguir em frente, considera-se que ele so trava em movimentos nessa direcao // Entao, se o carro nao esta travado, move-se para frente e aplica-se o angulo de correcao das rodas if (!travou) { carro.forward = dist/distmax; carro.back = 0; carro.steer = -Mathf.Clamp (angulo_roda/carro.steermax, -1, 1); else { // Caso esteja travado, manobra de maneira semelhante ao que uma pessoa faria: da re e desloca as rodas na outra direcao, aplicando a correcao correta das rodas carro.back = dist/distmax; carro.forward = 0; carro.steer = Mathf.Clamp (angulo_roda/carro.steermax, -1, 1); ControledeVida.js e ControledeVidaInimigos.js O controlador de vida é um trecho de código voltado a administrar a quantidade de vida de um carro. Para isso, ele recebe instruções de outros objetos para modificar essa quantidade. A partir do resultado dessa modificação, toma as providências necessárias. Para os personagens controlados pelo computador, tais providências são: Atualizar o tamanho e a cor da barra de vida que aparece sobre o personagem; Se a quantidade de vida restante for zero ou menos, informa o controlador da fase (juiz) sobre sua derrota e remove o objeto do jogo;

183 181 Para o personagem controlado pelo jogador, são: Se a quantidade de vida restante cai ultrapassando um limiar, comuta a música do jogo para a música de drama; Se a quantidade de vida restante sobe ultrapassando esse mesmo limiar, comuta a música do jogo para a música normal da fase; Se a quantidade de vida restante for zero ou menos, comuta a música do jogo para a música de derrota e então faz com que o carro lentamente flutue, impedindo sua ação por dez segundos. Ao fim desses dez segundos, reinicia a fase. O código computacional relacionado a essas funcionalidades vincula-se ao objeto carro, sendo que há uma versão dele para o personagem controlado pelo jogador ControledeVida.js (ver Quadro 10) e outra para os personagens controlados pelo computador ControledeVidaInimigos.js (ver Quadro 11). Além da alteração de vida causada por projéteis, a colisão com objetos normais do jogo (como árvores, pedras, casas ou outros carros) também pode causar dano ao carro. Essa alteração é o produto da massa do objeto com o qual se colidiu e da velocidade da colisão, multiplicado por uma constante pré-definida. Quadro 10 - Script contido no arquivo ControledeVida.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Carros/ControledeVida.js public var Vida = 100; var MaxHudBar = 200.0; var MusicaNormal : AudioSource; var MusicaDrama : AudioSource; var MusicaVitoria : AudioSource; var MusicaDerrota : AudioSource; var ThMudarMusica = 30; var juiz : GameObject; var cam : GameObject; private var derrotado = false; private var queda = false; private var virado = false; private var dramamode = false; private var horaderrota; private var horavirada; private var posicao : Vector3; private var posicaoinicial : Vector3; private var posicaocaminicial : Vector3;

184 182 private var rotacao : Quaternion; // Vida perdida em caso de dificuldade mais alta var MenosVidaMed = 30; var MenosVidaHard = 50; //numero da fase atual var fase : int; var CoeficienteDanoColisao = ; var MaxDanoColisao = 10; var SomBatida : AudioSource; var MinDanoColisao = 2; var DanoQueda = 10; var DanoVirada = 5; // Dano quando entra em colisao function OnCollisionEnter(collision : Collision) { if ((collision.gameobject.tag!= "Arma") && (collision.gameobject.tag!= "MedKit") && (collision.gameobject.tag!= "Projetil") && (collision.gameobject.tag!= "Terreno") && (collision.gameobject.tag!= "Ponte") && (collision.gameobject.tag!= "Trofeu")){ v = 0; v = collision.relativevelocity.magnitude; m = rigidbody.mass; if (collision.rigidbody) { m = m + collision.rigidbody.mass; P = new ParametrosColisao(); P.Dano = m*v*coeficientedanocolisao; if (P.Dano>MaxDanoColisao) P.Dano = MaxDanoColisao; if (P.Dano > 0.1*MaxDanoColisao) { SomBatida.Stop(); SomBatida.volume = P.Dano/MaxDanoColisao; SomBatida.Play(); if (P.Dano>MinDanoColisao) { P.OrigemJogador = false; TomarDano(P); function TomarDano (Parametros) { // Funcao chamada quando se toma dano Dano = Parametros.Dano; OrigemJogador = Parametros.OrigemJogador; // print("tomei dano!"); //na fase inicial o jogador não perde vida if (fase!=0) Vida = Vida-Dano; if(vida<0) { Morrer();

185 183 // Comuta a musica, caso necessario if ((Vida < ThMudarMusica) && (dramamode==false) && Vida > 0) { MusicaNormal.volume=0; MusicaDrama.Play(); dramamode=true; if ((Vida >= ThMudarMusica) && (dramamode==true)) { MusicaNormal.volume=1; MusicaDrama.Stop(); dramamode=false; juiz.gameobject.sendmessageupwards("modificavida", Vida); function AdicionarVida(QuantaVida) { // Funcao chamada quando se pega um medkit Vida = Vida+QuantaVida; if (Vida>100) { Vida = 100; juiz.gameobject.sendmessageupwards("modificavida", Vida); // Comuta a musica, caso necessario if ((Vida < ThMudarMusica) && (dramamode==false) && Vida > 0) { MusicaNormal.volume=0; MusicaDrama.Play(); dramamode=true; if ((Vida >= ThMudarMusica) && (dramamode==true)) { MusicaNormal.volume=1; MusicaDrama.Stop(); dramamode=false; function RadioVitoria() { // Comuta a musica para a musica da vitoria MusicaNormal.Stop(); MusicaDrama.Stop(); MusicaVitoria.Play(); function Morrer() { // Executa acoes relativas aa derroto if (derrotado == false) { juiz.gameobject.sendmessageupwards("derrota"); MusicaNormal.Stop(); MusicaDrama.Stop(); MusicaDerrota.Play(); derrotado = true; horaderrota = Time.time; function Start(){ //captura as posicoes inciais do carro e da camera posicaoinicial = transform.position; posicaocaminicial = cam.transform.position;

186 184 // Ajusta a vida inicial de acordo com a dificuldade // Coisas relacionadas à dificuldade var dif : int = GameObject.Find("Juiz").GetComponent("SaveGame").dificuldade; P = new ParametrosColisao(); P.Dano=0; if (dif==2) { // Dificuldade media P.Dano=MenosVidaMed; TomarDano(P); if (dif==3) { // Dificuldade hard P.Dano=MenosVidaHard; TomarDano(P); function Update(){ inicial false){ if (derrotado==true) { // Carro flutua por 10 segundos e entao a fase reinicia rigidbody.usegravity = false; transform.position = transform.position + Vector3(0, 1, 0)*Time.deltaTime; if (Time.time > horaderrota + 10) { Application.LoadLevel(Application.loadedLevel); //verifica se o carro está no mapa posicao = transform.position; if (posicao[1] < -10){ //caso tenha caído do mapa, toma dano e volta o carro e a camera para a posição queda = true; P = new ParametrosColisao(); P.Dano = DanoQueda; TomarDano(P); transform.position = posicaoinicial; cam.transform.position = Vector3(posicaoCamInicial[0], 100, posicaocaminicial[2]); //verifica se o carro está capotado rotacao = transform.rotation; //print (rotacao); if ((rotacao[0]<-0.55 rotacao[0]>0.55 rotacao[2] <-0.55 rotacao[2] > 0.55) && virado == virado = true; horavirada = Time.time; if (virado && (rotacao[0]<-0.55 rotacao[0]>0.55 rotacao[2] <-0.55 rotacao[2] > 0.55)){ if (Time.time > horavirada + 3) { //se o carro está virado a 3 segundos ou mais, toma dano e desvira o carro P = new ParametrosColisao(); P.Dano = DanoVirada; TomarDano(P); transform.rotation = Quaternion(0.0,0.0,0.0,1.0); virado = false; else{ virado = false;

187 185 Quadro 11 - Script contido no arquivo ControledeVidaInimigos.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Carros/ControledeVidaInimigos.js public var Vida = 100; var MaxBarrinha = 1.0; var BarraDeVida : Transform; var juiz : GameObject; private var queda = false; private var virado = false; private var horavirada; private var posicao : Vector3; private var posicaoinicial : Vector3; private var posicaocaminicial : Vector3; private var rotacao : Quaternion; // Fator de Reducao de dano devido a dificuldade var FatorDanoMed = 0.7; var FatorDanoHard = 0.5; var CoeficienteDanoColisao = ; var MaxDanoColisao = 10; //var SomBatida : AudioSource; var MinDanoColisao = 2; var DanoQueda = 10; var DanoVirada = 5; private var controlador : IA_astar; private var vivo : boolean = true; // Dano quando entra em colisao function OnCollisionEnter(collision : Collision) { if ((collision.gameobject.tag!= "Arma") && (collision.gameobject.tag!= "MedKit") && (collision.gameobject.tag!= "Projetil") && (collision.gameobject.tag!= "Terreno") && (collision.gameobject.tag!= "Ponte")){ v = 0; v = collision.relativevelocity.magnitude; m = rigidbody.mass; if (collision.rigidbody) { m = m+collision.rigidbody.mass; P = new ParametrosColisao(); P.Dano = m*v*coeficientedanocolisao; if (P.Dano>MaxDanoColisao) P.Dano = MaxDanoColisao; //if (P.Dano > 0.5*MaxDanoColisao) { // SomBatida.Stop(); // SomBatida.volume = P.Dano/MaxDanoColisao; // SomBatida.Play(); // if (P.Dano>MinDanoColisao) { P.OrigemJogador = false;

188 186 TomarDano(P); function Start() { // Inicializa a barra de vida e avisa juiz que inimigo foi criado. BarraDeVida.renderer.material.color = Color.green; juiz.gameobject.sendmessageupwards("modinimigo", 1, SendMessageOptions.DontRequireReceiver); //captura as posicoes inciais do carro posicaoinicial = transform.position; controlador = GetComponentInChildren(IA_astar); function Update(){ //verifica se o carro está no mapa posicao = transform.position; if (posicao[1] < -10){ //caso tenha caído do mapa, toma dano e volta o carro e a camera para a posição inicial queda = true; P = new ParametrosColisao(); P.Dano = DanoQueda; TomarDano(P); transform.position = posicaoinicial; //verifica se o carro está capotado rotacao = transform.rotation; //print (rotacao); if ((rotacao[0]<-0.55 rotacao[0]>0.55 rotacao[2] <-0.55 rotacao[2] > 0.55) && virado == false){ virado = true; horavirada = Time.time; if (virado && (rotacao[0]<-0.55 rotacao[0]>0.55 rotacao[2] <-0.55 rotacao[2] > 0.55)){ if (Time.time > horavirada + 3) { //se o carro está virado a 3 segundos ou mais, toma dano e desvira o carro P = new ParametrosColisao(); P.Dano = DanoVirada; TomarDano(P); transform.rotation = Quaternion(0.0,0.0,0.0,1.0); virado = false; else{ virado = false; function TomarDano (Parametros) { var Dano : float = Parametros.Dano; // De acordo com o nível de dificuldade, dano é reduzido var dif : int = GameObject.Find("Juiz").GetComponent("SaveGame").dificuldade; if (dif==2) { Dano = Dano*FatorDanoMed;

189 187 if (dif==3) { Dano = Dano*FatorDanoHard; OrigemJogador = Parametros.OrigemJogador; if (Parametros.Remetente){ var Remetente : String = Parametros.Remetente.name; //print("tomei dano!"); controlador.tomardano (Remetente, Dano); Vida = Vida-Dano; if (Vida>100) { Vida=100; // Controle da barra de vida if(vida>0){ BarraDeVida.localScale.x = Vida * MaxBarrinha/100.0; else { BarraDeVida.localScale.x = 0.0; if (Vida > 80) { BarraDeVida.renderer.material.color = Color.green; else if (Vida > 40) { BarraDeVida.renderer.material.color = Color.yellow; else if (Vida > 0) { BarraDeVida.renderer.material.color = Color.red; else { // Caso especial: morte do inimigo. if (vivo) { vivo = false; juiz.gameobject.sendmessageupwards("modinimigo", -1, SendMessageOptions.DontRequireReceiver); if (OrigemJogador==true) { juiz.gameobject.sendmessageupwards("jogadormatou", null); Destroy( gameobject ); function AdicionarVida(QuantaVida) { P = new ParametrosColisao(); P.Dano = -QuantaVida; TomarDano(P);

190 188 Movimentacao.js A movimentação do carro busca simular o mesmo princípio físico de movimentação ligado a carros reais. Esta simulação é realizada no arquivo Movimentacao.js (ver Quadro 12) Assim, o objeto carro é composto por dois pares de rodas e uma base sólida. Por imposição de programação, a posição relativa das rodas e da base é definida por um algoritmo que simula uma suspensão, buscando garantir maior contato das rodas com o solo e, assim, mais estabilidade ao veículo. O processo de movimentação pode receber quatro comandos distintos: ir para a frente, ir para trás, ir para a esquerda ou ir para a direita. Quando o carro recebe o comando de ir para a frente, aumenta-se o torque aplicado nas rodas dianteiras de forma a simular um motor de tração dianteira até um limite conhecido, definido pelo programador 8. Esse limite de torque, junto à massa do sistema, limita a velocidade do veículo. Alterando-se a taxa de modificação no torque, limita-se a aceleração do mesmo. O comando de ir para trás emula o mesmo comportamento, mas no sentido oposto. O comando de ir para a direita impõe nas rodas dianteiras uma modificação angular tal que as rodas giram para a direita, numa taxa definida pelo programador. Uma vez que as rodas têm atrito com o chão, o sistema passa a girar para a direita (considerando que há movimentação para a frente). O mesmo comportamento ocorre quando o carro recebe o comando de ir para a esquerda. O programador é capaz de especificar o ângulo máximo em alta e baixa velocidades, juntamente com as velocidades limites. Isso faz com que o limite seja constante fora do intervalo especificado e tenha interpolação linear dentro do intervalo entre as velocidades desejadas. Quadro 12 - Script contido no arquivo Movimentacao.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Carros/Movimentacao.js // Classe utilizada para representar uma roda class Wheel { var collider : WheelCollider; // Colisao da roda 8 Embora fuscas do mundo real tenham tração traseira, verificou-se um aumento significativo da estabilidade do veículo quando é aplicada a tração dianteira

191 189 ; var steer : Transform; // Objeto que sera girado pelo angulo da roda gerado pelo volante var wheel : Transform; // Parte grafica da roda var isbot : boolean = false; // Flag que determina se o carro pertence a um BOT, devendo ignorar as entradas do jogador var inclinacaolimite : float = 45; // Inclinacao limite que o carro pode chegar var inclinacao : float; // Inclinacao atual var velocidade : float; // Velocidade do corpo rigido associado ao carro, utilizada pelo script de IA var wheelfl : Wheel; // Roda Dianteira Esquerda (FL = Front Left) var wheelfr : Wheel; // Roda Dianteira Direita (FR = Front Right) var wheelrl : Wheel; // Roda Traseira Esquerda (RL = Rear Left) var wheelrr : Wheel; // Roda Traseira Direita (RR = Rear Right) var centerofmass : Transform; // Centro de massa do carro var velocitysensibility : float = ; // Velocidade minima para se dizer que o carro esta indo para alguma direcao especifica var steermax : float = 20; // Angulo maximo das rodas atual var steeratlowspeed : float = 20; // Angulo das rodas gerado pelo volante para baixas velocidade var lowspeed : float = 10; // Velocidade a partir da qual o angulo maximo das rodas comeca a decrescer var steerathighspeed : float = 5; // Angulo das rodas gerado pelo volante para altas velocidade var highspeed : float = 20; // Velocidade a partir da qual o angulo maximo das rodas para de decrescer var motormax : float = 40; // Torque maximo que se pode aplicar no motor var brakemax : float = 100; // Torque de frenagem maximo var steerspeed : float = 40; // Velocidade com que se varia o angulo da roda var steerreturnspeed : float = 100; // Velocidade com que a roda volta para a posicao inicial var steer : float = 0; // Entrada do usuario referente ao movimento da roda var forward : float = 0; // Entrada do usuario que representa desejo de ir para frente var back : float = 0; // Entrada do usuario que representa desejo de ir para tras private var motor : float = 0; // Controla quanto do torque sera aplicado no motor private var brake : float = 0; // Controla quanto do torque sera aplicado na frenagem private var reverse : boolean = false; // Flag que indica se o carro esta indo para tras private var last_pos : Vector3; // Ultima posicao do carro, utilizada para calcular a velocidade var EngineSound : AudioSource; // Som do motor do carro var TiresSound : AudioSource; // Som das rodas do carro derrapando var rpmmax : float = 500.0; // RPM maxima do motor, utilizada ao tocar o som do motor var minrpmfortires : float = 300; // RPM minima para o carro derrapar var minsteerfortires : float = 10; // Angulo minimo das rodas para o carro derrapar private var CantandoPneus : boolean = false; // Flag que indica se o carro esta derrapando private var TempoReducao = -10; // Tempo de reducao da velocidade do carro private var VelocidadeReduzida = false; // Flag que indica se a velocidade do carro foi reduzida private var motormaxold; // Potencia antiga do motor, sendo restaurada quando tempo de velocidade reduzida esgotar private var TempoReducaoM = -10; // Tempo de reducao da manobrabilidade do carro private var ManobraReduzida = false; // Flag que indica se a manobrabilidade do carro foi reduzida private var steerreduzidascale : float = 1; // Escala do ângulo máximo das rodas, sendo restauda quando o tempo de manobrabilidade reduzida esgotar function Start() { // Posiciona o centro de massa no local especificado pelo objeto centerofmass rigidbody.centerofmass = transform.inversetransformdirection(centerofmass.position)- transform.position;

192 190 steerreduzidascale = 1; // Como não foi acertado por tiro que reduz a manobrabilidade, a escala e 1 function CalculaAnguloSteer () { var velocidade : float = rigidbody.velocity.magnitude; if (velocidade <= lowspeed) steermax = steeratlowspeed; else if (velocidade >= highspeed) steermax = steerathighspeed; else { steermax = steeratlowspeed - (lowspeed-velocidade)/(highspeedlowspeed)*(steerathighspeed-steeratlowspeed); steermax *= steerreduzidascale; // Funcao chamada a cada calculo da engine de fisica function FixedUpdate () { CalculaAnguloSteer (); carro inclinacao = Vector3.Angle(Vector3(0,-1,0),-transform.up); // Determina a inclinacao atual do velocidade = rigidbody.velocity.sqrmagnitude; // Guarda a velocidade do corpo rigido associado ao carro // Pega as entradas do jogador se quem controla o carro nao for um BOT if (!isbot) { steer = Input.GetAxis("Rotacao"); // Coloca os valores referentes ao movimento linear no intervalo [0,1] forward = Mathf.Clamp(Input.GetAxis("Aceleracao"), 0, 1); back = -1 * Mathf.Clamp(Input.GetAxis("Aceleracao"), -1, 0); // Calcula a velocidade instantanea do carro para detectar se esta parado var vel : Vector3 = transform.inversetransformdirection(transform.positionlast_pos)*time.deltatime; last_pos = transform.position; // Atualiza a ultima posicao do carro // Testa a direcao do movimento if(vel.z > velocitysensibility) reverse = false; // Se a velocidade para frente e maior do que a sensibilidade, o carro nao esta indo para tras else if(vel.z < -velocitysensibility) reverse = true; // Se a velocidade para frente e menor do que o negativo da sensibilidade, o carro esta indo para tras else { // caso contrario determina atraves do desejo do controlador if (forward > 0) reverse = false; else reverse = true; // Determina os valores do motor e freio de acordo com a direcao do veiculo e o desejo do controlador if (inclinacao <= inclinacaolimite) { // Se esta dentro do limite de inclinacao if (reverse) { // Na direcao contraria, os freios possuem o mesmo vaor, mas o torque aplicado ao motor e invertido motor = -1 * back; brake = forward;

193 191 else { // Na direcao para frente, os freios possuem o mesmo vaor, mas o torque aplicado ao motor e positivo motor = forward; brake = back; else { // Caso esteja fora dos limites de inclinacao, desliga o carro motor = 0; brake = 0; // Fornece o torque e freio desejados igualmente as quatro rodas wheelrl.collider.motortorque = motormax * motor; wheelrr.collider.motortorque = motormax * motor; wheelfl.collider.motortorque = motormax * motor; wheelfr.collider.motortorque = motormax * motor; wheelrl.collider.braketorque = brakemax * brake; wheelrr.collider.braketorque = brakemax * brake; wheelfl.collider.braketorque = brakemax * brake; wheelfr.collider.braketorque = brakemax * brake; // Se nao se deseja mudar a angulacao das rodas, mas elas possuem angulo... if (steer == 0 && wheelfl.collider.steerangle!= 0) { if (Mathf.Abs(wheelFL.collider.steerAngle) <= (steerspeed * Time.deltaTime)) // Se o angulo atual e menor do que seria reduzido nesse passo, zera-o wheelfl.collider.steerangle = 0; // Reduz o angulo da roda de acordo com a direcao que ele tem e com a velocidade de retorno else if (wheelfl.collider.steerangle > 0) wheelfl.collider.steerangle = wheelfl.collider.steerangle - (steerreturnspeed * Time.deltaTime); else wheelfl.collider.steerangle = wheelfl.collider.steerangle + (steerreturnspeed * Time.deltaTime); else { // Se ha desejo de alterar a direcao das rodas do carro if ((steer < 0 && wheelfl.collider.steerangle > 0) (steer > 0 && wheelfl.collider.steerangle < 0)) // Se as rodas estao voltando a posicao inicial wheelfl.collider.steerangle = wheelfl.collider.steerangle + (steer * steerreturnspeed * Time.deltaTime); // Acrescenta-se o passo de acordo com a vontade do jogador e a velocidade de mudanca de direcao das rodas para voltar ao zero else wheelfl.collider.steerangle = wheelfl.collider.steerangle + (steer * steerspeed * Time.deltaTime); // Acrescenta-se o passo de acordo com a vontade do jogador e a velocidade de mudanca de direcao das rodas // Se ultrapassou os limites de angulo, limita ao valor maximo if (wheelfl.collider.steerangle > steermax) wheelfl.collider.steerangle = steermax; if (wheelfl.collider.steerangle < -steermax) wheelfl.collider.steerangle = -steermax; // Coloca o mesmo angulo nas duas rodas dianteiras wheelfr.collider.steerangle = wheelfl.collider.steerangle; // Utiliza o angulo determinado anteriormente para fazer o deslocamento da roda graficamente wheelfl.steer.localeulerangles.y = wheelfl.collider.steerangle; wheelfr.steer.localeulerangles.y = wheelfr.collider.steerangle;

194 192 function Update () { // Roda as rodas de acordo com a velocidade de rotacao wheelfl.wheel.rotate(wheelfl.collider.rpm * -6 * Time.deltaTime,0,0); wheelfr.wheel.rotate(wheelfl.collider.rpm * -6 * Time.deltaTime,0,0); wheelrr.wheel.rotate(wheelfl.collider.rpm * -6 * Time.deltaTime,0,0); wheelrl.wheel.rotate(wheelfl.collider.rpm * -6 * Time.deltaTime,0,0); // Controle do pitch de som // O pitch do som de motor vai variar entre 0.5 e 2 (0.5 é o carro parado, 2 é o carro no máximo de movimento) var rpmmedio : float = (wheelfl.collider.rpm + wheelfr.collider.rpm + wheelrl.collider.rpm + wheelrr.collider.rpm)/4; var angulo : float = wheelfr.collider.steerangle; if (angulo < 0) angulo=-1*angulo; EngineSound.pitch = *(Mathf.Abs(rpmMedio)/rpmMax); // Se as condicoes para que o carro derrape sao satisfeitas, toca-se o som correspondente e ativa a flag CantandoPneus, para evitar de tocar o som do inicio novamente // Se as condicoes nao sao satisfeitas e o carro estava derrapando, para o som de derrapagem e limpa a glag CantandoPneus if ((rpmmedio > minrpmfortires) && (angulo > minsteerfortires)){ if (CantandoPneus == false) { TiresSound.Play(); CantandoPneus = true; else{ if (CantandoPneus == true) { TiresSound.Pause(); CantandoPneus = false; // Se esta com a velocidade reduzida, chega-se se o tempo ja passou. Se sim, retorna a potencia do motor e limpa-se a flag correspondente if (VelocidadeReduzida) { if (Time.time > TempoReducao+10) { motormax = motormaxold; VelocidadeReduzida = false; // Se esta com a manobrabilidade reduzida, chega-se se o tempo ja passou. Se sim, retorna o angulo maximo das rodas e limpa-se a flag correspondente if (ManobraReduzida) { if (Time.time > TempoReducaoM+10) { steerreduzidascale = 1; ManobraReduzida = false; // Reducao da velocidade (atraves do torque) e da manobrabilidade (atraves do angulo das rodas) do carro, caso tenha sido acertado pela arma especial // Essas funcoes sao chamadas pelo script da arma para reduzir a controlabilidade do carro function ReduzirVelocidade (ReduzVelocidade) { if (VelocidadeReduzida == false) { motormaxold = motormax; motormax = motormax - ReduzVelocidade;

195 193 TempoReducao = Time.time; VelocidadeReduzida = true; function ReduzirManobra (ReduzManobra : float) { if (ManobraReduzida == false) { steerreduzidascale = (steeratlowspeed-reduzmanobra)/steeratlowspeed; TempoReducaoM = Time.time; ManobraReduzida = true; 9.3. Controle de Jogo No subdiretório Controle de Jogo, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo, encontram-se os scripts que implementam os códigos e funções responsáveis pelo controle de algumas regras e do fluxo do jogo. Estes scripts e seus códigos serão descritos a seguir: AtivarMenu2.js O script AtivarMenu2.js (ver Quadro 13), vinculado ao objeto juiz, tem como função verificar quando o jogador pressiona a tecla p. Quando esta ação é realizada, o jogo é pausado, o script Menu2.js (ver Quadro 30) é ativado para a visualização do Menu da fase e o script HideCursor.js (ver Quadro 22) para esconder o cursor durante o jogo é desabilitado, permitindo que o jogador clique nas opções mostradas. Quadro 13 - Script contido no arquivo AtivarMenu2.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo/AtivarMenu2.js var Listener : AudioListener= null; function Update () { if(input.getkeydown("p")) { //pause the game Time.timeScale = 0; Listener.pause = true; //show the pause menu var script1 = GetComponent("Menu2");

196 194 script1.enabled = true; var script2 = GetComponent("HideCursor"); script2.enabled = false; ControleRanking.js No script ControleRanking.js (ver Quadro 14), são implementadas as funções para salvar e carregar o ranking do jogo e desenhar o mesmo na cena Ranking (ver sub-sessão 8 deste anexo). O script inicia com a Função Awake(), a qual carrega os dados do ranking que estiverem salvos nas variáveis de controle do mesmo, soma a pontuação obtida pelo jogador nas quatro fases do jogo e verifica se este se encaixa entre os três primeiros colocados. Caso isto aconteça, o script Ranking.js (ver Quadro 23) é ativado. Este tem como objetivo apenas pegar uma string que será digitada pelo jogador para ser salvo junto com sua pontuação e carregar o valor true para a variável carregarranking. Assim, este script é desabilitado, as variáveis de controle do ranking são atualizadas através da função AtualizarRanking(), estes novos valores são salvos no arquivo de texto Pontuacao.txt, presente no diretório Survivors/Assets/Assets Survivors/SaveGame, e o novo ranking é desenhado na tela. Quadro 14 - Script contido no arquivo ControleRanking.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo/ControleRanking.js import System; import System.IO; import System.Text; // Variáveis para ler/escrever txt private var _FileLocation : String=Application.dataPath+"\\Assets Survivors\\SaveGame"; private var _FileName : String="Pontuacao.txt"; // Salvar pontução de cada fase // Alterados no script Juiz de cada fase após o término da mesma public static var pontfase1:int = 0; public static var pontfase2:int = 0; public static var pontfase3:int = 0; public static var pontfase4:int = 0; // True apenas na cena para mostrar o ranking var mostrarranking:boolean;

197 195 // Skin para mudar a fonte dos textos var newskin : GUISkin; // Variáveis para controle de ranking /// Variáveis salvas no arquivo Pontuacao.txt private static var pri:string=""; private static var seg:string=""; private static var ter:string=""; /// Valor das pontuacões salvas no arquivo de texto private var prip:int=0; private var segp:int=0; private var terp:int=0; /// Variáveis para controle da pontuacao do usuário public static var ponttotal:int; /// Jogador entre com nome caso a pontuação seja maior que a pontuação do terceiro colocado (que está salvo no arquivo de texto) public static var nomejogador:string; /// Colocação do jogador var colocacao:int; //0 = pontos < terceiro ; 1 = pontos > primeiro ; 2 = primeiro < pontos > segundo ; 3 = segundo < pontos > terceiro public static var carregarranking:boolean; private var atualizar:boolean = true; private var terminou:boolean = false; function SomaPontuacao(){ ponttotal = pontfase1 + pontfase2 + pontfase3 + pontfase4; function Update(){ // Carrega o inicio do jogo if(input.getkeydown("return") && terminou) { Application.LoadLevel(0); function Awake(){ if(mostrarranking) { CarregarRanking(); SomaPontuacao(); VerificarRanking(); if(colocacao!= 0) { // script para pegar o que o jogador digitar!!! Colocar na initerface var script = GetComponent("Ranking"); script.enabled = true; function OnGUI () { GUI.skin = newskin; if(carregarranking) { var script = GetComponent("Ranking"); script.enabled = false;

198 196 if (atualizar) { atualizar = false; AtualizarRanking(); SalvarRanking(); DesenharRanking(); terminou = true; // Desenha os labels do ranking function DesenharRanking(){ // Carregar pontuação GUI.Label(Rect(30,160,500,150), pri); GUI.Label(Rect(30,300,500,150), seg); GUI.Label(Rect(30,440,500,150), ter); GUI.Label(Rect(600,160,500,150), prip + ""); GUI.Label(Rect(600,300,500,150), segp + ""); GUI.Label(Rect(600,440,500,150), terp + ""); // Le o arquivo Pontucao.txt e carrega os valores nas variáveis de controle do ranking function CarregarRanking(){ var r : StreamReader; r= File.OpenText(_FileLocation+"/"+ _FileName); var _info : String = r.readtoend(); r.close(); pontuacao=_info; var pontuacoessalvas = pontuacao.split("#"[0]); for(var n = 0; n < pontuacoessalvas.length-1; n++) { var objeto = pontuacoessalvas[n].split(";"[0]); if(n == 0) { pri = objeto[0]; prip = int.parse(objeto[1]); else if(n == 1) { seg = objeto[0]; segp = int.parse(objeto[1]); else if(n == 2) { ter = objeto[0]; terp = int.parse(objeto[1]); // Verifica qual a colocacao do jogador e atualiza a variável colocacao function VerificarRanking(){ if(ponttotal >= terp && ponttotal < segp) { colocacao = 3; else if(ponttotal >= segp && ponttotal < prip) {

199 197 colocacao = 2; else if(ponttotal >= prip) { colocacao = 1; else if(ponttotal < terp) { colocacao = 0; // Atualiza os valores das variáveis de controle do ranking de acordo com a colocacao do jogador function AtualizarRanking(){ if(colocacao == 1) { terp = segp; ter = seg; segp = prip; seg = pri; prip = ponttotal; pri = nomejogador; else if(colocacao == 2) { terp = segp; ter = seg; segp = ponttotal; seg = nomejogador; else if(colocacao == 3) { terp = ponttotal; ter = nomejogador; // Salva o novo ranking no arquivo Pontuacao.txt function SalvarRanking(){ //aaa;30#bbb;20#ccc;10# // Grava novo ranking var novoranking = pri+";"+prip+"#"+seg+";"+segp+"#"+ter+";"+terp+"#"; //print(novoranking); var writer : StreamWriter; var t : FileInfo = new FileInfo(_FileLocation+"/"+ _FileName); if(!t.exists) { writer = t.createtext(); else { t.delete(); writer = t.createtext(); //print(novoranking); writer.write(novoranking); writer.close();

200 198 Instanciador.js O script Instanciador.js (ver Quadro 15) trata-se de um script que, a cada intervalo de tempo pré-determinado, instancia um novo objeto em uma posição aleatória escolhida em uma região pré-definida. Esta região é ajustável de modo a evitar que os itens surjam somente em locais acessíveis aos jogadores. Para realizar este controle, o array posicaoinicial, deve conter as coordenadas que indicam a posição inicial de onde os itens podem surgir. Desta forma, o Instanciador.js gera posições somente dentro do retângulo limitado pela posição inicial (em X e Z) e pela dimensão do mapa subtraindo-se a posição inicial (em X e Z). A coordenada Y, que corresponde à altura a qual o item irá surgir, é fixada no valor 120. Outro fator que é levado em consideração neste script, são possíveis regiões inacessíveis no interior do mapa. Este controle é realizado através do booleano evitarregiao, que quando é marcado como true faz com que uma região delimitada pelo array evitar, que possui quatro posições, representando as coordenadas de delimitação (xinicial, xfinal, zinicial e zfinal). Quadro 15 - Script contido no arquivo Instanciador.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo/Instanciador.js var TempoEntreInstancias = 1; var CoisaParaInstanciar : Rigidbody; var dimmapa : int[]; var posicaoinicial : int[]; var evitarregiao = true; //indica se o Instanciador deve evitar uma região do mapa var evitar : int[]; //indica a região a ser evitada //evitar[0] = xinicial; //evitar[1] = xfinal; //evitar[2] = zinicial; //evitar[3] = zfinal; private var UltimaInstancia = 0; function Start() { UltimaInstancia = Time.time; function Update() { if (Time.time > UltimaInstancia+TempoEntreInstancias) { UltimaInstancia = Time.time; //Gera uma posição para a instância var posicao = Vector3(posicaoInicial[0], 0, posicaoinicial[1]) + Vector3((Random.value*(dimMapa[0]-posicaoInicial[0]*2)),120,(Random.value*(dimMapa[1]- posicaoinicial[1]*2)));

201 199 if (evitarregiao){ //Se deve evitar uma região, verifica se a posição está contida na região a ser evitada if ((posicao[0] > evitar[0] && posicao[0] < evitar[1]) && (posicao[2] > evitar[2] && posicao[2] < evitar[3])){ //Se está na região a ser evitada, gera uma nova posição no eixo X em local permitido var random = Random.value; // define se a nova posição será no começo ou no fim do mapa no eixo X (50% de chances para cada lado) if (random*2 > 1){ //Nova posição em X no começo do mapa posicao[0] = Random.value*evitar[0]; if (posicao[0] < posicaoinicial[0]) posicao[0] += posicaoinicial[0]; else{ //Nova posição em X no final do mapa posicao[0] = dimmapa[0]-random.value*(dimmapa[0]- evitar[1]); if (posicao[0] > dimmapa[0]-posicaoinicial[0]) posicao[0] -= posicaoinicial[0]; //Se está na região a ser evitada, gera uma nova posição no eixo Z em local permitido random = Random.value; // define se a nova posição será no começo ou no fim do mapa no eixo Z (50% de chances para cada lado) if(random*2 > 1){ //Nova posição em Z no começo do mapa posicao[2] = Random.value*evitar[2]; if (posicao[2] < posicaoinicial[1]) posicao[2] += posicaoinicial[1]; else{ //Nova posição em Z no final do mapa posicao[2] = dimmapa[1]-random.value*(dimmapa[1]- evitar[3]); if (posicao[2] > dimmapa[1]-posicaoinicial[1]) posicao[2] -= posicaoinicial[1]; //Instancia o novo item na posição gerada var instantiateditem : Rigidbody = Instantiate (CoisaParaInstanciar, posicao, transform.rotation); Juiz.js Em Survivors, a cada fase é instanciado um objeto juiz. Cada jogador inimigo é construído de forma que informa ao objeto juiz quando é criado e quando é destruído. Assim, o juiz possui a informação de quantos inimigos restam no jogo. Caso não reste nenhum inimigo, as providências para vitória são tomadas.

202 200 Nesta versão, trata-se de instanciar um objeto troféu no cenário, que deverá ser coletado pelo jogador, além de informar ao carro do jogador para que a música seja comutada para música de vitória. O código computacional relacionado a essa funcionalidade se encontra no script Juiz.js (ver Quadro 16). Ao coletar o troféu, o jogador passa para a próxima fase. O juiz é também responsável por calcular a pontuação do jogador. Para isso, possui diversas funções que contam o número de itens coletados, tiros disparados, tiros certeiros, inimigos derrotados pelo jogador e distância percorrida. A pontuação calculada é mostrada na tela por funções descritas no Seção 5. As providências para derrota, nesta versão, são tomadas pelo próprio controlador de vida do personagem principal. Caso ele seja destruído, como já visto no script ControledeVida.js (ver Quadro 10), a música do jogo é comutada para a música de derrota e o carro flutua por dez segundos, até que a fase é reiniciada. Quadro 16 - Script contido no arquivo Juiz.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo/Juiz.js private var TempoInicial; var PersonagemPrincipal : GameObject; // Variaveis relacionadas a contagem de pontos var currpos : Vector3; var NumInimigos = 0; var ItensColetados = 0; var InimigosMortos = 0; var Tiros=0; var Acertos=0; var mandados : float = 0.0; var fase : int; // Fatores de ponderacao relacionadas a contagem de pontos var Pontos_ItensColetados : float = 50.0; var Pontos_Tiros : float = 10.00; var Pontos_InimigosMortos : float = 1500; var Pontos_mRodados : float = 0.1; var Pontos_Tempo_Inicial : float = ; var Pontos_Tempo_Passado : float = -100; var Pontos_Vida : float = 100; var Pontos_Conclusao : float = 2000; var vida : int = 100; var PontosTotal : float = 0; var CoisaParaInstanciar : Rigidbody;

203 201 var Terminou = false; var Derrotado = false; function Start() { TempoInicial = Time.time; currpos = PersonagemPrincipal.transform.position; function ModificaVida(NovaVida) { vida = NovaVida; function ContarPontos() { // Calcula numero total de pontos if (Tiros>0) { PorcentagemTiros = Acertos/Tiros; else { PorcentagemTiros = 0; var TempoPassado : float = (Time.time-TempoInicial)/60; PontosTotal = vida*pontos_vida + Pontos_Tempo_Inicial + TempoPassado*Pontos_Tempo_Passado + Pontos_ItensColetados * ItensColetados + Pontos_Tiros*PorcentagemTiros + InimigosMortos * Pontos_InimigosMortos + mandados * Pontos_mRodados; function Update() { if (Time.time > TempoInicial + 3) { if (NumInimigos<=0) { // Verifica condicao de vitoria if (Terminou == false) { PontosTotal = PontosTotal + Pontos_Conclusao; PersonagemPrincipal.gameObject.SendMessageUpwards("RadioVitoria"); ), transform.rotation); ), transform.rotation); //Cria o Trofeu da vitoria var trofeu : Rigidbody; if (fase == 3){ trofeu = Instantiate (CoisaParaInstanciar, transform.position+vector3( , ,- else{ trofeu = Instantiate (CoisaParaInstanciar, transform.position+vector3( , ,- if(fase == 1) { GameObject.Find("Juiz").GetComponent("ControleRanking").pontFase1 = PontosTotal; print(gameobject.find("juiz").getcomponent("controleranking").pontfase1); else if(fase == 2) { GameObject.Find("Juiz").GetComponent("ControleRanking").pontFase2 = PontosTotal;

204 202 else if(fase == 3) { GameObject.Find("Juiz").GetComponent("ControleRanking").pontFase3 = PontosTotal; else if(fase == 4) { GameObject.Find("Juiz").GetComponent("ControleRanking").pontFase4 = PontosTotal; Terminou = true; // Contagem de distância percorrida var newpos : Vector3 = PersonagemPrincipal.transform.position; mandados = mandados + (newpos-currpos).magnitude; currpos = newpos; // Contagem de pontos if (Terminou==false) { ContarPontos(); function ModInimigo(n) { // Modificar numero de inimigos NumInimigos = NumInimigos + n; function JogadorMatou() { // Determina que jogador matou um inimigo InimigosMortos=InimigosMortos+1; function Derrota() { // Determina que jogo terminou com derrota do jogador Derrotado = true; Terminou = true; function Atirar() { // Conta o numero de tiros do jogador Tiros = Tiros+1; function Acertar() { // Conta o numero de tiros certeiros do jogador Acertos = Acertos+1; function ColetouItem() { // Conta o numero de itens coletados pelo jogador print("coletouitem"); ItensColetados = ItensColetados+1;

205 203 RankingInicio.js O script RankingInicio.js (ver Quadro 17) tem como objetivo instanciar os textos 3D na cena Menu Inicial com os nomes e pontuações que estiverem salvas no arquivo de texto Pontuacao.txt, o qual pode ser encontrado no diretório cujo caminho a partir da raiz do projeto é Survivors/Assets/Assets Survivors/SaveGame. Ele possui três funções básicas: Start(), Update() e CarregarRanking(). A primeira função é responsável pelo carregamento dos valores salvos dos três primeiros colocados do jogo e armazenamento destes valores nas variáveis de controle do ranking (ver código do script), utilizando para isto a função CarregarRanking() (ver script ControleRanking.js). A função Update() é utilizada para instanciar novos textos 3D na área definida para visualização do ranking na fase Menu Inicial, de acordo com os valores lidos anteriormente. Quadro 17 - Script contido no arquivo RankingInicio.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo/RankingInicio.js import System; import System.IO; import System.Text; // Variáveis para ler/escrever txt private var _FileLocation : String=Application.dataPath+"\\Assets Survivors\\SaveGame"; private var _FileName : String="Pontuacao.txt"; // Variáveis para controle de ranking /// Variáveis salvas no arquivo Pontuacao.txt private static var pri:string=""; private static var seg:string=""; private static var ter:string=""; /// Valor das pontuacões salvas no arquivo de texto private var prip:int=0; private var segp:int=0; private var terp:int=0; // Carrega o ranking salvo function Start(){ CarregarRanking(); // Atualiza o texto 3D de acordo com o ranking carregado function Update(){ var primeiro : TextMesh = Instantiate (GameObject.Find("Primeiro").GetComponent(TextMesh)); primeiro.text = pri;

206 204 var temp = GameObject.Find("Primeiro"); temp.active = false; var segundo : TextMesh = Instantiate (GameObject.Find("Segundo").GetComponent(TextMesh)); segundo.text = seg; temp = GameObject.Find("Segundo"); temp.active = false; var terceiro : TextMesh = Instantiate (GameObject.Find("Terceiro").GetComponent(TextMesh)); terceiro.text = ter; print(ter); temp = GameObject.Find("Terceiro"); temp.active = false; var primeirop : TextMesh = Instantiate (GameObject.Find("PrimeiroPont").GetComponent(TextMesh)); primeirop.text = prip + ""; temp = GameObject.Find("PrimeiroPont"); temp.active = false; var segundop : TextMesh = Instantiate (GameObject.Find("SegundoPont").GetComponent(TextMesh)); segundop.text = segp + ""; temp = GameObject.Find("SegundoPont"); temp.active = false; var terceirop : TextMesh = Instantiate (GameObject.Find("TerceiroPont").GetComponent(TextMesh)); terceirop.text = terp + ""; temp = GameObject.Find("TerceiroPont"); temp.active = false; // Le o arquivo Pontucao.txt e carrega os valores nas variáveis de controle do ranking function CarregarRanking(){ var r : StreamReader; r= File.OpenText(_FileLocation+"/"+ _FileName); var _info : String = r.readtoend(); r.close(); pontuacao=_info; var pontuacoessalvas = pontuacao.split("#"[0]); for(var n = 0; n < pontuacoessalvas.length-1; n++) { var objeto = pontuacoessalvas[n].split(";"[0]); if(n == 0) { pri = objeto[0]; prip = int.parse(objeto[1]); else if(n == 1) { seg = objeto[0]; segp = int.parse(objeto[1]); else if(n == 2) { ter = objeto[0];

207 205 terp = int.parse(objeto[1]); Restart.js O script Restart.js (ver Quadro 18) é um script auxiliar que vincula pressionar a tecla R com a ação de reiniciar a fase. É voltado principalmente às versões de teste do jogo, para agilizando etapas de depuração. Quadro 18 - Script contido no arquivo Restart.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo/Restart.js function Update() { if(input.getkeydown("escape")) { // Botao sair Application.Quit(); print("saindo"); if(input.getkeydown("r")) { // Botao reiniciar Application.LoadLevel(Application.loadedLevel); SaveGame.js Através do script SaveGame.js (ver Quadro 19), Survivors permite o salvamento do estado do jogo a qualquer momento ao longo das fases. É possível também carregar esses jogos salvos a qualquer momento. É possível salvar até três jogos distintos, cada um em um slot em particular, sendo que cada jogo fica armazenado em arquivos distintos gravados em disco. As funções básicas do script de save game são: SaveGame() e LoadGame(). A função SaveGame() tem duas versões, a versão com parâmetro e a sem parâmetro. A versão sem parâmetro assume o slot de salvamento como

208 206 sendo o primeiro slot, enquanto que a versão com parâmetro recebe o slot desejado para ser efetuado o salvamento. Salvar em um determinado slot significa selecionar o arquivo de texto em disco que será o destino da string de salvamento. Assim que o slot de salvamento é definido, aciona-se a função Salvar(), que efetua o salvamento de fato. A função Salvar() cria uma string de texto contendo as informações dos objetos da cena que devem ser armazenados para futuro carregamento. Os objetos de interesse são os seguintes: Carros : Referente tanto aos carros inimigos quanto ao carro do jogador Projéteis: Todos os projéteis da cena, que são diferêntes para cada fase Armas: Cubos que recarregam as armas dos carros Medkits: Cubos que recarregam as vidas dos carros Troféu: Troféu de vitória Juiz: Elemento que realiza a organização do jogo Nota: Devido à escassez de documentação referente ao uso de XML para este ambiente em específico optou-se por implementar o save game por meio do uso de strings de texto. O estado de cada objeto a ser salvo é diferente pois cada objeto da cena requer um tratamento específico. Os carros, cubos e projéteis, por exemplo, requerem o armazenamento de suas posições, rotações e velocidades no espaço. Já o juiz, sendo uma entidade que não interage fisicamente com outros objetos na cena, não requer o armazenamento dos atributos acima citados. Todas as informações salvas podem ser vistas no código comentado presente no Quadro 19. A função LoadGame(), assim como a sua contraparte de salvamento, possui tanto uma versão que recebe parâmetros para o slot desejado quanto uma versão que assume o slot desejado como sendo o primeiro. Assim que é definido o slot de salvamento, aciona-se a função Carregar() que efetua o carregamento do estado do jogo de fato.

209 207 Devido à forma como o ambiente Unity3D é organizado, ao invés de se carregar cada objeto individualmente optou-se por carregar a fase inteira como se esta estivesse sendo carregada pela primeira vez. Isso facilita o processo de carregamento, pois ao se proceder desta forma toda a estrutura hierárquica dos carros já começa pronta, dispensando assim a necessidade de se fazer estas ligações entre os muitos componentes que constituem os carros. A forma escolhida para implementar o procedimento acima citado foi guardar a informação de que o carregamento deve ser efetuado, bem como o carregamento de qual fase em específico, em um arquivo em disco. Mais detalhes podem ser vistos nas funções carregueporfavor() e naocarregueporfavor(), que polidamente agendam o carregamento de uma fase específica ou desmarcam tal carregamento respectivamente. Quadro 19 - Script contido no arquivo SaveGame.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo/SaveGame.js // // Script para o salvamento e carregamento do jogo // //Import de bibliotecas necessárias import System; import System.IO; import System.Text; //Variáveis para manipulação de arquivos private var _FileLocation : String; private var _FileName : String="SaveData1.txt"; //Variáveis para os botões de seleção private var _Save : Rect; private var _SaveSlot : Rect; private var _Load : Rect; var vida:int; //Variável temporária para armazenamento da vida dos carros var pontuacao=""; // Variável temporária para armazenamento da pontuação do carro var danos=""; //Variável temporária para armazenamento dos danos var slotatual:int=1; //Registro do slot de save/load a ser utilizado no momento var carregueagora:boolean=true; //Variável de controle para o carregamento do jogo no inicio da fase var carroscarregados=""; // Cria uma lista dos carros já carregados para verificar se algum da cena deve ser deletado private var estadodojogo=""; //Esta string armazena o estado do jogo para salvamento e carregamento

210 208 //Variáveis para lidar com objetos e gameobjects var juiz : GameObject; var ProjetilBasica : Rigidbody; var ProjetilMina : Rigidbody; var ProjetilEspecial : Rigidbody; var CuboMedkit: Rigidbody; var CuboGelo: Rigidbody; var CuboMina: Rigidbody; var CuboMissil: Rigidbody; var CuboAbacaxi: Rigidbody; var Trofeu:Rigidbody; public static var dificuldade:int; //Armazena o nível de dificuldade do jogo public static var precisocarregar:int=-1;//armazena a necessidade de carregar e, caso positivo, de qual slot function Awake () { // Define os retângulos para os botões de seleção _Save=new Rect(Screen.width / 2-100, 150, 180, 40);//(40,120,100,20); _Load=new Rect(Screen.width / 2-100, 200, 180, 40);//(40,140,100,20); _SaveSlot=new Rect(Screen.width / 2-100, 100, 180, 40);//(40,100,100,20); if (Application.loadedLevel==1){//Importante garantir que está é a fase inicial no build precisocarregar = -1; //Define que não está em modo de carregamento na fase inicial //Caminho para o savegame _FileLocation= Application.dataPath+"\\Assets Survivors\\SaveGame"; function Start () { carregueagora=true; //Marca que o carregamento deve ser feito function Update () { //Verifica se pode fazer o carregamento, se puder ele faz uma única vez if(carregueagora==true){ carregueagora=false; if(devocarregar()){ naocarregueporfavor(); //Registra que no futuro o carregamento não deve ser feito Carregar(); //Carrega o estado do jogo function LoadGame(slot:int){ //Esta função tem como entrada o slot a partir do qual deve ser feito o carregamento //Com base no slot desejado, modifica-se o arquivo txt de salvamento switch (slot) { case 1: _FileName = "SaveData1.txt"; break; case 2: _FileName = "SaveData2.txt"; break;

211 209 case 3: _FileName = "SaveData3.txt"; break; default : break; if(slotexiste()==true){ carregueporfavor();//marca que o carregamento deve ser feito no futuro Application.LoadLevel(levelQueDeveSerCarregado()); //Recarrega a fase desejada else{ print("este slot não possui um jogo salvo."); function LoadGame(){ //Esta função carrega o jogo como a função LoadGame(int), com a diferença que ela assume o slot1 como o desejado _FileName = "SaveData1.txt"; if(slotexiste()==true){ carregueporfavor();//marca que o carregamento deve ser feito no futuro Application.LoadLevel(levelQueDeveSerCarregado()); //Recarrega a fase desejada else{ print("slot vazio."); function slotexiste(){ //Verifica se o slotatual existe var writer : StreamWriter; var t : FileInfo = new FileInfo(_FileLocation+"/"+ _FileName); if(!t.exists) { return false; else { return true; writer.close(); function SaveGame(slot:int){ //Esta função salva o jogo no slot desejado, selecionado pela variável de entrada "slot" switch (slot) { case 1: _FileName = "SaveData1.txt"; break; case 2: _FileName = "SaveData2.txt"; break; case 3: _FileName = "SaveData3.txt"; break; default : break; Salvar();//Salva o estado do jogo

212 210 function SaveGame(){ //Esta função salva o jogo, assumindo que o slot desejado é o 1 _FileName = "SaveData1.txt"; Salvar();//Salva o estado do jogo var mostrarmenureserva:boolean=false; var arm:int=0; var Listener : AudioListener= null; function OnGUI() { // Esta função recebe os comandos de salvamento ou carregamento pelos botões do menu switch (_FileName) //Define a variável slotatual de acordo com o arquivo de savegame sendo utilizado { case "SaveData1.txt": slotatual = 1; break; case "SaveData2.txt": slotatual = 2; break; case "SaveData3.txt": slotatual = 3; break; default : break; if(mostrarmenureserva==true){ Time.timeScale = 0; Listener.pause = true; GUI.Box(Rect(Screen.width / 2-150, 50, 300, 300), ""); if (GUI.Button(_SaveSlot,"Slot: "+slotatual)) { switch (slotatual) //Permite mudar o slot desejado { case 1: _FileName = "SaveData2.txt"; break; case 2: _FileName = "SaveData3.txt"; break; case 3: _FileName = "SaveData1.txt"; break; default : break; if (GUI.Button(_Save,"Save")) { GetComponent("Menu2").Listener.pause = false; Time.timeScale = 1.0; mostrarmenureserva=false; SaveGame(slotAtual); //Salva o jogo no slot desejado if (GUI.Button(_Load,"Load")) { mostrarmenureserva=false; Time.timeScale = 1.0; LoadGame(slotAtual); //Carrega o jogo do slot desejado

213 211 if (Input.GetKeyDown ("s")) { if (arm==4){ if(mostrarmenureserva==true){ mostrarmenureserva=false; // print(mostrarmenureserva); else{ mostrarmenureserva=true; // print(mostrarmenureserva); arm=0; else{ arm=arm+1; if (Input.GetKeyDown ("g")) { Time.timeScale = 1.0; function Salvar(){ //Gravar tudo em um arquivo com uma string contendo o estado dos objetos var estadodojogo=application.loadedlevel+"#"; // A string começa com a fase a ser salva //Armazena os estados de todos os carros var carros = GameObject.FindGameObjectsWithTag ("Carro"); parte +";"+ +";"+ for (var carro in carros) { //O controle de vida do player e dos bots é diferente, e precisam ser tratados à if(carro.getcomponent("movimentacao").isbot==false){ vida = carro.getcomponent("controledevida").vida; pontuacao= ";"+ GameObject.Find("Juiz").GetComponent("Juiz").ItensColetados+";"+ GameObject.Find("Juiz").GetComponent("Juiz").Tiros+";"+ GameObject.Find("Juiz").GetComponent("Juiz").Acertos+";"+ GameObject.Find("Juiz").GetComponent("Juiz").InimigosMortos else{ GameObject.Find("Juiz").GetComponent("Juiz").mAndados ; vida = carro.getcomponent("controledevidainimigos").vida; if(carro.getcomponent("movimentacao").isbot==false){ vida = carro.getcomponent("controledevida").vida; pontuacao= ";"+ GameObject.Find("Juiz").GetComponent("Juiz").ItensColetados+";"+ GameObject.Find("Juiz").GetComponent("Juiz").Tiros+";"+ GameObject.Find("Juiz").GetComponent("Juiz").Acertos+";"+ GameObject.Find("Juiz").GetComponent("Juiz").InimigosMortos GameObject.Find("Juiz").GetComponent("Juiz").mAndados ; else{

214 212 vida = carro.getcomponent("controledevidainimigos").vida; pontuacao=""; danos=""; var registrodedanos=carro.find("controlador").getcomponent("ia_astar").danos; for(var regdano in registrodedanos) {//Salva os danos referentes ao script de A* danos=regdano.origem+","+regdano.quantidade+","+danos; danos=";"+danos.substring(0,danos.length-1); //Acumula as informações sobre este carro na string de salvamento estadodojogo=estadodojogo+ //Nome do carro carro.name+";"+ //Tag do carro carro.tag+";"+ //Posição no espaço carro.transform.position.x+ ";"+ carro.transform.position.y+ ";"+ carro.transform.position.z+ ";"+ //Rotação em quaternions carro.transform.rotation.x+";"+ carro.transform.rotation.y+";"+ carro.transform.rotation.z+";"+ carro.transform.rotation.w+";"+ //Velocidade carro.rigidbody.velocity.x+";"+ carro.rigidbody.velocity.y+";"+ carro.rigidbody.velocity.z +";"+ //Vida do carro vida+";"+ //Arma utilizada carro.find("atirador").getcomponent("arma").armaativa+";"+ //? //Munições carro.find("atirador").getcomponent("arma").municaoespecial+";"+ carro.find("atirador").getcomponent("arma").municaomina; //Pontuação ou danos estadodojogo=estadodojogo+pontuacao+danos; estadodojogo=estadodojogo+"#"; //Armazena os estados dos projeteis var projeteis = GameObject.FindGameObjectsWithTag("Projetil"); if(projeteis!=null){ for (var projetil in projeteis) { estadodojogo=estadodojogo+ projetil.name+";"+ projetil.tag+";"+ //Posição no espaço projetil.transform.position.x+ ";"+ projetil.transform.position.y+ ";"+ projetil.transform.position.z+ ";"+ //Rotação em quaternions projetil.transform.rotation.x+";"+

215 213 projetil.transform.rotation.y+";"+ projetil.transform.rotation.z+";"+ projetil.transform.rotation.w+";"+ //Velocidade projetil.rigidbody.velocity.x+";"+ projetil.rigidbody.velocity.y+";"+ projetil.rigidbody.velocity.z+";"+ //Tempo desde o lançamento projetil.getcomponent("projetil").tempoinicio+ ";"+ //Origem do jogador projetil.getcomponent("projetil").origemjogador+ ";"+ //Registra se é mina projetil.getcomponent("projetil").soumina; estadodojogo=estadodojogo+"#"; //Armazena os estados dos itens var armas = GameObject.FindGameObjectsWithTag("Arma"); if(armas!=null){ for (var arma in armas) { estadodojogo=estadodojogo+ arma.name+";"+ arma.tag+";"+ //Posição no espaço arma.transform.position.x+ ";"+ arma.transform.position.y+ ";"+ arma.transform.position.z+ ";"+ //Rotação em quaternions arma.transform.rotation.x+";"+ arma.transform.rotation.y+";"+ arma.transform.rotation.z+";"+ arma.transform.rotation.w+";"+ //Velocidade arma.rigidbody.velocity.x+";"+ arma.rigidbody.velocity.y+";"+ arma.rigidbody.velocity.z; estadodojogo=estadodojogo+"#"; var medkits = GameObject.FindGameObjectsWithTag("MedKit"); if(medkits!=null){ for (var medkit in medkits) { estadodojogo=estadodojogo+ medkit.name+";"+ medkit.tag+";"+ //Posição no espaço medkit.transform.position.x+ ";"+ medkit.transform.position.y+ ";"+ medkit.transform.position.z+ ";"+ //Rotação em quaternions medkit.transform.rotation.x+";"+

216 214 medkit.transform.rotation.y+";"+ medkit.transform.rotation.z+";"+ medkit.transform.rotation.w+";"+ //Velocidade medkit.rigidbody.velocity.x+";"+ medkit.rigidbody.velocity.y+";"+ medkit.rigidbody.velocity.z; estadodojogo=estadodojogo+"#"; var trofeu = GameObject.Find("Trophy(Clone)"); if(trofeu!=null){ estadodojogo=estadodojogo+ trofeu.name+";"+ trofeu.tag+";"+ //Posição no espaço trofeu.transform.position.x+ ";"+ trofeu.transform.position.y+ ";"+ trofeu.transform.position.z+ ";"+ //Rotação em quaternions trofeu.transform.rotation.x+";"+ trofeu.transform.rotation.y+";"+ trofeu.transform.rotation.z+";"+ trofeu.transform.rotation.w+";"+ //Velocidade trofeu.rigidbody.velocity.x+";"+ trofeu.rigidbody.velocity.y+";"+ trofeu.rigidbody.velocity.z; estadodojogo=estadodojogo+"#"; // Grava o estado do jogo var writer : StreamWriter; var t : FileInfo = new FileInfo(_FileLocation+"/"+ _FileName); if(!t.exists) { writer = t.createtext(); else { t.delete(); writer = t.createtext(); writer.write(estadodojogo); writer.close(); function Carregar(){ //Ler o arquivo de save e aplica o estado lido ao jogo carregado var vidaloaded:int; //VAriável temporária que guarda a vida carregada //Variáveis para manipulação de arquivos var r : StreamReader; r= File.OpenText(_FileLocation+"/"+ _FileName); var _info : String = r.readtoend(); r.close(); estadodojogo=_info;//guarda em estadodojogo todo o estado do jogo a ser carregado //Colocar todos os objetos a serem criados em seus devidos lugares e estados

217 215 var objetoscarregados = estadodojogo.split("#"[0]); for(var n = 1; n < objetoscarregados.length-1; n++)// n começa em 1 pois a posição zero guarda a fase { var estadoobjeto=objetoscarregados[n].split(";"[0]); var tagdoobjeto=estadoobjeto[1]; //Variável temporária para armazenad a tag deste objeto switch (tagdoobjeto) {//Dependendo do tipo de objeto, é preciso carregá-lo de uma maneira diferente case "Carro": carregarcarros(objetoscarregados[n]); break; case "Projetil": carregarprojeteis(objetoscarregados[n]); break; case "Arma": carregaritens(objetoscarregados[n]); break; case "MedKit": carregaritens(objetoscarregados[n]); break; case "Trofeu": carregaritens(objetoscarregados[n]); break; default : break; eliminacarrosextras(); //Como a fase foi reinicializada do zero, pode haver carros a mais que o correto que precisam ser eliminados function carregaritens(objeto){ //Esta função é responsável por carregar objetos do tipo Itens, que são tanto as armas quanto os medkits e o troféu var estadodesteitem=objeto.split(";"[0]); var instantiateditem : Rigidbody; //Variável temporária para acessar o objeto e suas variáveis //Carrega as posições var posicao:vector3; posicao.x= float.parse(estadodesteitem[2]); posicao.y= float.parse(estadodesteitem[3]); posicao.z= float.parse(estadodesteitem[4]); //Carrega as orientacoes var rotacao:quaternion; rotacao.x=float.parse(estadodesteitem[5]); rotacao.y=float.parse(estadodesteitem[6]); rotacao.z=float.parse(estadodesteitem[7]); rotacao.w=float.parse(estadodesteitem[8]); switch(estadodesteitem[0]) {//Instancia o objeto devido case "Cubo_Medkit(Clone)": instantiateditem = Instantiate (CuboMedkit,posicao,rotacao); break; case "Cubo_Gelo(Clone)": instantiateditem = Instantiate (CuboGelo,posicao,rotacao);

218 216 break; case "Cubo_Mina(Clone)": instantiateditem = Instantiate (CuboMina,posicao,rotacao); break; case "Cubo_Missil(Clone)": instantiateditem = Instantiate (CuboMissil,posicao,rotacao); break; case "Cubo_Abacaxi(Clone)": instantiateditem = Instantiate (CuboAbacaxi,posicao,rotacao); break; case "Trophy(Clone)": instantiateditem = Instantiate (Trofeu,posicao,rotacao); break; default : break; //Carrega as velocidades instantiateditem.velocity.x=float.parse(estadodesteitem[9]); instantiateditem.velocity.y=float.parse(estadodesteitem[10]); instantiateditem.velocity.z=float.parse(estadodesteitem[11]); function carregarprojeteis(objeto){ //Esta função é responsável por carregar objetos do tipo Projeteis, que são tanto os misseis quanto as balas e as minas var estadodesteprojetil=objeto.split(";"[0]); var instantiatedprojectile : Rigidbody; //Variável temporária para acessar os projeteis //Carrega as posições var posicao:vector3; posicao.x= float.parse(estadodesteprojetil[2]); posicao.y= float.parse(estadodesteprojetil[3]); posicao.z= float.parse(estadodesteprojetil[4]); //Carrega as orientacoes var rotacao:quaternion; rotacao.x=float.parse(estadodesteprojetil[5]); rotacao.y=float.parse(estadodesteprojetil[6]); rotacao.z=float.parse(estadodesteprojetil[7]); rotacao.w=float.parse(estadodesteprojetil[8]); switch(estadodesteprojetil[0]) {//Instancia o projétil correto da maneira apropriada case "Missile(Clone)": //Verifica se o objeto salvo se trata de um missil e instancia um novo com o estado correto instantiatedprojectile = Instantiate (ProjetilEspecial,posicao,rotacao); break; case "abacaxi(clone)": //Verifica se o objeto salvo se trata de um abacaxi e instancia um novo com o estado correto instantiatedprojectile = Instantiate (ProjetilEspecial,posicao,rotacao); break; case "LandMine_Flag(Clone)": //Verifica se o objeto salvo se trata de uma mina e instancia um novo com o estado correto instantiatedprojectile = Instantiate (ProjetilMina,posicao,rotacao); break; case "bala(clone)": //Verifica se o objeto salvo se trata de uma bala e instancia um novo com o

219 217 estado correto instantiatedprojectile = Instantiate (ProjetilBasica,posicao,rotacao); break; default : break; //Carrega as velocidades instantiatedprojectile.velocity.x=float.parse(estadodesteprojetil[9]); instantiatedprojectile.velocity.y=float.parse(estadodesteprojetil[10]); instantiatedprojectile.velocity.z=float.parse(estadodesteprojetil[11]); //Carrega as informações sobre cara projétil para identificar sua natueza, tempo de vida, e atirador 12]); instantiatedprojectile.getcomponent("projetil").tempoinicio=float.parse(estadodesteprojetil[ instantiatedprojectile.getcomponent("projetil").origemjogador=boolean.parse(estadodeste Projetil[13]); 14]); instantiatedprojectile.getcomponent("projetil").soumina=boolean.parse(estadodesteprojetil[ function carregarcarros(objeto){ //Esta função é responsável por carregar objetos do Carro, que são tanto os bots quanto o carro do player var estadodestecarro=objeto.split(";"[0]); carroscarregados=estadodestecarro[0]+";"+carroscarregados; // Guarda numa lista o fato de este carro ter sido carregado var estecarro = GameObject.Find (estadodestecarro[0]); //Busca este carro na cena if(estecarro!=null){ //Recarrega-se a fase, e deletar o que não quero //Carrega as posições dos carros no espaço estecarro.transform.position.x= float.parse(estadodestecarro[2]); estecarro.transform.position.y=float.parse(estadodestecarro[3]); estecarro.transform.position.z=float.parse(estadodestecarro[4]); //Carrega as orientações dos carros no espaço em quaternions estecarro.transform.rotation.x=float.parse(estadodestecarro[5]); estecarro.transform.rotation.y=float.parse(estadodestecarro[6]); estecarro.transform.rotation.z=float.parse(estadodestecarro[7]); estecarro.transform.rotation.w=float.parse(estadodestecarro[8]); //Carrega as velocidades dos carros estecarro.rigidbody.velocity.x=float.parse(estadodestecarro[9]); estecarro.rigidbody.velocity.y=float.parse(estadodestecarro[10]); estecarro.rigidbody.velocity.z =float.parse(estadodestecarro[11]); //Carrega a vida dos carros vidaloaded=int.parse(estadodestecarro[12]); //O carro do player e os bots tem o controle de vida controlado de maneira diferente if(estecarro.getcomponent("movimentacao").isbot==false){ //estecarro.getcomponent("controledevida").vida=vidaloaded; estecarro.getcomponent("controledevida").adicionarvida(vidaloadedestecarro.getcomponent("controledevida").vida); else{ estecarro.getcomponent("controledevidainimigos").vida=vidaloaded; //Carrega o tipo de arma utilizado 3]); estecarro.find("atirador").getcomponent("arma").armaativa=int.parse(estadodestecarro[1

220 218 //Carrega as munições estecarro.find("atirador").getcomponent("arma").municaoespecial=int.parse(estadodeste Carro[14]); o[15]); [16]); estecarro.find("atirador").getcomponent("arma").municaomina=int.parse(estadodestecarr //Carrega a pontuação if(estecarro.getcomponent("movimentacao").isbot==false){ GameObject.Find("Juiz").GetComponent("Juiz").ItensColetados=int.Parse(estadoDesteCarro GameObject.Find("Juiz").GetComponent("Juiz").Tiros=int.Parse(estadoDesteCarro[17]); GameObject.Find("Juiz").GetComponent("Juiz").Acertos=int.Parse(estadoDesteCarro[18]); GameObject.Find("Juiz").GetComponent("Juiz").InimigosMortos= int.parse(estadodestecarro[19]); GameObject.Find("Juiz").GetComponent("Juiz").mAndados=float.Parse(estadoDesteCarro[2 0]); else{//caso seja um bot, carregar o vetor de danos para o A* var estadodanos=estadodestecarro[16].split(","[0]); var danoload=estecarro.find("controlador").getcomponent("ia_astar").danos; var count=0; for(var n = 0; n < danoload.length; n++) { danoload[n].origem=estadodanos[count]; count=count+1; danoload[n].quantidade=float.parse(estadodanos[count]); count=count+1; function eliminacarrosextras(){ //O objetivo desta função é eliminar carros que foram carregados indevidamente no processo de carregamento var arraydecarroscarregados=carroscarregados.split(";"[0]); // Recupera a lista de carros carregados em um arraydecarroscarregados var carros = GameObject.FindGameObjectsWithTag ("Carro"); //Encontra todos os carros da cena //Para cada carro da cena, verificar se ele foi carregado. Se não foi, então deve ser deletado. for (var carro in carros) { var deletarcarro:boolean=true;//admite-se a priori que ele deve ser deletado for (var cc = 0; cc < arraydecarroscarregados.length-1; cc++) { //Se o carro foi encontrado, então muda-se o comando de deletar este carro para false if(carro.name==arraydecarroscarregados[cc]){deletarcarro=false; //Se o carro não foi encontrado na lista dos carregados, então é preciso deletá-lo if(deletarcarro==true){ Destroy(carro); carroscarregados="";//limpa a lista de carros carregados para o próximo save #

221 219 function levelquedevesercarregado(){ //Esta função lê o arquivo de savegame e retorna a fase que deve ser carregada var vidaloaded:int; //Variável temporária para armazenar a vida carregada //Variáveis para manipulação de arquivos var r : StreamReader; r= File.OpenText(_FileLocation+"/"+ _FileName); var _info : String = r.readtoend(); r.close(); var informacao = _info.split("#"[0]); return int.parse(informacao[0]); //Retorna a fase a ser carregada function devocarregar(){ //Esta função tem o objetivo de recuperar a informação de se é preciso carregar o jogo //A função altera o slot de savegame para carregamento, // retorna true caso o carregamento da fase deva ser efetuado e falso caso contrário if(precisocarregar<0){ return false; else{ slotatual=precisocarregar; switch (slotatual) {//Modifica a fonte do savegame de acordo com o slot desejado case 1: _FileName = "SaveData1.txt"; break; case 2: _FileName = "SaveData2.txt"; break; case 3: _FileName = "SaveData3.txt"; break; default : break; return true; function carregueporfavor(){ //Marca para carregar no futuro //A informação é gravada como o slot a ser carregado precisocarregar=slotatual; function naocarregueporfavor(){ //Marca para não carregar no futuro //A informação é gravada como um valor negativo (-1) precisocarregar=-1;

222 220 SelecionarMenuInicial.js O script SelecionarMenuInicial.js (ver Quadro 20) gerencia as opções do menu inicial. Estando associado a cada alvo presente no menu, executa a operação apropriada para aquela opção assim que o alvo é atingido por uma bala do jogador. A operação em si deve ser passada como parâmetro (por exemplo, Application.LoadLevel(2)), que é avaliada pela função eval(). Logo antes de avaliar o comando, a dificuldade do jogo é atribuída (necessário no caso de New Game). Quadro 20 - Script contido no arquivo SelecionarMenuInicial.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Controle de Jogo/SelecionarMenuInicial.js var dificuldade_to_load:int; // 1 = easy, 2 = med, 3 = hard /** Comando a ser executado Na segunda versão do jogo os comandos possíveis são: - Sair - Carregar primeira fase - Carregar três possíveis jogos salvos **/ var cmd: String; function Awake () { function OnCollisionEnter( hit : Collision ) // Ao colidir com um objeto... { if(hit.gameobject.tag == "Projetil"){ //DontDestroyOnLoad (this); //Não funciona pois os pais devem ser DontDestroy tb GameObject.Find("Juiz").GetComponent("SaveGame").dificuldade = dificuldade_to_load; eval(cmd); 9.4. Inteligencia Artificial No subdiretório Inteligencia Artificial, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Inteligencia Artificial, encontra-se o script que implementa os códigos e funções responsáveis pela inteligência artificial do jogo. Este script e seu código serão descrito a seguir:

223 221 IA_astar.js O script IA_astar.js (ver Quadro 21) é responsável pelo controle das estratégias dos BOTs e seus tiros. Foi utilizada como base para a movimentação uma biblioteca de A* desenvolvida para o próprio Unity. A* é um algoritmo de busca em grafo onde o nó com menor custo estimado total é expandido, sendo o custo estimado uma combinação do custo real e um custo estimado do nó até o destino. Para que funcione, esse custo estimado deve ser menor ou igual ao real, fazendo com que a escolha da distância euclidiana entre os pontos seja uma boa escolha. O grafo gerado é uma malha construída sobre o mapa utilizado, podendo-se especificar seu tamanho e tamanho dos nós. Além disso, pode-se escolher quais tipos de objetos serão obstáculos a serem evitados e quais partes do terreno não podem ser alcançadas. Como a biblioteca foi desenvolvida com foco em jogos, inclui ainda um custo relativo à rotação do objeto movido, ou seja, se o objeto tiver dificuldade em fazer curva, pode-se aumentar o custo dos ângulos do caminho de forma a serem minimizados. Para os mapas, os objetos imóveis foram considerados obstáculos, com exceção da ponte na primeira fase. Além disso, impôs-se uma limitação na diferença de ângulo entre dois nós ligantes. Isso faz com que dois nós próximos, mas um em uma altura superior ao outro devido a uma montanha ou outro motivo, não sejam conectados na geração da malha. Essa configuração auxilia o controle dos BOTs, pois evita que tentem passar por regiões impossíveis de serem alcançadas. Desta maneira, este script interage com o script gerador de trajetória da biblioteca, requisitando a cada 1 segundo que se procure um caminho até o alvo, evitando sobrecarregar o jogo com esse cálculo. Uma vez descoberto o caminho, a biblioteca chama a função PathComplete() do script com a lista de pontos do caminho. A partir dessa lista, o script fornece os alvos temporários para o Controlador.js (ver Quadro 9), fazendo com que o carro se mova.

224 222 Além disso, esse script escolhe o alvo ao qual se deseja chegar de acordo com a estratégia atual e atira em quem tiver na frente, mas somente se a chance de tiro for alta, simulando a perda de pontos por tiros incorretos. Se o jogador estiver na mira de um oponente e tentar correr, ele soltará uma mina, na expectativa de que ela acerte seu perseguidor. Quadro 21 - Script contido no arquivo IA_astar.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Inteligencia Artificial/IA_astar.js var picknextwaypointdistance : float = 3.0; // Distancia do Waypoint atual que o carro deve chegar para que passe a mirar no proximo var points : Vector3[]; // Vetor de pontos encontrados pelo A* var curpoint : int = 0; // Indice do ponto atual no vetor points var cansearchagain : boolean = true; // Flag que determina se pode fazer outra busca do A*. Isso evita que se peca outra busca se uma delas ainda nao completou, o que travaria a biblioteca do A* utilizada private var me : Transform; // Posicao do carro atual private var move : Controlador; // Script de movimentacao do carro controlado para que se possa informar o alvo, segundo a estrategia do momento private var seek : Seeker; // Script da biblioteca do A* que determina o caminho a ser tracado var estrategia : int; // Estrategia escolhida pelo BOT private var target : Vector3; // Alvo escolhido de acordo com a estrategia private var id : int; // Identificacao do carro para evitar que ele seja utilizado nas estrategias private var atirador : Arma; // Atirador do carro para que se controle os tiros var angulolimite : float = 10; // Angulo do cone que diz se o carro esta na mira var distancialimite : float = 100; // Altura do cone que diz se o carro esta na mira var boss : boolean = false; // Identifica se controla o boss para que apenas uma estrategia seja escolhida // Classe para guardar os danos recebidos, sendo utilizada na estratégia Vingativo class danos_acumulados { var origem : String; var quantidade : float; ; // Vetor de danos recebidos, sendo um elemento para cada carro do mapa var danos : danos_acumulados[]; // Co-rotina que realiza a IA das estrategias, como realizacao da busca pelo caminho ate o alvo e escolha de estrategia function DoIA () { var controle : ControledeVidaInimigos = transform.parent.gameobject.getcomponent(controledevidainimigos); // Controlador de vida desse BOT // Determina a vida maxima que esse BOT pode ter para que seja determinado quando se deve mudar de estrategia. Supoe-se que comeca com a vida maxima var vida_maxima : int = controle.vida; var vida : int = vida_maxima; // Valor da vida na ultima troca de estrategia, aumentada se a vida atual passar a ficar maior do que esta variavel EscolheEstrategia (); // Escolhe a estrategia a ser utilizada

225 223 // Como executa como uma co-rotina, fica em um laco infinito e no inicio do mesmo aguarda um tempo para nao sobrecarregar while (true) { // Utilizar A* e checar a vida a cada 1 segundo se mostrou um tempo bom, experimentalmente yield WaitForSeconds(1); // Se nao ha outra busca com o A* ocorrendo... if (cansearchagain) { var vida_atual : int = controle.vida; // Determina a vida atual if (vida_atual > vida) // Se a vida atual for maior do que a vida da ultima troca de estrategias, atualiza vida = vida_atual; else if (((vida-vida_atual)*100)/vida_maxima > 10) { // Se perdeu mais de 10% da vida, troca a estrategia e atualiza a vida da ultima troca de estrategias vida = vida_atual; EscolheEstrategia (); ExecutaEstrategias (estrategia); // Executa as acoes especificas da estrategia cansearchagain = false; // Impede uma busca enquanto esta nao terminar seek.startpath (me.position,target); // Realiza a busca // Co-rotina responsavel pelos tiros dos BOTs function Atira () { var alvo_anterior : GameObject = null; // Armazena o alvo anterior para que ele seja checado primeiro while (true) { yield WaitForSeconds(0.1); // Atira a cada 0.1s if (alvo_anterior && EstaNaMira (alvo_anterior.transform.position,transform)) { // Se houve um alvo anterior e o alvo ainda esta na mira do BOT // Da preferencia para a arma especial, se houver municao if (atirador.municaoespecial > 0 && atirador.armaativa!= 2) atirador.mudaarma(2); else if (atirador.armaativa!= 1) atirador.mudaarma(1); else { // Atira atirador.fire (); // Procura entre todos os carros da fase se algum esta na mira var alvos : GameObject[] = GameObject.FindGameObjectsWithTag ("Carro"); for (var alvo : GameObject in alvos) { if (alvo.getinstanceid() == id (alvo_anterior && alvo_anterior.getinstanceid() == alvo.getinstanceid())) // Evitar conferir o proprio BOT e o alvo anterior, que ja foi conferido continue; // Realiza funcoes semelhantes as executadas quando ja se tinha um alvo anterior if (EstaNaMira (alvo.transform.position,transform)) { if (atirador.municaoespecial > 0 && atirador.armaativa!= 2) atirador.mudaarma(2); else if (atirador.armaativa!= 1) atirador.mudaarma(1); atirador.fire (); alvo_anterior = alvo;

226 224 break; // Escolhe a estrategia aleatoriamente com um valor de 0 a 6. // Como o valor Random.value possui valor no intervalo [0,1], deve-se tentar escolher outra estrategia caso o valor retornado seja 7. // Utiliza-se o arredondamento de inteiro para que todas as estrategias tenham a mesma chance de serem escolhidas. function EscolheEstrategia () { if (!boss) { var valor : int = Random.value*7; if (valor == 7) EscolheEstrategia (); else estrategia = valor; else { // Se o veiculo controlado for o boss, adota uma unica estrategia: Duelista estrategia = 1; // Determina se o alvo esta na mira da base, utilizando um cone com os parametros previamente especificados function EstaNaMira (alvo : Vector3, base : Transform) { var angulo : float = Vector3.Angle(base.forward,alvo-base.position); // Calcula o angulo entre a frente do carro e o vetor que sai do carro em direcao ao alvo var dist : float = (alvo-base.position).sqrmagnitude; // Calcula a distancia entre a base e o alvo if (angulo > angulolimite dist > distancialimite*distancialimite) // Confere se satisfaz a condicao de estar dentro do cone return false; else return true; // Executa a estrategia do BOT de acordo com seu codigo function ExecutaEstrategias (estrategia : int) { switch (estrategia) { case 0: Covarde (); break; case 1: Duelista (); break; case 2: Vingativo (); break; case 3: KillStealer (); break; case 4: Valentao (); break; case 5: Rambo (); break; case 6: Hipocondriaco (); break; // Dentre uma lista de objetos, determina aquele que esta mais proximo function AchaMaisPerto (objetos : GameObject[]) { var distanciamin : float = ; // Inicia com uma distancia muito grande for (var objeto : GameObject in objetos) { if (objeto.getinstanceid() == id) // Evita se checar a distancia do proprio veiculo continue;

227 225 var distancia : float = (me.position-objeto.transform.position).sqrmagnitude; if (distanciamin > distancia && distancia!= 0) { // Se a distancia for menor do que distancia minima encontrada e nao for zero (evitar que se pegue algum componente do carro por engano)... distanciamin = distancia; target = objeto.transform.position; // Coloca como alvo aquele que esta mais proximo // Como existem dois scripts de controle de vida (um para BOTs e um para o jogador), essa funcao determina qual dos dois deve ser utilizado e retorna o valor da vida do objeto alvo // Se o alvo nao tiver nenhum dos dois controles de vida, retorna zero function PegaVida (alvo : GameObject) { var vida : ControledeVida = alvo.getcomponent(controledevida); var vida_ia : ControledeVidaInimigos = alvo.getcomponent(controledevidainimigos); if (vida) return vida.vida; else if (vida_ia) return vida_ia.vida; return 0; // Estrategia Covarde function Covarde() { var alvos : GameObject[] = GameObject.FindGameObjectsWithTag ("Carro"); for (var alvo : GameObject in alvos) { if (alvo.getinstanceid() == id) // Evita analisar o proprio carro continue; if (EstaNaMira (transform.position,alvo.transform)) { // Se esta na mira de algum carro... if (EstaNaMira (transform.position+transform.forward*10,alvo.transform)) { // E um pouco para frente ainda esta na mira... target = transform.position-transform.forward*100; // Coloca o alvo para tras do carro, a fim de se tentar sair da mira. Caso um pouco para frente nao estivesse mais na mira, bastava que ele continuasse if (atirador.armaativa!= 3) // Muda para mina atirador.mudaarma(3); atirador.fire (); // E tenta coloca-la, na tentativa de fazer acertar o oponente que vem em sua direcao return; // Se nao esta na mira de ninguem, persegue o mais proximo AchaMaisPerto (alvos); // Estrategia Duelista function Duelista() { var alvos : GameObject[] = GameObject.FindGameObjectsWithTag ("Carro"); for (var alvo : GameObject in alvos) { if (alvo.getinstanceid() == id) // Evita analisar o proprio carro continue; if (EstaNaMira (transform.position,alvo.transform)) { // Se esta na mira de algum carro... target = alvo.transform.position; // Coloca-o como alvo para tentar virar de

228 226 frente para ele return; // Se nao esta na mira de ninguem, se comporta como Vingativo Vingativo(); // Estrategia Vingativo function Vingativo() { var alvos : GameObject[] = GameObject.FindGameObjectsWithTag ("Carro"); var mais_dano : int = 0; // Vida maior do que o limite do jogo var i : int; for (var alvo : GameObject in alvos) { if (alvo.getinstanceid() == id) // Evita analisar o proprio carro continue; carro... if (EstaNaMira (transform.position,alvo.transform)) Covarde (); // Se comporta como covarde return; { // Se esta na mira de algum // Caso contrario, determina o alvo que o causou mais dano for (i=0;i<danos.length;i++) { if (danos[i].origem == alvo.name && danos[i].quantidade > mais_dano) { mais_dano = danos[i].quantidade; target = alvo.transform.position; if (mais_dano == 0) Covarde (); // Comporta-se como covarde // Estrategia KillStealer function KillStealer() { var alvos : GameObject[] = GameObject.FindGameObjectsWithTag ("Carro"); var menor_vida : int = 1000; // Vida maior do que o limite do jogo for (var alvo : GameObject in alvos) { if (alvo.getinstanceid() == id) // Evita analisar o proprio carro continue; carro... if (EstaNaMira (transform.position,alvo.transform)) Covarde (); // Se comporta como covarde return; { // Se esta na mira de algum // Caso contrario, determina o alvo com a menor vida e o coloca como alvo var vida : int = PegaVida (alvo); if (menor_vida > vida) { menor_vida = vida; target = alvo.transform.position; // Estrategia Valentao

229 227 function Valentao() { var alvos : GameObject[] = GameObject.FindGameObjectsWithTag ("Carro"); var maior_vida : int = 0; for (var alvo : GameObject in alvos) { if (alvo.getinstanceid() == id) // Evita analisar o proprio carro continue; carro... if (EstaNaMira (transform.position,alvo.transform)) Duelista (); // Se comporta como duelista return; { // Se esta na mira de algum // Caso contrario, determina o alvo com a maior vida e o coloca como alvo var vida : int = PegaVida (alvo); if (maior_vida < vida) { maior_vida = vida; target = alvo.transform.position; // Estrategia Rambo function Rambo() { var alvos : GameObject[] = GameObject.FindGameObjectsWithTag ("Arma"); if (alvos.length == 0) { // Se nao ha caixas de arma na fase... Valentao(); // Se comporta como valentao return; // Caso contrario, coloca como alvo a caixa mais proxima AchaMaisPerto (alvos); // Estrategia Hipocondriaco function Hipocondriaco() { var alvos : GameObject[] = GameObject.FindGameObjectsWithTag ("MedKit"); if (alvos.length == 0) { // Se nao ha caixas de recuperacao de vida na fase... Covarde(); // Se comporta como covarde return; // Caso contrario, coloca como alvo a caixa mais proxima AchaMaisPerto (alvos); // Inicializa variaveis utilizadas nas outras funcoes, incia as co-rotinas de controle da IA e de tiro e avisa ao atirador que quem o controla e um BOT, evitando que receba a entrada do jogador function Start () { me = transform; move = GetComponent (Controlador); seek = GetComponent (Seeker); atirador = transform.parent.getcomponentinchildren(arma); StartCoroutine(DoIA ()); StartCoroutine(Atira ()); id = transform.parent.gameobject.getinstanceid(); atirador.isbot = true; var carros : GameObject[] = GameObject.FindGameObjectsWithTag ("Carro"); danos = new danos_acumulados[carros.length];

230 228 var i : int; for (i=0;i<carros.length;i++) { danos[i] = new danos_acumulados(); danos[i].origem = carros[i].name; danos[i].quantidade = 0; // Funcao chamada pela bibliotecado A* quando a busca completa. O argumento e o vetor de pontos do caminho determinado function PathComplete (newpoints : Vector3[]) { points = newpoints; // Salva o vetor retornado FindPoint (0); // Chama a funcao responsavel por analisar qual o alvo para o script de movimentacao para que a estrategia tracada seja seguida. O valor zero corresponde ao indice do vetor, indicando que deve-se comecar a considerar o primeiro ponto cansearchagain = true; // Libera uma nova busca // Funcao chamada em caso de erro na determinacao do caminho. Nesse caso, apenas se libera nova busca function PathError () { cansearchagain = true; // Funcao que controla qual ponto sera colocado como alvo do script de movimentacao function FindPoint (cpoint : int) { curpoint = cpoint; // Salva o ponto atual // Se nao ha vetor de pontos ou ele esta vazio ou o ponto atual e depois do fim do vetor (ja se alcancou o ultimo ponto), o alvo e o proprio carro, com a intencao de ele ficar parado if (points == null points.length == 0 curpoint >= points.length) { move.target = transform.position; return; // Se so ha um ponto no vetor, ele e o alvo if (points.length == 1) { move.target = points[0]; return; // Determina o alvo do script de movimentacao move.target = points[curpoint]; var p : Vector3 = move.target; // Faz uma copia do alvo p.y = transform.position.y; // Iguala as posicoes y para que essa diferenca seja ignorada no calculo da distancia if ((transform.position-p).sqrmagnitude < picknextwaypointdistance*picknextwaypointdistance) { // Se esta a uma distancia menor do que a necessaria para trocar de Waypoint, vai para o proximo curpoint++; FindPoint (curpoint); function TomarDano (origem : String, quantidade : float) { for (var dano in danos) { if (dano.origem == origem) { dano.quantidade += quantidade; return;

231 Interface No subdiretório Interface, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Interface, encontram-se alguns scripts que implementam os códigos e funções responsáveis pelo controle da interface do jogo e os subdiretórios Audio, Camera e HUD, que serão descritos nas sub-sessões 9.5.1, e 0, respectivamente. Os scripts presentes na raiz do diretório Interface e seus códigos serão descritos a seguir: HideCursor.js O script HideCursor.js (ver Quadro 22) tem como função apenas esconder o cursor durante o jogo. Isto é feito atribuindo-se o valor falso para a propriedade da tela showcursor. Quadro 22 - Script contido no arquivo HideCursor.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/HideCursor.js function Update () { //hide the cursor (at the beginning of the game) Screen.showCursor = false; Ranking.js O script Ranking.js (ver Quadro 23) tem como função armazenar uma string digitada pelo jogador para ser salva juntamente com sua pontuação. Ela possui duas funções, a OnGUI(), a qual desenha na tela uma área de texto para o jogador inserir um nome e a função Update(), a qual fica verificando quando o jogador pressionar a tecla enter. Quando isto acontece, salva-se na variável

232 230 nomejogador do script ControleRanking.js (ver Quadro 14) a string digitada e o script é desabilitado. Quadro 23 - Script contido no arquivo Ranking.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/Ranking.js // Pegar string digitada pelo usuário var newskin : GUISkin; private var nome:string = "Name Here"; function Update() { if(input.getkeydown("return")) { GameObject.Find("Juiz").GetComponent("ControleRanking").nomeJogador = nome; var script = GetComponent("Ranking"); script.enabled = false; GameObject.Find("Juiz").GetComponent("ControleRanking").carregarRanking = 1; function OnGUI() { GUI.skin = newskin; //GameObject.Find("Juiz").GetComponent("ControleRanking").colocacao = 1; nome = GUI.TextArea(Rect (Screen.width/2-225, Screen.height/2, 450, 65), nome, 9); //print(nome); Audio No subdiretório Audio, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Interface/Audio, encontra-se o script que implementa os códigos e funções responsáveis pelo controle de volume do áudio do jogo. O script e seu código será descrito a seguir: Volume.js O script Volume.js (ver Quadro 24) vincula as teclas k e l a diminuir e a aumentar o volume dos sons e da música do jogo. Funciona alterando diretamente o volume do componente responsável por ouvir todos os sons do jogo.

233 231 Quadro 24 - Script contido no arquivo Volume.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/Audio/Volume.js var Listener : AudioListener= null; function Update () { if(input.getkeydown("k")) { // Ao pressionar o botao k, diminui o volume VolumeFX(-.1); if(input.getkeydown("l")) { // Ao pressionar o botao l, aumenta o volume VolumeFX(.1); function VolumeFX(change) { Listener.volume = Listener.volume+change; if (Listener.volume>1) Listener.volume=1; if (Listener.volume<0) Listener.volume=0; Camera No subdiretório Camera, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Interface/Camera, encontram-se os scripts que implementam os códigos e funções responsáveis pelo controle da câmera principal do jogo. Além disso, neste subdiretório, encontra-se o subdiretório Cenas Especiais, que será descrito na sub-sessão Os scripts contidos na raiz do subdiretório Camera e seus códigos serão descritos a seguir: ControleCamera.js O script ControleCamera.js (ver Quadro 25) é o responsável pela detecção de algum obstáculo entre a câmera e o personagem principal. Como Survivors é executado em terceira pessoa, ao se aproximar de algum objeto do cenário, como um muro, por exemplo, a câmera atravessava este obstáculo e prejudicava a visão do jogador.

234 232 Com o controle de câmera, ao colidir com um objeto do cenário, a distância entre a câmera e o carro vai diminuindo, mantendo o personagem visível para o jogador. No entanto, na implementação do controle de câmera, ao colidir com uma montanha que pudesse ser escalada, a câmera permanecia no início da montanha e gerava alguns problemas de visualização. Desta forma, fez-se necessária uma implementação para verificar a inclinação do carro, permitindo a diminuição da distância entre a câmera e o jogador somente se estivesse em uma região pouco inclinada. Quadro 25 - Script contido no arquivo ControleCamera.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/Camera/ControleCamera.js var posicaocolisao = Vector3(0,0,0); var carro : GameObject; var distinicial : int; var heightinicial : int; var inclinacao : float; function Start(){ SmoothFollowSurvivors.distance = distinicial; function OnCollisionEnter(collision : Collision) { posicaocolisao = transform.position; collider.size = Vector3(0,0,0); function Update(){ inclinacao = Vector3.Angle(Vector3(0,-1,0),-carro.transform.up); // Determina a inclinacao atual do carro if (inclinacao < 10){ collider.size = Vector3(0,0,1); else { var dist = Vector3.Distance(posicaoColisao, carro.transform.position); if (dist < distinicial+1 && dist > 1){ SmoothFollowSurvivors.distance = dist-1; else if (SmoothFollowSurvivors.distance < distinicial){ SmoothFollowSurvivors.distance = distinicial; collider.size = Vector3(0,0,0);

235 233 SmoothFollowSurvivors.js O script SmoothFollowSurvivors.js (ver Quadro 26) é uma cópia do script SmoothFollow.js que acompanha os Assets padrões do Unity 3D versão No entanto, para que algumas variáveis como a distância da câmera para o carro, por exemplo, tornassem-se acessíveis ao script ControleCamera.js (ver Quadro 25), algumas variáveis foram transformadas em variáveis estáticas. O SmoothFollow é reponsável por fazer a câmera seguir um alvo, o qual, no caso de Survivors, é o carro do jogador. Deta forma, a câmera estará quase sempre exibindo o personagem principal para o jogador de uma distância e uma altura pré-configurada. Por se tratar de uma cópia de outro código, os comentários foram mantidos no idioma original. Quadro 26 - Script contido no arquivo SmoothFollowSurvivors.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/Camera/SmoothFollowSurvivors.js /* This camera smoothes out rotation around the y-axis and height. Horizontal Distance to the target is always fixed. There are many different ways to smooth the rotation but doing it this way gives you a lot of control over how the camera behaves. For every of those smoothed values we calculate the wanted value and the current value. Then we smooth it using the Lerp function. Then we apply the smoothed values to the transform's position. */ // The target we are following var target : Transform; // The distance in the x-z plane to the target static var distance = 5.0; // the height we want the camera to be above the target static var height = 2.0; // How much we var heightdamping = 2.0; var rotationdamping = 3.0; // Place the script in the Camera-Control group in the component AddComponentMenu("Camera-Control/Smooth Follow") function LateUpdate () { // Early out if we don't have a target if (!target) return;

236 234 // Calculate the current rotation angles wantedrotationangle = target.eulerangles.y; wantedheight = target.position.y + height; currentrotationangle = transform.eulerangles.y; currentheight = transform.position.y; // Damp the rotation around the y-axis currentrotationangle = Mathf.LerpAngle (currentrotationangle, wantedrotationangle, rotationdamping * Time.deltaTime); // Damp the height currentheight = Mathf.Lerp (currentheight, wantedheight, heightdamping * Time.deltaTime); // Convert the angle into a rotation currentrotation = Quaternion.Euler (0, currentrotationangle, 0); // Set the position of the camera on the x-z plane to: // distance meters behind the target transform.position = target.position; transform.position -= currentrotation * Vector3.forward * distance; // Set the height of the camera transform.position.y = currentheight; // Always look at the target transform.lookat (target); Cenas Especiais No subdiretório Camera, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Interface/Camera/Cenas Especiais, encontram-se os scripts que implementam os códigos e funções responsáveis pelo controle da câmera principal do jogo nas cenas de Créditos e de Splash. Os scripts e seus códigos serão descritos a seguir: Creditos.js O script Creditos.js (ver Quadro 27) é o responsável pelo deslizamento da câmera na cena de créditos do jogo Survivors. Nesta cena, as texturas estão dispostas estaticamente em planos e a câmera desliza no eixo Z em um fator de tempo até atingir o final das texturas. Ao atingir o final, carrega a cena de ranking.

237 235 Quadro 27 - Script contido no arquivo Creditos.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/Camera/Cenas Especiais/Creditos.js var inicio = false; var tempoinicial; var cam : GameObject; function Update () { if (!inicio){ tempoinicial = Time.time; inicio = true; if (transform.position[2] < -115){ Application.LoadLevel(7); cam.transform.position = cam.transform.position + Vector3(0, 0, -3)*Time.deltaTime; Splash.js O script Splash.js (ver Quadro 28) é o responsável pelo deslizamento da câmera na cena de splash do jogo Survivors. Nesta cena, a textura com o logo da Unicamp está disposta estaticamente em um plano e a câmera desliza no eixo Y em um fator de tempo até atingir por três segundos. Ao atingir os três segundos, carrega a cena do menu inicial. Quadro 28 - Script contido no arquivo Splash.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/Camera/Cenas Especiais/Splash.js var inicio = false; var tempoinicial; var cam : GameObject; function Update () { if (!inicio){ tempoinicial = Time.time; inicio = true; if (transform.position[2] < -115){ Application.LoadLevel(7); cam.transform.position = cam.transform.position + Vector3(0, 0, -3)*Time.deltaTime;

238 HUD No subdiretório HUD, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Interface/HUD, encontram-se os scripts que implementam os códigos e funções responsáveis pelo controle do HUD do jogo. Os scripts e seus códigos serão descritos a seguir: HUD.js O script HUD.js (ver Quadro 29) é aquele que gerencia todas as questões referentes ao HUD. De maneira geral, o script pode ser dividido nas seguintes partes: implementação da barra de vida e o display de pontos; implementação do display que indica a arma selecionada e a munição disponível; implementação do tacômetro; implementação do minimap; suporte a diferentes formatos de janela. Por sua vez, cada uma dessas partes, exceto a última, realiza duas tarefas: extrai de objetos externos os dados relevantes e exibe o elementos do HUD de acordo com os dados obtidos. Por exemplo, para implementar a barra de vida, deve-se obter a vida atual do jogador a partir de um objeto externo que é o script ControledeVida e então desenhar a barra de vida da cor e do tamanho correspondentes a essa informação. Para extrair os dados de objetos externos são declaradas variáveis publicas que são associadas aos objetos pelo Inspector do Unity (por exemplo, para acessar a vida do personagem, é declarada a variável vida, de tipo ControledeVida, que é associada ao script de mesmo nome, que contém o dado desejado). Para desenhar os elementos do HUD são utilizadas as funções GUI.DrawTexture para texturas e GUI.Label para textos. As posições fornecidas as

239 237 funções tem como referencia uma janela de 800X600, e a correção necessária para tamanhos diferentes é realizada pela função Matrix4X4.TRS e pela variável resize. Maiores detalhes são explicados no item "Suporte a diferentes formatos de janela". Barra de vida e pontos O script obtém a quantidade de vida do personagem do jogador a partir do script ControledeVida e desenha uma barra de vida de tamanho proporcional. A cor da barra é alterada dependendo da vida: verde (80 ou mais), amarela (de 40 a 80), ou vermelha (abaixo de 40). Como o sistema de pontuação não foi implementado ainda, este script apenas exibe uma pontuação zerada. Display de arma equipada e munição disponível O script obtém a arma equipada e a munição disponível a partir do script Arma e desenha um ícone representando a arma com um número indicando a quantidade de munição (ou 'Inf' para munição ilimitada). Tacômetro O script primeiramente obtém a velocidade instantânea do carro, calculada como a média das rotações por minutos de cada roda do personagem do jogador multiplicada pelo perímetro da roda. O valor é convertido para km/h e exibido no display digital, bem como utilizado para determinar o ângulo do ponteiro (a velocidade é simplesmente multiplicada por um fator de proporção e o resultado subtraído por um offset para ajustar a fase do ponteiro). Minimap O script basicamente adquire a posição e orientação (ângulo de Euler no eixo y) dos carros na cena e os utiliza para seus respectivos ícones no minimap, antes os multiplicando por um fator de escala e somando a um offset para colocá-los na posição correta da tela, dentro do mapa. Um detalhe é que enquanto a

240 238 posição x no mapa corresponde ao valor x real multiplicado pelo fator r de proporcionalidade (e mais um offset), a posição y no mapa corresponde ao z real multiplicado por -r mais um offset, pois no sistema de coordenadas do HUD o y cresce para baixo. Além disso, a posição do carro não é recalculada todo frame, mas apenas a cada dez frames, visando melhorar o desempenho do jogo. Isso é implementado com um contador hud_update. Suporte a diferentes formatos de janela O suporte a diferentes formatos de janela é feito por dois recursos: pelo uso do método Matrix4X4.TRS e pelo fator multiplicativo resize. O primeiro faz com que os elementos do HUD sejam escalados conforme as proporções da tela. Entretanto, se apenas este método fosse utilizado haveria suporte a apenas uma proporção de largura/altura e portanto o HUD seria exibido sem problemas apenas numa tela widescreen ou então numa tela comum, mas não em ambas. Para tanto, utiliza-se o fator multiplicativo resize, que é calculado no início do jogo dependendo da proporção inicial da tela. Caso ela seja comum, o fator é de 1, caso seja widescreen, o fator é de 1.3. Esse fator é multiplicado nas posições dos elementos do HUD para que fiquem sempre próximos da borda da janela. Quadro 29 - Script contido no arquivo HUD.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/HUD/HUD.js //medidas da janela, 800 x 600 é o valor inicial private var width=800.0; private var height=600.0; //numero da fase atual var fase: int; // // Minimap: // private var selfrect: Rect; private var e1rect: Rect; private var e2rect: Rect; private var e3rect: Rect; private var trophyrect: Rect; //texturas do minimap var minimap: Texture2D; var mmmoldura: Texture2D; var mmself: Texture2D;

241 239 var mmenemy1: Texture2D; var mmenemy2: Texture2D; var mmenemy3: Texture2D; var mmtrophy: Texture2D; //carro do jogador e oponentes: a partir de suas posições reais, a posição no minimap é calculada. var Self: GameObject; var Enemy1: GameObject; var Enemy2: GameObject; var Enemy3: GameObject; //trofeu que aparece ao eliminar todos os oponentes var Trophy: GameObject; //tamanho do minimap var mmsize = 100.0; //tamanho do cenário real public var realsize:float; //razão de proporção entre o mapa e o real private var mapratio: float; //=====fim Minimap============ // // Tacometro // //texturas var tacometro: Texture2D; var ponteiro: Texture2D; var display: Texture2D; //angulo inicial (correspondente a velocidade zero) var angle=-220; // rodas, de onde são obtidos os dados para calcular a velocidade var wheelfl: Wheel; var wheelfr: Wheel; var wheelrl: Wheel; var wheelrr: Wheel; //=====fim Tacometro============ // // Armas // //script de onde são obtidos os dados sobre qual arma está equipa, quanta munição, etc.. var scriptarma: Arma; //texturas var armabasica: Texture2D; var armaespecial: Texture2D; var mina: Texture2D; //=====fim Armas============ // // Vida e pontos // //texturas var barravida: Texture2D; var estrela: Texture2D; var bvmoldura: Texture2D; //script de onde se obtem a vida do jogador var vida: ControledeVida;

242 240 //script de onde se obtem os pontos do jogador var Juiz : Juiz; //=====fim Vida e pontos============ //resize do HUD var offset;//ajusta offset dos elementos var resize;//ajsuta escala // link para o script do missil perseguidor var ScriptMissil : ProjetilHoming; //fontes var reg: Font; var big: Font; var little: Font; var ArmaFonte = new GUIStyle(); var PontosFonte = new GUIStyle(); var TacoFonte = new GUIStyle(); //variavel de controle que deteremina se o HUD deve ser atualizado ou não. private var hud_update = 0; function Start(){ //calcula proporção da janela var h: float = Screen.height; var w: float = Screen.width; var r: float = h/w; //calcula proporção do minimap mapratio= mmsize/realsize; //caso a proporção h:w seja 3:4 if(r >0.76 r < 0.74) { height = 450; width*=1.3; height*=1.3; resize =1.3; offset = Vector3(150.0,0,0); //caso não seja ajusta como se fosse widescreen (se nao for widescreen ficará distorcido) else { resize = 1.0; offset = Vector3.zero; //inicializa fontes ArmaFonte.font = big; TacoFonte.font = little; PontosFonte.font = reg; PontosFonte.normal.textColor = Color.white; function Update(){ if( (fase == 3) && (scriptarma.armaativa == 2) ){ if(enemy1 && scriptarma.missile_target == Enemy1) { Enemy1.Find("Target1").renderer.enabled = true; //ScriptMissil.Enemy = Enemy1.transform; else if(enemy1) {

243 241 Enemy1.Find("Target1").renderer.enabled = false; else{ if(enemy2 && scriptarma.missile_target == Enemy2) { Enemy2.Find("Target2").renderer.enabled = true; //ScriptMissil.Enemy = Enemy2.transform; else if(enemy2){ Enemy2.Find("Target2").renderer.enabled = false; if(enemy3 && scriptarma.missile_target == Enemy3) { Enemy3.Find("Target3").renderer.enabled = true; //ScriptMissil.Enemy = Enemy3.transform; else if(enemy3) { Enemy3.Find("Target3").renderer.enabled = false; if(fase == 3) { if(enemy1) { Enemy1.Find("Target1").renderer.enabled = false; if(enemy2) { Enemy2.Find("Target2").renderer.enabled = false; if(enemy3) { Enemy3.Find("Target3").renderer.enabled = false; function OnGUI() { //ajusta proporção: outros ajustes necessários são feitos multiplicando a posição da textura pelo fator resize e adicionando o offset (necessario para tratar formatos widescreen e tradicional) tmatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, Vector3(1.0*Screen.width/width, 1.0*Screen.height/height, 1.0)); GUI.matrix = tmatrix; //calcula velocidade baseado na velocidade angular da roda multiplicada pelo perímetro var rpmmedio: float = (wheelfl.collider.rpm + wheelfr.collider.rpm + wheelrl.collider.rpm + wheelrr.collider.rpm)/4; var vel: int = *rpmMedio; if(vel<0) vel = -vel; angle = vel*(300.0/220.0) ; //desenha minimap (o fundo, não os carros) GUI.DrawTexture(Rect(640*resize,40,120,120), mmmoldura,scalemode.scaletofit); GUI.DrawTexture(Rect(640*resize+10,50,100,100), minimap,scalemode.scaletofit); //hud_update == 0: calcula nova posição dos carros no minimap if(hud_update==0 fase == 0){ if(self)selfrect= Rect((640*resize+10+mapratio*Self.transform.position.x),150- mapratio*self.transform.position.z,10,15); if(enemy1)e1rect= Rect((640*resize+10+mapratio*Enemy1.transform.position.x),150- mapratio*enemy1.transform.position.z,10,15);

244 242 if(enemy2)e2rect= Rect((640*resize+10+mapratio*Enemy2.transform.position.x),150- mapratio*enemy2.transform.position.z,10,15); if(enemy3)e3rect= Rect((640*resize+10+mapratio*Enemy3.transform.position.x),150- mapratio*enemy3.transform.position.z,10,15); hud_update = 10; //!=0, decrementa o hud_update else hud_update--; //desenha os carros no minimap if(self) { matrixbackup = GUI.matrix; GUIUtility.RotateAroundPivot(Self.transform.eulerAngles.y, Vector2((640*resize+15+mapratio*Self.transform.position.x)*Screen.width/width,( mapratio*self.transform.position.z)*screen.height/height)); GUI.DrawTexture(selfRect, mmself); GUI.matrix = matrixbackup; if(enemy1) { matrixbackup = GUI.matrix; GUIUtility.RotateAroundPivot(Enemy1.transform.eulerAngles.y, Vector2((640*resize+15+mapratio*Enemy1.transform.position.x)*Screen.width/width,( mapratio*enemy1.transform.position.z)*screen.height/height)); GUI.DrawTexture(e1Rect, mmenemy1); GUI.matrix = matrixbackup; if(enemy2) { matrixbackup = GUI.matrix; GUIUtility.RotateAroundPivot(Enemy2.transform.eulerAngles.y, Vector2((640*resize+15+mapratio*Enemy2.transform.position.x)*Screen.width/width,( mapratio*enemy2.transform.position.z)*screen.height/height)); GUI.DrawTexture(e2Rect, mmenemy2); GUI.matrix = matrixbackup; if(enemy3) { matrixbackup = GUI.matrix; GUIUtility.RotateAroundPivot(Enemy3.transform.eulerAngles.y, Vector2((640*resize+15+mapratio*Enemy3.transform.position.x)*Screen.width/width,( mapratio*enemy3.transform.position.z)*screen.height/height)); GUI.DrawTexture(e3Rect, mmenemy3); GUI.matrix = matrixbackup; //desenha o trofeu no minimap if(trophy &&!Enemy1 &&!Enemy2 &&!Enemy3) { matrixbackup = GUI.matrix; trophyrect= Rect((640*resize+10+mapratio*Trophy.transform.position.x),150- mapratio*trophy.transform.position.z,20,20); GUI.DrawTexture(trophyRect, mmtrophy); GUI.matrix = matrixbackup; //Desenhando tacometro: GUI.DrawTexture(Rect(640*resize+10,450,100,100), tacometro,scalemode.scaletofit); GUI.DrawTexture(Rect(640*resize+30,510,60,18), display,scalemode.stretchtofill); GUI.Label(Rect(640*resize+40,513,60,20),vel+" km/h",tacofonte); matrixbackup = GUI.matrix; var pos:vector2 = Vector2(((640*resize+60)*Screen.width/width),500*Screen.height/height);

245 243 GUIUtility.RotateAroundPivot(angle, pos); var thisrect:rect = Rect(640*resize+55,493,50,15); GUI.DrawTexture(thisRect, ponteiro); GUI.matrix = matrixbackup; //Desenhando ícones de armas //determina cor da fonte dependendo da fase: na fase 0 e 4, por causa do asfalto preto, a cor é branca, nas demais, é preta. if(fase == 4 fase == 0) ArmaFonte.normal.textColor = Color.white; else ArmaFonte.normal.textColor = Color.black; //desenhando propriamente os elementos if(scriptarma.armaativa == 1) GUI.DrawTexture(Rect(50*resize,450,100,100), armabasica,scalemode.scaletofit); if(scriptarma.armaativa == 2) GUI.DrawTexture(Rect(50*resize,450,100,100), armaespecial,scalemode.scaletofit); if(scriptarma.armaativa == 3) GUI.DrawTexture(Rect(50*resize,450,100,100), mina,scalemode.scaletofit); //na fase inicial a quantidade de munição da arma especial e a quantidade de minas é infinita if(fase == 0){ if(scriptarma.armaativa == 2) GUI.Label(Rect(50*resize+110,500,100,100),"inf",ArmaFonte); if(scriptarma.armaativa == 3) GUI.Label(Rect(50*resize+110,500,100,100),"inf",ArmaFonte); else{ if(scriptarma.armaativa == 2) GUI.Label(Rect(50*resize+110,500,100,100),scriptArma.MunicaoEspecial+"",ArmaFonte); if(scriptarma.armaativa == 3) GUI.Label(Rect(50*resize+110,500,100,100),scriptArma.MunicaoMina+"",ArmaFonte); if(scriptarma.armaativa == 1) GUI.Label(Rect(50*resize+110,500,100,100),"inf",ArmaFonte); //Desenhando vida e pontos GUI.DrawTexture(Rect(40*resize,70,160,30), bvmoldura,scalemode.stretchtofill); if(vida.vida>80)gui.color = Color.green; else if(vida.vida>40)gui.color = Color.yellow; else if(vida.vida>0)gui.color = Color.red; if(vida.vida>0) GUI.DrawTexture(Rect(40*resize+5,75,vida.Vida/100.0*150.0,20), barravida,scalemode.stretchtofill); GUI.color = Color.white; GUI.DrawTexture(Rect(40*resize,40,160,25), bvmoldura,scalemode.stretchtofill); GUI.DrawTexture(Rect(40*resize+5,42.5,18,18), estrela,scalemode.scaletofit); if(juiz) var k :int = Juiz.PontosTotal; PontosFonte.normal.textColor = Color.white; GUI.Label(Rect(40*resize+40,42,160,25),"00"+k,PontosFonte); //Mensagem de vitoria ou derrota if(juiz && Juiz.Terminou){ //determina cor da fonte dependendo da fase: cor preta para a fase 2 (por causa da cor quase branca da neve), branca para as demais fases if(fase == 2) { ArmaFonte.normal.textColor = Color.black; PontosFonte.normal.textColor = Color.black; else{ ArmaFonte.normal.textColor = Color.white; PontosFonte.normal.textColor = Color.white; //derrota

246 244 if (Juiz.Derrotado) { GUI.Label(Rect(280*resize+40,120,480,100),"You FAIL!",ArmaFonte); GUI.Label(Rect(240*resize+40,180,480,100),"Enjoy this sad song and try again!!!",pontosfonte); //vitoria else { GUI.Label(Rect(280*resize+40,120,480,100),"You win!",armafonte); GUI.Label(Rect(240*resize+40,180,480,100),"Grab the trophy to go to the next level!",pontosfonte); //Mensagem explicativa para a fase inicial if(fase == 0){ ArmaFonte.normal.textColor = Color.white; GUI.Label(Rect(280*resize+40,80,480,100),"Welcome!",ArmaFonte); GUI.Label(Rect(210*resize+40,160,520,100),"To move the car use the keyboard arrows",pontosfonte); GUI.Label(Rect(195*resize+40,200,520,100),"Press SPACE to change your weapon and CTRL to shoot",pontosfonte); GUI.Label(Rect(135*resize+40,240,700,100),"To select an option get in the corresponding hangar and shoot the target!",pontosfonte); Menu2.js O script Menu2.js (ver Quadro 30) é o responsável por desenhar na tela o menu 2 quando o jogador pausar o jogo (Ver script AtivarMenu2.js - Quadro 13). Ele possui duas funções: OnGUI() e PauseMenu(). A primeira é uma função especial do Unity, a qual é chamada a cada frame renderizado. Esta tem como objetivo apenas mostrar o cursor, o qual fica desabilitado durante o jogo, e chamar a função PauseMenu(). Nesta segunda função, a interface gráfica é desenhada na tela utilizando os componentes básicos da GUI (Graphic User Interface) do Unity como label e Button. Cada componente adicionado, tem uma função específica no jogo, como carregar ou salvar um jogo, sair do menu, ir para o menu inicial ou sair do jogo. Quadro 30 - Script contido no arquivo Menu2.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/HUD/Menu2.js // PauseMenuScript

247 245 var newskin : GUISkin; var logotexture : Texture2D; var Listener : AudioListener= null; var slotatual:int=1; var yselect:int=130; var offset:int=0; function PauseMenu() { var script1 = GetComponent("Menu2"); var script2 = GetComponent("HideCursor"); var script3 = GetComponent("SaveGame"); var script4 = GetComponent("SelectSlotSaveMenu"); var script5 = GetComponent("SelectSlotLoadMenu"); //layout start GUI.BeginGroup(Rect(Screen.width / 2-150, 50, 300, 300)); //the menu background box GUI.Box(Rect(0, 0, 300, 300), ""); //logo picture GUI.Label(Rect(15, 10, 300, 68), logotexture); ///////pause menu buttons //game resume button if(gui.button(rect(50, 50, 180, 40), "Resume")) { //resume the game Time.timeScale = 1.0; Listener.pause = false; //disable pause menu script1.enabled = false; script2.enabled = true; if(gui.button(rect(50, 100, 180, 40), "Save/Load")) { //script3.savegame(slotatual); //Time.timeScale = 1.0; //Listener.pause = false; script1.enabled = false; script2.enabled = true; //script4.enabled = true; GetComponent("SaveGame").mostrarMenuReserva=true; //this.enabled=false; /* if(gui.button(rect(50, offset, 180, 40), "Load")) { //script3.loadgame(slotatual); //Time.timeScale = 1.0; Time.timeScale = 1.0; Listener.pause = false; script1.enabled = false; script2.enabled = true; //script5.enabled = true; GetComponent("SaveGame").mostrarMenuReserva=true; //this.enabled=false; */

248 246 //main menu return button (level 0) if(gui.button(rect(50, offset, 180, 40), "Main Menu")) { Application.LoadLevel(1); //quit button if(gui.button(rect(50, 200, 180, 40), "Quit")) { Application.Quit(); //layout end GUI.EndGroup(); /* function SaveMenu(){ var script1 = GetComponent("PauseGame"); var script2 = GetComponent("HideCursor"); var script3 = GetComponent("SaveGame"); //layout end GUI.EndGroup(); */ function OnGUI() { //load GUI skin GUI.skin = newskin; //layout start GUI.BeginGroup(Rect(Screen.width / 2-150, 50, 300, 350)); //the menu background box GUI.Box(Rect(0, 0, 300, 350), ""); ///////pause menu buttons //game resume button if(gui.button(rect(50, 50, 180, 40), "Return")) { this.pausemenu(); if(gui.button(rect(50, 100, 180, 40), "SLOT 1")) { script3.savegame(); Time.timeScale = 1.0; script1.enabled = false; script2.enabled = true; //show the mouse cursor Screen.showCursor = true; //run the pause menu script PauseMenu();

249 247 SelectSlotLoadMenu.js O script SelectSlotLoadMenu.js (ver Quadro 31) é o responsável por desenhar na tela o menu de seleção de slot. Este é habilitado quando o jogador seleciona a opção para carregar um jogo no Menu2. Ele possui duas funções: OnGUI() e SelectSlot(). A primeira é uma função especial do Unity, a qual é chamada a cada frame renderizado. Esta tem como objetivo apenas mostrar o cursor, o qual fica desabilitado durante o jogo, e chamar a função SelectSlot(). Nesta segunda função, a interface gráfica é desenhada na tela utilizando os componentes básicos da GUI (Graphic User Interface) do Unity box label e Button. Cada botão adicionado é responsável por carregar o jogo salvo de um determinado slot e retomar o mesmo. Quadro 31 - Script contido no arquivo SelectSlotLoadMenu.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/HUD/SelectSlotLoadMenu.js // SelectSlotMenuScript var newskin : GUISkin; var logotexture : Texture2D; var Listener : AudioListener= null; var slotatual:int=1; var yselect:int=130; var offset:int=0; function SelectSlot() { var script1 = GetComponent("Menu2"); var script2 = GetComponent("HideCursor"); var script3 = GetComponent("SaveGame"); var script4 = GetComponent("SelectSlotLoadMenu"); //layout start GUI.BeginGroup(Rect(Screen.width / 2-150, 50, 300, 350)); //the menu background box GUI.Box(Rect(0, 0, 300, 350), ""); //logo picture GUI.Label(Rect(15, 10, 300, 68), logotexture); if(gui.button(rect(50, 100, 180, 40), "SLOT 1")) { Time.timeScale = 1.0; script1.enabled = false; script2.enabled = true; script4.enabled = false; script3.loadgame(1);

250 248 if(gui.button(rect(50, 150, 180, 40), "SLOT 2")) { Time.timeScale = 1.0; script1.enabled = false; script2.enabled = true; script4.enabled = false; script3.loadgame(2); if(gui.button(rect(50, 200, 180, 40), "SLOT 3")) { Time.timeScale = 1.0; script1.enabled = false; script2.enabled = true; script4.enabled = false; script3.loadgame(3); //quit button if(gui.button(rect(50, 250, 180, 40), "BACK")) { //script1.pausemenu(); script1.enabled = true; script4.enabled = false; //layout end GUI.EndGroup(); function OnGUI () { //load GUI skin GUI.skin = newskin; //show the mouse cursor Screen.showCursor = true; //run the pause menu script SelectSlot(); SelectSlotSaveMenu.js O script SelectSlotSaveMenu.js (ver Quadro 32) é o responsável por desenhar na tela o menu de seleção de slot. Este é habilitado quando o jogador seleciona a opção para carregar um jogo no menu2. Ele possui duas funções: OnGUI() e SelectSlot(). A primeira é uma função especial do Unity, a qual é chamada a cada frame renderizado. Esta tem como objetivo apenas mostrar o cursor, o qual fica desabilitado durante o jogo, e chamar a função SelectSlot().

251 249 Nesta segunda função, a interface gráfica é desenhada na tela utilizando os componentes básicos da GUI (Graphic User Interface) do Unity box label e Button. Cada botão adicionado é responsável por carregar o jogo salvo em um determinado slot e retornar ao jogo. Quadro 32 - Script contido no arquivo SelectSlotSaveMenu.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Interface/HUD/SelectSlotSaveMenu.js // SelectSlotMenuScript var newskin : GUISkin; var logotexture : Texture2D; var Listener : AudioListener= null; //var slotatual:int=1; var yselect:int=130; var offset:int=0; function SelectSlot() { var script1 = GetComponent("Menu2"); var script2 = GetComponent("HideCursor"); var script3 = GetComponent("SaveGame"); var script4 = GetComponent("SelectSlotSaveMenu"); //var ativarmenu2 = GetComponent("AtivarMenu2"); //layout start GUI.BeginGroup(Rect(Screen.width / 2-150, 50, 300, 350)); //the menu background box GUI.Box(Rect(0, 0, 300, 350), ""); //logo picture GUI.Label(Rect(15, 10, 300, 68), logotexture); if(gui.button(rect(50, 100, 180, 40), "SLOT 1")) { Listener.pause = false; script3.savegame(1); Time.timeScale = 1.0; //script1.enabled = false; script2.enabled = true; script4.enabled = false; if(gui.button(rect(50, 150, 180, 40), "SLOT 2")) { Listener.pause = false; script3.savegame(2); Time.timeScale = 1.0; //script1.enabled = false; script2.enabled = true; script4.enabled = false; if(gui.button(rect(50, 200, 180, 40), "SLOT 3")) { Listener.pause = false; script3.savegame(3); Time.timeScale = 1.0;

252 250 //script1.enabled = false; script2.enabled = true; script4.enabled = false; //quit button if(gui.button(rect(50, 250, 180, 40), "BACK")) { //script1.pausemenu(); script1.enabled = true; script4.enabled = false; //layout end GUI.EndGroup(); function OnGUI () { //load GUI skin GUI.skin = newskin; //show the mouse cursor Screen.showCursor = true; //run the pause menu script SelectSlot(); 9.6. Itens No subdiretório Itens, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Scripts/Itens, encontram-se os scripts que implementam os códigos e funções responsáveis pelo controle da coleta dos itens do jogo. Os scripts e seus códigos serão descritos a seguir: GetEspecial.js, GetMedkit.js e GetMina.js Itens coletáveis são caixas que caem do céu, com freqüência definida, em locais aleatórios do mapa, num comportamento definido no script Instanciador.js (ver Quadro 15). Ao colidirem com um carro, passam a mensagem para aumentar a quantidade de munição ou de vida, em comportamentos tratados em GetMina.js (ver Quadro 35), GetEspecial.js (ver Quadro 33) e GetMedkit.js (ver Quadro 34), para as caixas, e Arma.js (ver Quadro 2) e ControledeVida.js (ver Quadro 10) para o carro que colide.

253 251 Quadro 33 - Script contido no arquivo GetEspecial.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Itens/GetEspecial.js var Municao = 1; var SoundToPlay : AudioClip; var Jogador : GameObject; var Juiz : GameObject; function OnCollisionEnter( hit : Collision ) { if (hit.gameobject.tag == "Carro") { AudioSource.PlayClipAtPoint (SoundToPlay, transform.position); hit.gameobject.sendmessageupwards("adicionarespecial", Municao, SendMessageOptions.DontRequireReceiver); if (hit.gameobject == Jogador) { Juiz.gameObject.SendMessageUpwards("ColetouItem", null); Destroy( gameobject ); Quadro 34 - Script contido no arquivo GetMedkit.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Itens/GetMedkit.js var MelhoriaDeVida = 20; var SoundToPlay : AudioClip; var Jogador : GameObject; var Juiz : GameObject; function OnCollisionEnter( hit : Collision ) { if (hit.gameobject.tag == "Carro") { AudioSource.PlayClipAtPoint (SoundToPlay, transform.position); hit.gameobject.sendmessageupwards("adicionarvida", MelhoriaDeVida, SendMessageOptions.DontRequireReceiver); if (hit.gameobject == Jogador) { Juiz.gameObject.SendMessageUpwards("ColetouItem", null); Destroy( gameobject ); Quadro 35 - Script contido no arquivo GetMina.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Itens/GetMina.js var Municao = 1; var SoundToPlay : AudioClip; var Jogador : GameObject; var Juiz : GameObject;

254 252 function OnCollisionEnter( hit : Collision ) { if (hit.gameobject.tag == "Carro") { AudioSource.PlayClipAtPoint (SoundToPlay, transform.position); hit.gameobject.sendmessageupwards("adicionarmina", Municao, SendMessageOptions.DontRequireReceiver); if (hit.gameobject == Jogador) { Juiz.gameObject.SendMessageUpwards("ColetouItem", null); Destroy( gameobject ); GetTrofeu.js Ao fim do jogo, em caso de vitória, um troféu é instanciado pelo script Juiz.js. O troféu deve ser coletado pelo jogador. Quando isso acontece, o script GetTrofeu.js (ver Quadro 36) faz com que a próxima fase seja carregada. Quadro 36 - Script contido no arquivo GetTrofeu.js Caminho: Survivors/Assets/Assets Survivors/Scripts/Itens/GetTrofeu.js //var SoundToPlay : AudioClip; var Allowed : GameObject; var WheretoGo : Transform; var scenetoload : String; var nextlevel: int; //var Juiz : GameObject; private var hora; function OnCollisionEnter( hit : Collision ) { if (hit.gameobject.tag == "Carro") { //carrega o próximo level do jogo Application.LoadLevel(nextLevel);

255 SKINS Nesta sessão, será definido o skin que foi utilizado no desenvolvimento do jogo Survivors. Os GUISkins (Graphic User Interface Skin) são uma coleção de atributos para a interface gráfica do Unity, chamada de GUIStyle. A vantagem em sua utilização é a possibilidade de utilizá-lo para definir o estilo de todos os componentes de interface com o usuário, como botões e caixas de texto, ao invés de editá-los individualmente. O caminho a partir do diretório principal do projeto para encontrar o arquivo do skin é: Survivors/Assets/Assets Survivors/Skins. O skin contido neste subdiretório é apresentado a seguir: Arquivo Tamanho Formato SkinRanking.GUISkin 102 KB GUISkin

256 TERRENOS Nesta sessão, serão exibidas os terrenos que foram utilizados no desenvolvimento do jogo Survivors. O caminho a partir do diretório principal do projeto para encontrar os arquivos dos terrenos é: Survivors/Assets/Assets Survivors/Terrains. No interior deste diretório, encontram-se os terrenos que estão presentes nas fases do jogo. Nota: Todos os terrenos utilizados no desenvolvimento do jogo Survivors foram criados e editados no ambiente de desenvolvimento do software Unity 3D, versão Os terrenos contidos neste subdiretório são apresentados a seguir: Arquivo Tamanho Formato Descrição Terreno - Fase 1.asset KB Asset Terreno da fase 1 Pouco acidentado com cadeia de montanhas circular em volta. Terreno - Fase 2.asset KB Asset Terreno da fase 2 Pouco acidentado, circular, com uma montanha alta no centro. Terreno - Fase 3.asset 2416 KB Asset Terreno da fase 3 Altamente acidentado, circular, com uma chapada alta no centro. Terreno - Fase 4.asset 3398 KB Asset Terreno da fase 4 Completamente plano e quadrado. Terreno Menu Inicial.asset KB Asset Terreno da fase menu inicial Completamente plano e quadrado.

257 TEXTURAS Nesta sessão, serão exibidas as texturas que foram utilizadas no desenvolvimento do jogo Survivors. As texturas possibilitam o acréscimo de informações aos objetos tridimensionais sem que seja necessária a sua modelagem. Elas podem ser divididas em dois grupos: mapas (maps) e procedurais. O primeiro grupo utiliza imagens 2D, como JPG e TIF, que alteram a aparência das superfícies. Enquanto que a textura procedural é o resultado de delineamentos de funções matemáticas chamadas de procedures. Esta última, em relação ao mapa, possui a vantagem de não haver limitação quanto a resolução da mesma. Entretanto, para desenvolvimento de Survivors, preferiu-se utilizar o primeiro grupo de texturas, devido ao seu grau de facilidade ser maior. O caminho a partir do diretório principal do projeto para encontrar os arquivos das texturas é: Survivors/Assets/Assets Survivors/Textures. No interior deste diretório, encontram-se os subdiretórios Armas, Carros, HUD, Objetos, Skyboxes e Terrenos, que serão descritos nas sub-sessões 12.1, 12.2, 12.3, 12.4, 12.5 e 12.6, respectivamente. Nota: As texturas do jogo foram desenvolvidas utilizando as ferramentas Gimp, Adobe Photoshop CS2 e Microsoft Paint, versão 5.1. Além disso, algumas texturas foram exportadas diretamente dos softwares de edição de modelos 3D Armas No subdiretório Armas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Armas, encontra-se o subdiretório Explosao que será descrito na sub-sessão Explosao No subdiretório Explosao, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Armas/Explosao,

258 256 encontram-se as texturas utilizadas para produzirem o efeito visual de explosão do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização cartoonsmoke.jpg 625 x KB Imagem JPEG cartoonsmoke2.jpg 625 x KB Imagem JPEG cartoonsmoke3.jpg 625 x KB Imagem JPEG

259 Carros No subdiretório Carros, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Carros, encontram-se os subdiretórios Bus e Subaru que serão descritos nas sub-sessões e Bus No subdiretório Bus, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Carros/Bus, encontram-se as texturas utilizadas no modelo do ônibus do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização bus1.png 512 x KB PNG bus2.jpg 256 x KB Imagem JPEG

260 258 bus3.jpg 128 x KB Imagem JPEG bus4.jpg 128 x KB Imagem JPEG bus5.jpg 128 x KB Imagem JPEG bus6.jpg 128 x KB Imagem JPEG Subaru No subdiretório Subaru, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Carros/Subaru, encontram-se as texturas utilizadas no modelo de um dos carros controláveis do jogo. As texturas contidas neste subdiretório são apresentadas a seguir:

261 259 Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização subaru1.jpg 512 x KB Imagem JPEG subaru2.jpg 512 x KB Imagem JPEG subaru3.jpg 128 x KB Imagem JPEG

262 260 subaru4.jpg 256 x KB Imagem JPEG HUD No subdiretório HUD, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/HUD, encontram-se as texturas utilizadas no HUD do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização barra_de_vida.png 162 x KB Imagem PNG displaytacom.png 269 x KB Imagem PNG icone abacaxi.png 484 x KB Imagem PNG

263 261 icone bala.png 419 x KB Imagem PNG icone cubogelo.png 360 x KB Imagem PNG icone medkit.png 369 x KB Imagem PNG icone mina.png 369 x KB Imagem PNG icone missilfase3.png 360 x KB Imagem PNG icone missilfase4.png 360 x KB Imagem PNG minimap.png 261 x KB Imagem PNG

264 262 minimapcar.png 58 x 57 2 KB Imagem PNG minimapenemy1.png 58 x 57 1 KB Imagem PNG minimapenemy2.png 58 x 57 1 KB Imagem PNG minimapenemy3.png 58 x 57 1 KB Imagem PNG minimapmoldura.png 261 x KB Imagem PNG minimapself.png 58 x 57 1 KB Imagem PNG minimaptrophy.png 58 x 57 5 KB Imagem PNG moldura.png 162 x KB Imagem PNG ponteiro.png 203 x 51 2 KB Imagem PNG star1_ic.png 256 x KB Imagem PNG star2_ic.png 256 x KB Imagem PNG

265 263 tacometro.png 320 x KB Imagem PNG Objetos No subdiretório Objetos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos, encontram-se texturas que foram utilizadas nos objetos dos cenários das fases do jogo, além de outros subdiretórios que serão descritos nas sub-sessões de a As texturas presentes na raiz do subdiretório Objetos são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização easy.png 674 x KB hard.png 674 x KB load1.png 674 x KB load2.png 674 x KB load3.png 674 x KB loadgame.png 673 x KB Imagem PNG Imagem PNG Imagem PNG Imagem PNG Imagem PNG Imagem PNG logounicamp.jpg 3600 x KB Imagem JPEG

266 264 normal.png 674 x KB Imagem PNG placa_survivors.jpg 512 x KB Imagem JPEG placa_survivors2.jpg 512 x KB Imagem JPEG quit.png 674 x KB savegame.png 673 x KB Imagem PNG Imagem PNG target.png 76 x 76 1 KB Imagem PNG tijolo.jpg 512 x KB Imagem JPEG arvore com neve No subdiretório arvore com neve, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/arvore com neve, encontra-se a textura utilizada no modelo arvore com neve do jogo.

267 265 A textura contida neste subdiretório é apresentada a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 128 x KB Imagem JPEG arvore seca No subdiretório arvore seca, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/arvore seca, encontra-se a textura utilizada no modelo arvore seca do jogo. A textura contida neste subdiretório é apresentada a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 256 x KB Imagem JPEG boneco de neve 2 No subdiretório boneco de neve 2, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/boneco de neve 2, encontra-se a textura utilizada no modelo boneco de neve 2 do jogo.

268 266 A textura contida neste subdiretório é apresentada a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 256 x KB Imagem JPEG cactus No subdiretório cactus, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/cactus, encontramse as texturas utilizadas no modelo cactus do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 128 x KB Imagem JPEG texture1.jpg 128 x KB Imagem JPEG

269 Carrinho No subdiretório Carrinho, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/Carrinho, encontra-se a textura utilizada no modelo carrinho do jogo. A textura contida neste subdiretório é apresentada a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.png 128 x KB Imagem PNG carruagem No subdiretório carruagem, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/carruagem, encontram-se as texturas utilizadas no modelo carruagem do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 256 x KB Imagem JPEG

270 268 texture1.jpg 256 x KB Imagem JPEG texture2.jpg 256 x KB Imagem JPEG texture3.jpg 128 x KB Imagem JPEG texture4.jpg 256 x KB Imagem JPEG texture5.jpg 128 x KB Imagem JPEG

271 269 texture6.jpg 256 x KB Imagem JPEG texture7.jpg 256 x KB Imagem JPEG texture8.jpg 256 x KB Imagem JPEG texture9.jpg 256 x KB Imagem JPEG

272 270 texture10.jpg 256 x KB Imagem JPEG texture11.jpg 128 x KB Imagem JPEG texture12.jpg 256 x KB Imagem JPEG texture13.jpg 512 x KB Imagem JPEG

273 casa com neve No subdiretório casa com neve, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/casa com neve, encontram-se as texturas utilizadas no modelo casa com neve do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 384 x KB Imagem JPEG texture1.jpg 128 x KB Imagem JPEG texture2.jpg 341 x KB Imagem JPEG texture3.jpg 256 x KB Imagem JPEG

274 272 texture4.jpg 189 x KB Imagem JPEG texture5.jpg 256 x KB Imagem JPEG Cogumelo1 No subdiretório Cogumelo1, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/Cogumelo1, encontram-se as texturas utilizadas no modelo cogumelo1 do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização cogumelo1_texture0.jp g 396 x KB Imagem JPEG cogumelo2_texture0.jp g 114 x 74 3 KB Imagem JPEG

275 Creditos No subdiretório Creditos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/Creditos, encontram-se as texturas utilizadas na cena de créditos do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização Carlos Augusto Ribeiro Mantovani.jpg 3600 x KB Imagem JPEG class.jpg 3600 x KB Imagem JPEG Conrado Silva Miranda.jpg 3600 x KB Imagem JPEG

276 274 credits.jpg 3600 x KB Imagem JPEG Development Team.jpg 3600 x KB Imagem JPEG Jose Mario De Martino.jpg 3600 x KB Imagem JPEG Klaus Raizer.jpg 3600 x KB Imagem JPEG

277 275 Natasha Sayuri Dias Nakashima.jpg 3600 x KB Imagem JPEG Rafael Guimaraes Ramos.jpg 3600 x KB Imagem JPEG realization.jpg 3600 x KB Imagem JPEG supervision.jpg 3600 x KB Imagem JPEG

278 276 Tiago Fernandes Tavares.jpg 3600 x KB Imagem JPEG Galpao No subdiretório Galpao, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/Galpao, encontram-se as texturas do modelo de galpão do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 256 x KB Imagem JPEG texture1.png 117 x KB Imagem PNG texture2.jpg 432 x KB Imagem JPEG texture3.jpg 432 x KB Imagem JPEG

279 277 texture4.jpg 256 x KB Imagem JPEG texture5.png 407 x KB Imagem PNG texture6.jpg 128 x KB Imagem JPEG texture7.jpg 256 x KB Imagem JPEG Hidrante No subdiretório Hidrante, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/Hidrante, encontram-se as texturas do modelo de hidrante do jogo. As texturas contidas neste subdiretório são apresentadas a seguir:

280 278 Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 128 x KB Imagem JPEG texture1.jpg 128 x KB Imagem JPEG pedra_deserto No subdiretório pedra_deserto, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/pedra_deserto, encontra-se a textura do modelo pedra_deserto do jogo. A textura contida neste subdiretório é apresentada a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 128 x KB Imagem JPEG placas No subdiretório placas, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/placas, encontramse as texturas do modelo de placa do jogo.

281 279 As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 256 x KB Imagem JPEG texture1.jpg 512 x KB Imagem JPEG texture2.jpg 1024 x KB Imagem JPEG poco No subdiretório poco, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/poco, encontram-se as texturas do modelo de poço do jogo. As texturas contidas neste subdiretório são apresentadas a seguir:

282 280 Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 256 x KB Imagem JPEG texture1.jpg 256 x KB Imagem JPEG texture2.jpg 256 x KB Imagem JPEG texture3.jpg 256 x KB Imagem JPEG texture4.jpg 81 x KB Imagem JPEG

283 Ponte No subdiretório Ponte, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/Ponte, encontram-se as texturas do modelo de ponte do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização footbridgetexture.psd 1024 x KB Adobe Photoshop PSD footbridgetexture2.psd 1024 x KB Adobe Photoshop PSD snowman No subdiretório snowman, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/snowman, encontra-se a textura do modelo snowman do jogo. A textura contida neste subdiretório é apresentada a seguir:

284 282 Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 1024 x KB Imagem JPEG Tronco No subdiretório Tronco, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/Tronco, encontramse as texturas do modelo de tronco do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização tronco_texture0.jpg 500 x KB Imagem JPEG tronco_texture1.jpg 500 x KB Imagem JPEG

285 283 tronco_texture2.jpg 500 x KB Imagem JPEG tronco_texture3.jpg 256 x KB Imagem JPEG tronco_texture4.jpg 256 x KB Imagem JPEG Troncos No subdiretório Troncos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Objetos/Troncos, encontram-se as texturas do modelo de troncos do jogo. As texturas contidas neste subdiretório são apresentadas a seguir:

286 284 Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização texture0.jpg 497 x KB Imagem JPEG texture1.jpg 1105 x KB Imagem JPEG texture2.jpg 1105 x KB Imagem JPEG Skyboxes No subdiretório Skyboxes, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Skyboxes, encontra-se uma textura que foi utilizada como fundo para a cena da tela de splash com o logotipo da Unicamp e o subdiretório Ceu que será descrito na sub-sessão A textura contida na raiz do subdiretório Skyboxes é apresentada a seguir:

287 285 Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização fundo - Cena Splash.jpg 16 x KB Imagem JPEG Ceu No subdiretório Ceu, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Skyboxes/Ceu, encontramse as texturas utilizadas para ilustrar o céu das fases do jogo. As texturas contidas neste subdiretório são apresentadas a seguir: Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização back.jpg 512 x KB Imagem JPEG down.jpg 16 x 16 1 KB Imagem JPEG front.jpg 512 x KB Imagem JPEG

288 286 left.jpg 512 x KB Imagem JPEG right.jpg 512 x KB Imagem JPEG up.jpg 512 x KB Imagem JPEG Terrenos No subdiretório Terrenos, cujo caminho a partir do diretório principal do projeto é: Survivors/Assets/Assets Survivors/Textures/Terrenos, encontram-se as texturas utilizadas nos terrenos das fases do jogo. As texturas contidas neste subdiretório são apresentadas a seguir:

289 287 Arquivo Dimensões (pixels) Tamanho Formato Pré-visualização asfalto.jpg 512 x KB Imagem JPEG asfalto_fase4.psd 512 x KB Adobe Photoshop PSD grama.psd 512 x KB Adobe Photoshop PSD montanha.psd 512 x KB Adobe Photoshop PSD neve.psd 512 x KB Adobe Photoshop PSD neve2.psd 512 x KB Adobe Photoshop PSD

290 288 ANEXO E SOFTWARES UTILIZADOS PARA O DESENVOLVIMENTO DE SURVIVORS RESUMO Este capítulo aborda as principais ferramentas utilizadas no desenvolvimento do software. Primeiramente serão apresentados o Google Sketchup e o Blender 3D, que são softwares para modelagem e animações 3D e em seguida, a plataforma Unity 3D, sobre a qual o jogo foi desenvolvido. GOOGLE SKETCHUP O Google SketchUp é um software proprietário para a criação de modelos 3D no computador. O programa devido a sua versatilidade, pode ser usado por qualquer atividade profissional, tais como engenheiros civis, mecânico, desenvolvedores de games, e diversas outras profissões relacionadas. Contudo, ainda são os arquitetos os principais utilizadores deste software. O SketchUp é utilizado sobretudo para criar facilmente modelos arquitetônicos em 3D, eliminando muitas vezes a necessidade da confecção de maquetes de papel, papelão, e outros materiais. O resultado é um modelo que pode ser usado para gerar um filme ou imagens de qualquer ângulo de perspectiva que seja desejada. O sotware é sobretudo usado na fase inicial do trabalho do arquiteto, a criação do esboço. Daí também o seu nome: "Sketch" que significa esboço em inglês. Muitos arquitetos usam o SketchUp na fase inicial do trabalho, quando ainda têm a liberdade de alterar as formas e volumes. O SketchUp permite-lhes alterar o modelo rapidamente e verificar as consequências dessas alterações no resultado final. Abaixo, pode-se ver a interface do SketchUp.

291 289 Interface do Google SketchUp. BLENDER 3D O Blender, também chamado de Blender 3D é um software, sob licença GNU-GPL, desenvolvido pela organização independente e sem fins lucrativos Blender Foundation. Este programa está disponível para diversos sistemas operacionais e possui recursos e funcionalidades voltadas para a modelagem 3D, animações, texturizações, renderizações e edição de vídeos, além de possuir um motor de jogos integrado, o qual permite e a criação de aplicações interativas como jogos e apresentações. Este software pode ser adquirido através de download gratuito no site da organização (Blender Foundation). Em relação a outros softwares de modelagem 3D, o Blender 3D se diferencia pelo fato de possuir uma interface gráfica pouco amigável e utilizar muitos atalhos de teclado, os quais podem gerar grandes dificuldades no primeiro contato com o programa. Entretanto, com o tempo, ganha-se muito em termos de rapidez de desenvolvimento (BRITO, 2006). A figura abaixo mostra a inteface do Blender 3D.

ENG1000 Introdução à Engenharia

ENG1000 Introdução à Engenharia ENG1000 Introdução à Engenharia Aula 03 Game Design Document Edirlei Soares de Lima Game Design Document Um Game Design Document (GDD) é um documento que descreve todos aspectos

Leia mais

Microsoft Office PowerPoint 2007

Microsoft Office PowerPoint 2007 INTRODUÇÃO AO MICROSOFT POWERPOINT 2007 O Microsoft Office PowerPoint 2007 é um programa destinado à criação de apresentação através de Slides. A apresentação é um conjunto de Sides que são exibidos em

Leia mais

ANDRÉ APARECIDO DA SILVA APOSTILA BÁSICA SOBRE O POWERPOINT 2007

ANDRÉ APARECIDO DA SILVA APOSTILA BÁSICA SOBRE O POWERPOINT 2007 ANDRÉ APARECIDO DA SILVA APOSTILA BÁSICA SOBRE O POWERPOINT 2007 CURITIBA 2015 2 SUMÁRIO INTRODUÇÃO AO MICROSOFT POWERPOINT 2007... 3 JANELA PRINCIPAL... 3 1 - BOTÃO OFFICE... 4 2 - FERRAMENTAS DE ACESSO

Leia mais

Fancy Battles Game Design Document

Fancy Battles Game Design Document Fancy Battles Game Design Document 2011 Versão 0.1-29/03/2011 Primeira edição 0.2-28/04/2011 Definição de novo Gameplay Regras Controles 0.3-12/05/2011 Alterações no Gameplay Índice 1. Conceito Principal

Leia mais

CTRL-SHIFT DOCUMENTO DE GAME DESIGN DESENVOLVIDO POR HILGAMES

CTRL-SHIFT DOCUMENTO DE GAME DESIGN DESENVOLVIDO POR HILGAMES CTRL-SHIFT DOCUMENTO DE GAME DESIGN DESENVOLVIDO POR HILGAMES 1. Introdução CTRL-SHIFT é um jogo de puzzle, plataforma 2D e 3D ao mesmo tempo. O jogador navega por um cenário de plataformas 2D, e quando

Leia mais

Game Design: A segurança da humanidade em suas mãos

Game Design: A segurança da humanidade em suas mãos Game Design: A segurança da humanidade em suas mãos Todos Direitos Reservados 2013 Bruno Ruaro Confortin Versão # 1.01 22/04/2013 Índice 1. INTRODUÇÃO 4 2. VISÃO GERAL DO JOGO 5 QUANTO AO TIPO DE OBJETOS

Leia mais

APOSTILA DE EXEMPLO. (Esta é só uma reprodução parcial do conteúdo)

APOSTILA DE EXEMPLO. (Esta é só uma reprodução parcial do conteúdo) APOSTILA DE EXEMPLO (Esta é só uma reprodução parcial do conteúdo) 1 Índice Aula 1 - Área de trabalho e personalizando o sistema... 3 A área de trabalho... 3 Partes da área de trabalho.... 4 O Menu Iniciar:...

Leia mais

PROJETO 2 Analise da funcionalidade do tutorial do jogo League of Legends.

PROJETO 2 Analise da funcionalidade do tutorial do jogo League of Legends. Universidade Estadual de Campinas Departamento de Multimeios Comunicação Social Habilitação em Midialogia Gian Daher Berselli - RA:095742 João Baptista Alves Boccaletto - RA: 093909 Disciplina CS405 Educação

Leia mais

Manual do Usuário Android Neocontrol

Manual do Usuário Android Neocontrol Manual do Usuário Android Neocontrol Sumário 1.Licença e Direitos Autorais...3 2.Sobre o produto...4 3. Instalando, Atualizando e executando o Android Neocontrol em seu aparelho...5 3.1. Instalando o aplicativo...5

Leia mais

PORTAL DE COMPRAS SÃO JOSÉ DO RIO PRETO

PORTAL DE COMPRAS SÃO JOSÉ DO RIO PRETO Compra Direta - Guia do Fornecedor PORTAL DE COMPRAS SÃO JOSÉ DO RIO PRETO Página As informações contidas neste documento, incluindo quaisquer URLs e outras possíveis referências a web sites, estão sujeitas

Leia mais

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas Microsoft Power Point 2003 No Microsoft PowerPoint 2003, você cria sua apresentação usando apenas um arquivo, ele contém tudo o que você precisa uma estrutura para sua apresentação, os slides, o material

Leia mais

ÍNDICE MANUAL SITE ADMINISTRÁVEL TV. 1. Introdução 2. Acessando o site administrável/webtv SITE ADMINISTRÁVEL 3. CONFIGURAÇÕES

ÍNDICE MANUAL SITE ADMINISTRÁVEL TV. 1. Introdução 2. Acessando o site administrável/webtv SITE ADMINISTRÁVEL 3. CONFIGURAÇÕES MANUAL SITE ADMINISTRÁVEL TV ÍNDICE 1. Introdução 2. Acessando o site administrável/webtv SITE ADMINISTRÁVEL 3. CONFIGURAÇÕES 3.1 - Dados Cadastrais 3.2 - Noticias 3.3 Redes Sociais 3.4 - Player 4. DESIGN

Leia mais

COLÉGIO ESTADUAL PAULO LEMINSKI APOSTILA SOBRE O BROFFICE IMPRESS

COLÉGIO ESTADUAL PAULO LEMINSKI APOSTILA SOBRE O BROFFICE IMPRESS COLÉGIO ESTADUAL PAULO LEMINSKI APOSTILA SOBRE O BROFFICE IMPRESS CURITIBA 2014 2 Conteúdo Definição:... 2 Detalhando a tela:... 4 BARRA DE FERRAMENTAS DESENHO... 4 PREENCHIMENTOS... 5 RÉGUAS E GUIAS...

Leia mais

NAPNE / RENAPI. Software Educativo Smart Panda 1.0

NAPNE / RENAPI. Software Educativo Smart Panda 1.0 NAPNE / RENAPI Software Educativo Smart Panda 1.0 Julho de 2011 Sumário 1 Introdução... 3 2 Tela Inicial... 3 2.1 Tela de Abertura... 4 3 Como jogar... 5 4 Opções... 6 5 E como fazer para registrar este

Leia mais

Acessando o SVN. Soluções em Vendas Ninfa 2

Acessando o SVN. Soluções em Vendas Ninfa 2 Acessando o SVN Para acessar o SVN é necessário um código de usuário e senha, o código de usuário do SVN é o código de cadastro da sua representação na Ninfa, a senha no primeiro acesso é o mesmo código,

Leia mais

Criando Quiz com BrOffice.impress

Criando Quiz com BrOffice.impress Criando Quiz com BrOfficeimpress A ferramenta de apresentação possibilita o desenvolvimento de várias atividades interativas como: Sete erros Quiz (Perguntas/Respostas), Colocar em ordem objetos, alfabeto,

Leia mais

Dicas de uso - Render Up

Dicas de uso - Render Up Dicas de uso - Render Up (versão 3.6.7 ou superior) Desenvolvido por: Promob Software Solutions Rua dos Cinamomos - 517 - Cinquentenário CEP 95012-140 - Caxias do Sul - RS Brasil Fone/Fax: 54 3209 9200

Leia mais

SOFTWARES EDUCATIVOS MANUAL TUX MATH 1.9.0 BENTO GONÇALVES

SOFTWARES EDUCATIVOS MANUAL TUX MATH 1.9.0 BENTO GONÇALVES SOFTWARES EDUCATIVOS MANUAL TUX MATH 1.9.0 BENTO GONÇALVES Março de 2015 Sumário Apresentação do Software... 3 O que é?... 3 Requisitos... 3 Objetivos... 3 Como funciona?... 4 Link para download... 4 Comandos

Leia mais

PASSO A PASSO MOVIE MAKER

PASSO A PASSO MOVIE MAKER PASSO A PASSO MOVIE MAKER Nesta etapa, você deverá apresentar o programa e ajudá-los a montarem o filme. Veja como é fácil. Siga as instruções do passo-a-passo: DICA O que é o Movie Maker? Com o Microsoft

Leia mais

Aula 03 PowerPoint 2007

Aula 03 PowerPoint 2007 Aula 03 PowerPoint 2007 Professor: Bruno Gomes Disciplina: Informática Básica Curso: Gestão de Turismo Sumário da aula: 1. Abrindo o PowerPoint; 2. Conhecendo a Tela do PowerPoint; 3. Criando uma Nova

Leia mais

Treinamento GVcollege Módulo Acadêmico - Pedagógico

Treinamento GVcollege Módulo Acadêmico - Pedagógico Treinamento GVcollege Módulo Acadêmico - Pedagógico 2015 GVDASA Sistemas Pedagógico 2 AVISO O conteúdo deste documento é de propriedade intelectual exclusiva da GVDASA Sistemas e está sujeito a alterações

Leia mais

Manual Simulador de Loja

Manual Simulador de Loja Manual Simulador de Loja Índice Início Menu Loja Modelo Loja Modelo Menu Criar Minha Loja Criar Minha Loja Abrir Projeto Salvo Teste Seu Conhecimento 0 04 05 08 09 8 9 0 Início 5 4 Figura 00. Tela inicial.

Leia mais

GUIA DE TELAS IHM Delta ARVTi 2000

GUIA DE TELAS IHM Delta ARVTi 2000 GUIA DE TELAS IHM Delta ARVTi 2000 Revisão 00 de 02/06/10 Direitos Reservados à Todas as informações contidas neste manual são de uso exclusivo da Equipamentos Eletrônicos Ltda., não podendo ser reproduzidas,

Leia mais

Apostila de Windows Movie Maker

Apostila de Windows Movie Maker Apostila de Windows Movie Maker Autor: João Paulo da Silva Apostila de Windows Movie Maker Autor: João Paulo da Silva 2 Índice Introdução ao Windows Movie Maker...03 O que é o Windows Movie Maker?...03

Leia mais

Controle do Arquivo Técnico

Controle do Arquivo Técnico Controle do Arquivo Técnico Os documentos existentes de forma física (papel) no escritório devem ser guardados em pastas (normalmente pastas suspensas) localizadas no Arquivo Técnico. Este Arquivo pode

Leia mais

Google Drive. Passos. Configurando o Google Drive

Google Drive. Passos. Configurando o Google Drive Google Drive um sistema de armazenagem de arquivos ligado à sua conta Google e acessível via Internet, desta forma você pode acessar seus arquivos a partir de qualquer dispositivo que tenha acesso à Internet.

Leia mais

Follow-Up Acompanhamento Eletrônico de Processos (versão 3.0) Manual do Sistema. 1. Como acessar o sistema Requisitos mínimos e compatibilidade

Follow-Up Acompanhamento Eletrônico de Processos (versão 3.0) Manual do Sistema. 1. Como acessar o sistema Requisitos mínimos e compatibilidade do Sistema Índice Página 1. Como acessar o sistema 1.1 Requisitos mínimos e compatibilidade 03 2. Como configurar o Sistema 2.1 Painel de Controle 2.2 Informando o nome da Comissária 2.3 Escolhendo a Cor

Leia mais

Manual de Utilização do Sistema GRServer Cam on-line (Gerenciamento de Câmeras On-line)

Manual de Utilização do Sistema GRServer Cam on-line (Gerenciamento de Câmeras On-line) Manual de Utilização do Sistema GRServer Cam on-line (Gerenciamento de Câmeras On-line) Criamos, desenvolvemos e aperfeiçoamos ferramentas que tragam a nossos parceiros e clientes grandes oportunidades

Leia mais

Gestão de Ativos. Manual do Usuário. Treinamento Fase 1 (TRN 01)

Gestão de Ativos. Manual do Usuário. Treinamento Fase 1 (TRN 01) Gestão de Ativos Manual do Usuário Treinamento Fase 1 (TRN 01) Índice 1. Introdução... 3 2. Movimentações de Ativos... 4 2.1. Monitoração... 4 2.1.1. Monitor de Movimentação de Ativos...4 2.2. Transações...15

Leia mais

1 UNIT Universidade do Trabalhador Dr. Abel dos Santos Nunes

1 UNIT Universidade do Trabalhador Dr. Abel dos Santos Nunes 1 UNIT Universidade do Trabalhador Dr. Abel dos Santos Nunes Janelas são estruturas do software que guardam todo o conteúdo exibido de um programa, cada vez que um aplicativo é solicitado à janela do sistema

Leia mais

Manual Software Controle de Jukebox. Manual. Software Controle de Jukebox

Manual Software Controle de Jukebox. Manual. Software Controle de Jukebox Manual Software Controle de Jukebox Versão 1.0 2014 Sumário 1. Principais Características... 2 2. Software Controle de Jukebox... 3 I. Tela Principal... 4 1 Data Cobrança... 4 2 Linha... 4 3 Cobrador...

Leia mais

O Windows 7 é um sistema operacional desenvolvido pela Microsoft.

O Windows 7 é um sistema operacional desenvolvido pela Microsoft. Introdução ao Microsoft Windows 7 O Windows 7 é um sistema operacional desenvolvido pela Microsoft. Visualmente o Windows 7 possui uma interface muito intuitiva, facilitando a experiência individual do

Leia mais

ALBUM DE FOTOGRAFIAS NO POWER POINT

ALBUM DE FOTOGRAFIAS NO POWER POINT ALBUM DE FOTOGRAFIAS NO POWER POINT O PowerPoint é uma poderosa ferramenta que faz parte do pacote Office da Microsoft. O principal uso desse programa é a criação de apresentação de slides, para mostrar

Leia mais

Caso já seja usuário do SCAW siga as instruções a partir da página X.

Caso já seja usuário do SCAW siga as instruções a partir da página X. Caso já seja usuário do SCAW siga as instruções a partir da página X. Para iniciar o sistema dê um duplo clique no ícone, que se encontra na área de trabalho. 1 Login do sistema. Esta é a tela de login

Leia mais

Manual Portal Ambipar

Manual Portal Ambipar Manual Portal Ambipar Acesso Para acessar o Portal Ambipar, visite http://ambipar.educaquiz.com.br. Login Para efetuar o login no Portal será necessário o e-mail do Colaborador e a senha padrão, caso a

Leia mais

Tema UFPel 2.0 WP Institucional Guia de Opções de Personalização

Tema UFPel 2.0 WP Institucional Guia de Opções de Personalização Tema UFPel 2.0 WP Institucional Guia de Opções de Personalização Sumário 1. Configurações Iniciais...2 1.1. Configurando o Menu Personalizado...2 1.2. Configurando os Widgets...3 2. Localize o nome de

Leia mais

C D. C) Coleções: é usada para organizar o conteúdo de áudio, vídeo e imagens em pastas, buscando facilitar a montagem do storyboard.

C D. C) Coleções: é usada para organizar o conteúdo de áudio, vídeo e imagens em pastas, buscando facilitar a montagem do storyboard. 1 Windows Movie Maker XP O Windows Movie Maker é um software de edição de vídeos que permite criar e editar filmes caseiros, inserindo efeitos, músicas, legendas e transições. O vídeo pode ser criado a

Leia mais

1. Introdução. Avaliação de Usabilidade Página 1

1. Introdução. Avaliação de Usabilidade Página 1 1. Introdução Avaliação de Usabilidade Página 1 Os procedimentos da Avaliação Heurística correspondem às quatro fases abaixo e no final é apresentado como resultado, uma lista de problemas de usabilidade,

Leia mais

Procedimento para reinstalação dos aplicativos da mesa multi-toque através da imagem do sistema.

Procedimento para reinstalação dos aplicativos da mesa multi-toque através da imagem do sistema. Procedimento para reinstalação dos aplicativos da mesa multi-toque através da imagem do sistema. 1) Materiais a serem utilizados - Para realizar este procedimento deve-se estar de posse dos seguintes itens:

Leia mais

COMO USAR DOIS MONITORES NO WINDOWS 8

COMO USAR DOIS MONITORES NO WINDOWS 8 COMO USAR DOIS MONITORES NO WINDOWS 8 Trabalhar com dois monitores no Windows tem diversas utilidades. Dentre elas podemos destacar a possibilidade de visualizar mais itens ao mesmo tempo, exibir o conteúdo

Leia mais

Game Design: Creepy Castle

Game Design: Creepy Castle Game Design: Creepy Castle Flee or Die Todos Direitos Reservados 2013 Allan Elias Ramos Versão #1.0 12/04/2013 Índice 1. INTRODUÇÃO 3 2. VISÃO GERAL DO JOGO 4 QUANTO AO TIPO DE OBJETOS MANIPULADOS 4 QUANTO

Leia mais

INF1771 - INTELIGÊNCIA ARTIFICIAL TRABALHO 2 LÓGICA

INF1771 - INTELIGÊNCIA ARTIFICIAL TRABALHO 2 LÓGICA INF1771 - INTELIGÊNCIA ARTIFICIAL TRABALHO 2 LÓGICA Descrição: Após reunir a equipe de programadores para participar do 1 Concurso Mundial de Desenvolvimento de Softwares, Barbie e seus amigos iniciaram

Leia mais

Construtor de sites SoftPixel GUIA RÁPIDO - 1 -

Construtor de sites SoftPixel GUIA RÁPIDO - 1 - GUIA RÁPIDO - 1 - Sumário Introdução...3 Por que utilizar o Construtor de Sites?...3 Vantagens do Construtor de Sites...3 Conceitos básicos...3 Configuração básica do site...5 Definindo o layout/template

Leia mais

UNIVERSIDADE ESTADUAL DE CAMPINAS. Instruções para Uso do Software VISIO

UNIVERSIDADE ESTADUAL DE CAMPINAS. Instruções para Uso do Software VISIO UNIVERSIDADE ESTADUAL DE CAMPINAS Instruções para Uso do Software VISIO Fevereiro/2006 Instruções para uso do Visio... 03 Instruções para Uso do Software VISIO 2 Instruções para uso do Visio O Visio 2003...

Leia mais

www.portalfuturum.com.br

www.portalfuturum.com.br www.portalfuturum.com.br GEOGRAFIA Solos GUIA RÁPIDO DO AMBIENTE DE FORMAÇÃO DO PORTAL FUTURUM Prezado(a) cursista, Bem-vindo(a) ao Ambiente de Formação do Portal Futurum (AFPF)!!! A proposta deste material

Leia mais

MANUAL DO ALUNO PARA NAVEGAR NO AMBIENTE VIRTUAL DE APRENDIZAGEM - AVA

MANUAL DO ALUNO PARA NAVEGAR NO AMBIENTE VIRTUAL DE APRENDIZAGEM - AVA MANUAL DO ALUNO PARA NAVEGAR NO AMBIENTE VIRTUAL DE APRENDIZAGEM - AVA MANUAL DO ALUNO PARA ACESSO AO AMBIENTE VIRTUAL DE APRENDIZAGEM Conteúdo Tela de acesso... 4 Dados de Cadastro... 5 Dados cadastrais...

Leia mais

Especificação técnica de Videodetecção ECD/DAI

Especificação técnica de Videodetecção ECD/DAI Especificação técnica de Videodetecção ECD/DAI 1. Esta Especificação destina se a orientar as linhas gerais para o fornecimento de equipamentos. Devido às especificidades de cada central e de cada aplicação,

Leia mais

A4 Projeto Integrador e Lista de Jogos

A4 Projeto Integrador e Lista de Jogos A4 Projeto Integrador e Lista de Jogos 1ª ETAPA PROJETO INTEGRADOR (2 pontos na A4) Como discutido em sala de aula, a disciplina de algoritmos I também fará parte do projeto integrador, para cada grupo

Leia mais

MANUAL DE INSTALAÇÃO DO ODONTO TECHNOLOGY

MANUAL DE INSTALAÇÃO DO ODONTO TECHNOLOGY MANUAL DE INSTALAÇÃO DO ODONTO TECHNOLOGY 1 Índice I - Prefácio...3 II - Instalação do tipo servidor...4 III Obter o nome do computador servidor...17 IV Instalação do tipo cliente...19 V Como inserir a

Leia mais

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET I Sumário 1. Objetivo do Documento... 1 2. Início... 1 3. Cadastro de Pessoa Física... 3 3.1. Preenchimentos Obrigatórios.... 4 3.2. Acesso aos Campos

Leia mais

PDFsam. Manual de Operação. Superior Tribunal de Justiça. Fevereiro/2012 versão 01 - Manual montado por Rafael Verlangieri

PDFsam. Manual de Operação. Superior Tribunal de Justiça. Fevereiro/2012 versão 01 - Manual montado por Rafael Verlangieri PDFsam Manual de Operação Superior Tribunal de Justiça Índice Visão Geral 3 Acessando o Programa 3 Descrição da Tela Principal 4 Serviços disponíveis no PDFSAM 5 Compositor Visual de Documentos 5 Procedimento:

Leia mais

SUMÁRIO TUTORIAL DO HQ. 2 DICAS PEDAGÓGICAS:. 2 DOWNLOAD DA INSTALAÇÃO. 2 PASSO 1 FORMULÁRIO PARA DOWNLOAD. 2 PASSO 2 ESCOLHENDO A VERSÃO.

SUMÁRIO TUTORIAL DO HQ. 2 DICAS PEDAGÓGICAS:. 2 DOWNLOAD DA INSTALAÇÃO. 2 PASSO 1 FORMULÁRIO PARA DOWNLOAD. 2 PASSO 2 ESCOLHENDO A VERSÃO. SUMÁRIO TUTORIAL DO HQ... 2 DICAS PEDAGÓGICAS:... 2 DOWNLOAD DA INSTALAÇÃO... 2 PASSO 1 FORMULÁRIO PARA DOWNLOAD... 2 PASSO 2 ESCOLHENDO A VERSÃO... 3 PASSO 3 INSTRUÇÕES DE INSTALAÇÃO... 4 CRIANDO NOVAS

Leia mais

HCT Compatibilidade Manual do Usuário

HCT Compatibilidade Manual do Usuário HCT Compatibilidade Manual do Usuário Índice Introdução...3 HCT Compatibilidade...3 Librix...3 Execução do Programa...4 Seleção de Testes...4 Testes Manuais...6 Teste de Teclado...6 Teste de Vídeo...7

Leia mais

Ambiente Visual para o Desenvolvimento de Jogos Eletrônicos

Ambiente Visual para o Desenvolvimento de Jogos Eletrônicos Ambiente Visual para o Desenvolvimento de Jogos Eletrônicos Diego Cordeiro Barboza 1, Júlio César da Silva 2 1 UNIFESO, Centro de Ciências e Tecnologia, Curso de Ciência da Computação, diego.cbarboza@gmail.com

Leia mais

Desenvolvimento de Jogos 2D. Gutenberg Neto gutenberg@fuze.cc

Desenvolvimento de Jogos 2D. Gutenberg Neto gutenberg@fuze.cc Desenvolvimento de Jogos 2D Gutenberg Neto gutenberg@fuze.cc Inteligência Artificial Definição de comportamento de NPCs (personagens não-jogáveis) de forma a simular inteligência IA em jogos não necessariamente

Leia mais

Programa Intel Educar Tutorial: Ferramenta de Classificação Visual

Programa Intel Educar Tutorial: Ferramenta de Classificação Visual Copyright 2008, Intel Corporation. Todos os direitos reservados. Página 1 de 17 TUTORIAL: FERRAMENTA DE CLASSIFICAÇÃO VISUAL ÍNDICE 1. Acessando a ferramenta... 3 2. Como se cadastrar... 4 3. Usando a

Leia mais

Você sabia que o computador pode ser uma rica ferramenta no. processo de inclusão escolar e social de crianças com necessidades

Você sabia que o computador pode ser uma rica ferramenta no. processo de inclusão escolar e social de crianças com necessidades Você sabia que o computador pode ser uma rica ferramenta no processo de inclusão escolar e social de crianças com necessidades educacionais especiais? Juliana Moraes Almeida Silva Em várias situações do

Leia mais

Universidade Estadual de Campinas Faculdade de Educação Laboratório de Novas Tecnologias Aplicadas à Educação

Universidade Estadual de Campinas Faculdade de Educação Laboratório de Novas Tecnologias Aplicadas à Educação Universidade Estadual de Campinas Faculdade de Educação Laboratório de Novas Tecnologias Aplicadas à Educação Guia didático para professores sobre o Windows Movie Maker Prof. Dr Sérgio Ferreira Amaral

Leia mais

Sumário. Tutorial: Editor de Exercícios Online para o professor

Sumário. Tutorial: Editor de Exercícios Online para o professor 1 Sumário Inserir Exercícios... 4 Minhas Avaliações... 5 Cadastrar perguntas... 7 Inserindo imagens... 10 Inserindo arquivos... 13 Inserindo vídeos... 15 Gerenciador de fórmulas e equações matemáticas...

Leia mais

Introdução ao Aplicativo de Programação LEGO MINDSTORMS Education EV3

Introdução ao Aplicativo de Programação LEGO MINDSTORMS Education EV3 Introdução ao Aplicativo de Programação LEGO MINDSTORMS Education EV3 A LEGO Education tem o prazer de trazer até você a edição para tablet do Software LEGO MINDSTORMS Education EV3 - um jeito divertido

Leia mais

Tutorial Administrativo (Backoffice)

Tutorial Administrativo (Backoffice) Manual - Software ENTRANDO NO SISTEMA BACKOFFICE Para entrar no sitema Backoffice, digite no seu navegador de internet o seguinte endereço: http://pesquisa.webbyapp.com/ Entre com o login e senha. Caso

Leia mais

Guia Site Empresarial

Guia Site Empresarial Guia Site Empresarial Índice 1 - Fazer Fatura... 2 1.1 - Fazer uma nova fatura por valores de crédito... 2 1.2 - Fazer fatura alterando limites dos cartões... 6 1.3 - Fazer fatura repetindo última solicitação

Leia mais

Análise de Dados do Financeiro

Análise de Dados do Financeiro Análise de Dados do Financeiro Introdução Para reunir em um só local as informações de contas a pagar e receber cadastradas e/ou geradas no sistema TTransp existe a interface de análise de dados do financeiro.

Leia mais

Turma. PowerPoint 2003

Turma. PowerPoint 2003 PowerPoint 2003 Apresentação O Power Point é um aplicativo do Microsoft Office direcionado à criação de apresentações. Com ele você poderá criar rapidamente slides com esquemas, textos animados, sons e

Leia mais

PRINCÍPIOS DE INFORMÁTICA PRÁTICA 08 1. OBJETIVO 2. BASE TEÓRICA. 2.1 Criando Mapas no Excel. 2.2 Utilizando o Mapa

PRINCÍPIOS DE INFORMÁTICA PRÁTICA 08 1. OBJETIVO 2. BASE TEÓRICA. 2.1 Criando Mapas no Excel. 2.2 Utilizando o Mapa PRINCÍPIOS DE INFORMÁTICA PRÁTICA 08 1. OBJETIVO Aprender a utilizar mapas, colocar filtros em tabelas e a criar tabelas e gráficos dinâmicos no MS-Excel. Esse roteiro foi escrito inicialmente para o Excel

Leia mais

LMS: Manual do aluno

LMS: Manual do aluno UNO Internacional LMS: Manual do aluno Neste Learning Coffee você vai aprender a: Aceder à plataforma e editar o seu perfil. Aceder às suas notificações. Consultar o calendário e criar eventos pessoais.

Leia mais

Ajuda do Sistema Aquarius.

Ajuda do Sistema Aquarius. Ajuda do Sistema Aquarius. Esta ajuda é diferenciada da maioria encontrada nos sistemas de computador do mercado. O objetivo desta ajuda é literalmente ajudar o usuário a entender e conduzir de forma clara

Leia mais

Mapas Interativos de Saúde Ambiental: Principais Funções.

Mapas Interativos de Saúde Ambiental: Principais Funções. Ministério da Saúde Secretaria de Vigilância em Saúde Departamento de Vigilância em Saúde Ambiental e Saúde do Trabalhador Mapas Interativos de Saúde Ambiental: Principais Funções. 1. Introdução O Mapas

Leia mais

Agente Administrativo do MTE

Agente Administrativo do MTE PowerPoint 2003 Apresentação O Power Point é um aplicativo do Microsoft Office direcionado à criação de apresentações. Com ele você poderá criar rapidamente slides com esquemas, textos animados, sons e

Leia mais

Guia do Usuário. versão 1.2. GiuSoft Tecnologia - www.giusoft.com.br

Guia do Usuário. versão 1.2. GiuSoft Tecnologia - www.giusoft.com.br Guia do Usuário versão 1.2 GiuSoft Tecnologia - www.giusoft.com.br Sumário Introdução 2 O que é o Alitem? 3 Portal de aplicativos na Internet 3 Site de relacionamentos 3 Infra-estrutura de desenvolvimento

Leia mais

Noções Básicas de Excel página 1 de 19

Noções Básicas de Excel página 1 de 19 Noções Básicas de Excel página 1 de 19 Conhecendo a tela do Excel. A BARRA DE FÓRMULAS exibe o conteúdo de cada célula (local) da planilha. Nela podemos inserir e alterar nomes, datas, fórmulas, funções.

Leia mais

Manual de Utilização. Site Manager. Tecnologia ao serviço do Mundo Rural

Manual de Utilização. Site Manager. Tecnologia ao serviço do Mundo Rural Manual de Utilização Site Manager Tecnologia ao serviço do Mundo Rural Índice 1. Acesso ao Site Manager...3 2. Construção/Alteração do Menu Principal...4 3. Inserção/ Alteração de Conteúdos...7 4. Upload

Leia mais

Desenvolvimento de jogos com Unity

Desenvolvimento de jogos com Unity Desenvolvimento de jogos com Unity 1. Conhecendo a interface do Unity A interface do Unity é composta pela cena, assets do projeto, hierarquia dos objetos e o inspetor. Nas ferramentas da parte de cena

Leia mais

Tutorial Plone 4. Manutenção de Sites. Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados

Tutorial Plone 4. Manutenção de Sites. Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados Tutorial Plone 4 Manutenção de Sites Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados Sumário Introdução 1 Como fazer a autenticação do usuário 1.1 Através do

Leia mais

GRÁFICOS Exemplos de jogos 2D (com simulação do 3D)

GRÁFICOS Exemplos de jogos 2D (com simulação do 3D) Femur Online GRÁFICOS Exemplos de jogos 2D (com simulação do 3D) Como resultado de buscas na internet, tendo como base os jogos 2D mais famosos do mundo, obtive como resultado três tipos diferentes de

Leia mais

Construtor de Páginas

Construtor de Páginas Construtor de Páginas O novo Construtor de Páginas trouxe para o professor novos recursos em uma interface mais limpa, rápida e dinâmica, mas o Portal não desabilitou a utilização do antigo construtor

Leia mais

2 Trabalhos relacionados

2 Trabalhos relacionados 2 Trabalhos relacionados Esta seção descreve os principais trabalhos relacionados ao framework aqui produzido. Uma discussão sobre os aspectos gerais de jogos está fora dos objetivos deste dissertação.

Leia mais

TUTORIAL COMO CRIAR E EDITAR UM VÍDEO NO WINDOWS MOVIE MAKER*

TUTORIAL COMO CRIAR E EDITAR UM VÍDEO NO WINDOWS MOVIE MAKER* TUTORIAL COMO CRIAR E EDITAR UM VÍDEO NO WINDOWS MOVIE MAKER* * Microsoft Windows MovieMakeré um programa da Microsoft Corporation. A versão utilizada é a 5.1 que já vem instalada no Microsoft Windows

Leia mais

1 Inicie um novo. Guia de Referência Rápida de Gerenciamento de Projeto para o Project 2007. projeto

1 Inicie um novo. Guia de Referência Rápida de Gerenciamento de Projeto para o Project 2007. projeto Guia de Referência Rápida de Gerenciamento de Projeto para o Project 2007 1 Inicie um novo Antes de começar um novo, uma organização deve determinar se ele se enquadra em suas metas estratégicas. Os executivos

Leia mais

UTILIZAÇÃO DE RECURSOS LÚDICOS NO PROCESSO ENSINO- APRENDIZAGEM DA MATEMÁTICA. Palavras-chave: Recursos lúdicos; ensino-aprendizagem; matemática.

UTILIZAÇÃO DE RECURSOS LÚDICOS NO PROCESSO ENSINO- APRENDIZAGEM DA MATEMÁTICA. Palavras-chave: Recursos lúdicos; ensino-aprendizagem; matemática. UTILIZAÇÃO DE RECURSOS LÚDICOS NO PROCESSO ENSINO- APRENDIZAGEM DA MATEMÁTICA Wallace Camargo Ferreira 1 IFRN, Campus Natal-Central wcf.ifrn@hotmail.com Resumo: A presente exposição tem como objetivo estimular

Leia mais

ÍNDICE 1 INTRODUÇÃO. 04 2 ACESSO. 05 3 ABERTURA DE PROTOCOLO. 06 4 CONSULTA DE PROTOCOLO. 08 5 PROTOCOLO PENDENTE. 10 6 CONFIRMAÇÃO DE RECEBIMENTO.

ÍNDICE 1 INTRODUÇÃO. 04 2 ACESSO. 05 3 ABERTURA DE PROTOCOLO. 06 4 CONSULTA DE PROTOCOLO. 08 5 PROTOCOLO PENDENTE. 10 6 CONFIRMAÇÃO DE RECEBIMENTO. ÍNDICE 1 INTRODUÇÃO... 04 2 ACESSO... 05 3 ABERTURA DE PROTOCOLO... 06 4 CONSULTA DE PROTOCOLO... 08 5 PROTOCOLO PENDENTE... 10 6 CONFIRMAÇÃO DE RECEBIMENTO... 11 7 ANDAMENTO DE PROTOCOLO... 12 8 RELATÓRIOS,

Leia mais

Adquirindo prática para manipular o Mouse e o Teclado

Adquirindo prática para manipular o Mouse e o Teclado Capítulo 2 Adquirindo prática para manipular o Mouse e o Teclado 2.1 Adquirindo prática para manipular o Mouse e o Teclado Não há como manipular o computador sem ter noções de como lidar com o Mouse o

Leia mais

REGRAS GERAIS REDE 2 horas e 30 minutos. Os desafios deverão ser entregues conforme instrução: Exemplo: desafio1_equipepentagrama

REGRAS GERAIS REDE 2 horas e 30 minutos. Os desafios deverão ser entregues conforme instrução: Exemplo: desafio1_equipepentagrama 2 REGRAS GERAIS REDE 1. Número de desafios da competição: 5. 2. Tempo máximo da competição: 2 horas e 30 minutos. Os desafios deverão ser entregues conforme instrução: a) Salvar em um arquivo, identificando

Leia mais

INFORMATIVO DE PRODUTO

INFORMATIVO DE PRODUTO Temporizador Automático / Relógio Programador de Horário Para Acionamento Automático de Sirenes e Outros Equipamentos Código: AFKITPROG 2 O REGISTRADOR ELETRÔNICO DE PONTO REP O Relógio Acionador Automático

Leia mais

Bleach Game MANUAL BÁSICO 2014

Bleach Game MANUAL BÁSICO 2014 Bleach Game MANUAL BÁSICO 2014 Manual com informações necessárias para um rápido começo no jogo, apenas para consulta e informações sobre o jogo. Animegame Jogos para sua diversão http://animegame.com.br

Leia mais

Guia do Wattbike Expert Software para Iniciantes

Guia do Wattbike Expert Software para Iniciantes Guia do Wattbike Expert Software para Iniciantes 1 Índice Introdução............................................... 3 Conexão do software ao Computador de Desempenho Wattbike tela padrão Polar e edição

Leia mais

Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna

Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna O que é uma planilha eletrônica? É um aplicativo que oferece recursos para manipular dados organizados em tabelas. A partir deles pode-se gerar gráficos facilitando a análise e interpretação dos dados

Leia mais

Premiação por Produtividade

Premiação por Produtividade Versão 2.0 Manual destinado à implantadores, técnicos do suporte e usuários finais Sumário Configurações... 3 Definição das Metas... 5 Mês Referência... 5 Cotas por Funcionário... 8 Resultados... 9 Acompanhamento

Leia mais

Passo 3: Posicionando a Câmera na Prova Didática Teórica ou na Prova de Defesa da Produção Intelectual

Passo 3: Posicionando a Câmera na Prova Didática Teórica ou na Prova de Defesa da Produção Intelectual Este manual descreve um procedimento para o registro de Concursos Públicos por meio de áudio e vídeo utilizando-se recursos tecnológicos básicos i. A gravação segue o disposto na Resolução 020/09 da UFSM

Leia mais

Plano de Aulas AutoCAD 2011

Plano de Aulas AutoCAD 2011 Aula 1 Iniciar os alunos no uso do AutoCAD 2011. Capítulo 1 Introdução ao AutoCAD 2011 Capítulo 2 Área de Trabalho do AutoCAD 2011 Capítulo 3 Sistemas de Coordenadas no AutoCAD 2011 Computadores que possuam

Leia mais

Manual de Utilização das Funções Básicas do Sistema ClinicWeb

Manual de Utilização das Funções Básicas do Sistema ClinicWeb Manual de Utilização das Funções Básicas do Sistema ClinicWeb Dezembro/2012 2 Manual de Utilização das Funções Básicas do Sistema ClinicWeb Sumário de Informações do Documento Título do Documento: Resumo:

Leia mais

Manual Do Usuário Processo Aditivo de Prazo

Manual Do Usuário Processo Aditivo de Prazo Manual Do Usuário Processo Aditivo de Prazo Versão 1.0 Agosto 2015 2 SUMÁRIO 1 OBJETIVO... 3 2 INTRODUÇÃO... 3 3 ACESSANDO O SISTEMA DE GESTÃO DE PROCESSOS... 4 4 CONFIGURANDO O IDIOMA DO SISTEMA... 5

Leia mais

Universidade Federal de Santa Maria UFSM Centro de Tecnologia CT. Power Point. Básico

Universidade Federal de Santa Maria UFSM Centro de Tecnologia CT. Power Point. Básico Universidade Federal de Santa Maria UFSM Centro de Tecnologia CT Power Point Básico Santa Maria, julho de 2006 O Power Point é um aplicativo do Microsoft Office direcionado à criação de apresentações.

Leia mais

Barra de Títulos. Barra de Menu. Barra de Ferramentas. Barra de Formatação. Painel de Tarefas. Seleção de Modo. Área de Trabalho.

Barra de Títulos. Barra de Menu. Barra de Ferramentas. Barra de Formatação. Painel de Tarefas. Seleção de Modo. Área de Trabalho. Conceitos básicos e modos de utilização das ferramentas, aplicativos e procedimentos do Sistema Operacional Windows XP; Classificação de softwares; Principais operações no Windows Explorer: criação e organização

Leia mais

Microsoft Project 2003

Microsoft Project 2003 Microsoft Project 2003 1 [Módulo 4] Microsoft Project 2003 2 Definindo durações Inter-relacionamentorelacionamento Caminho crítico Microsoft Project 2003 3 1 Duração das Atividades Microsoft Project 2003

Leia mais

E-books. Guia para Facebook Ads. Sebrae

E-books. Guia para Facebook Ads. Sebrae E-books Sebrae Marketing e Vendas Guia para Facebook Ads Por que investir no facebook Ads? Tipos de anúncios Como funciona o sistema de pagamentos Criando anúncios Métricas Autor Felipe Orsoli 1 SUMÁRIO

Leia mais

Dicas para usar melhor o Word 2007

Dicas para usar melhor o Word 2007 Dicas para usar melhor o Word 2007 Quem está acostumado (ou não) a trabalhar com o Word, não costuma ter todo o tempo do mundo disponível para descobrir as funcionalidades de versões recentemente lançadas.

Leia mais

MANUAL DO ALUNO PARA NAVEGAR NO AMBIENTE VIRTUAL DE APRENDIZAGEM - AVA

MANUAL DO ALUNO PARA NAVEGAR NO AMBIENTE VIRTUAL DE APRENDIZAGEM - AVA MANUAL DO ALUNO PARA NAVEGAR NO AMBIENTE VIRTUAL DE APRENDIZAGEM - AVA MANUAL DO ALUNO Vamos aprender juntos o passo a passo para navegar e estudar com tranquilidade no ambiente aconchegante de seu doce

Leia mais

Manual de Utilização

Manual de Utilização Manual de Utilização Versão 1.0 18/01/2013 Sempre consulte por atualizações deste manual em nossa página. O Cotação Web está em constante desenvolvimento, podendo ter novas funcionalidades adicionadas

Leia mais

Curso de atualização Educação Integral e Integrada. Tutorial Moodle. Belo Horizonte, 2013.

Curso de atualização Educação Integral e Integrada. Tutorial Moodle. Belo Horizonte, 2013. Curso de atualização Educação Integral e Integrada Tutorial Moodle Belo Horizonte, 2013. 1. INTRODUÇÃO... 3 2. ACESSANDO O AMBIENTE... 4 3. CONHECENDO O AMBIENTE... 5 3.1. CAIXAS DE UTILIDADES... 5 4.

Leia mais