Você está na página 1de 58

CENTRO EDUCACIONAL DE MANHUAU CURSO TCNICO EM INFORMTICA MAYCOWN DOUGLAS DE OLIVEIRA MIRANDA SUELEN RODRIGUES GOMES

CRIAO E DESENVOLVIMENTO DE JOGO ELETRNICO

MANHUAU/MG 2011

MAYCOWN DOUGLAS DE OLIVEIRA MIRANDA SUELEN RODRIGUES GOMES

CRIAO E DESENVOLVIMENTO DE JOGO ELETRNICO


Trabalho de Concluso de Curso apresentado no Curso Tcnico de Informtica do Centro Educacional de Manhuau, como requisito parcial obteno do ttulo de Tcnico em Informtica. rea de Concentrao: Jogos Eletrnicos Orientador (a): Vando Vieira Mendes

MANHUAU/MG 2011

Maycown Douglas de Oliveira Miranda Suelen Rodrigues Gomes

CRIAO E DESENVOLVIMENTO DE JOGO ELETRNICO

Trabalho de Concluso de Curso apresentado no Curso Tcnico de Informtica do Centro Educacional de Manhuau, como requisito parcial obteno do ttulo de Tcnico em Informtica. rea de Concentrao: Jogos Eletrnicos Orientador (a): Vando Vieira Mendes

Data __/__/____

Prof. Orientador

Prof. Convidado Instituio

Prof. Convidado Instituio

AGRADECIMENTOS
Agradeo a todos que apoiaram e incentivaram o projeto.

RESUMO
Os jogos eletrnicos esto cada vez mais presentes no cotidiano das crianas e dos adolescentes, alm de estarem se tornando uma influncia significativa em suas vidas. Crianas que jogam, desenvolvem melhor o raciocnio lgico e a inteligncia. Este projeto visa aliar a linguagem universal dos games e se tornar uma ferramenta de educao voltada ao pblico infantil na rea de matemtica. Foi escolhida a plataforma XNA, da Microsoft, pois tem a vantagem de ser gratuita. Procuramos demonstrar que jogos eletrnicos podem ser atraentes s crianas, que acabam aprendendo de forma ldica. No projeto foi desenvolvida a parte inicial da matemtica bsica, onde as crianas tm que responder contas de adio para que acumulem pontos e passem para o nvel seguinte. Aps o desenvolvimento do sistema e sua apresentao e aprovao s entidades de ensino, pretende-se fornecer o cdigo aberto para que cada instituio faa a adequao do ensino conforme a necessidade. PALAVRAS-CHAVE: jogos eletrnicos, educativo, XNA.

LISTA DE FIGURAS
Tela1 .............................................................................................................. 20 Tela2 .............................................................................................................. 21 Tela3 .............................................................................................................. 22

LISTA DE SIGLAS
2D 3D GNU-GPL C# MEC: MSDN UNICID: XNA (Two Dimensional): Duas Dimenses (Three Dimensional): Trs Dimenses (General Public Licence ): Licena Pblica Geral (C Sharp) Ministrio da Educao e Cultura (Microsoft Developer Network) Linguagem de Marcao de Hipertexto (XNA's Not Acronymed): XNA no um acrnimo

SUMRIO
AGRADECIMENTOS .................................................................................................III RESUMO................................................................................................................... IV LISTA DE FIGURAS .................................................................................................. V LISTA DE SIGLAS .................................................................................................... VI 1- INTRODUO ......................................................................................................10 1.1 JUSTIFICATIVA............................................................................................12 2 OBJETIVOS ........................................................................................................13 2.1 - OBJETIVO GERAL........................................................................................13 2.2 - OBJETIVOS ESPECFICOS .........................................................................13 3 REFERENCIAL TERICO ..................................................................................14 5 - METODOLOGIA ..................................................................................................17 6 LINGUAGEM DE PROGRAMAO ...................................................................18 6.1 C# .................................................................................................................18 6.2 XNA ..............................................................................................................18 8 DESCRIO DO SOFTWARE ...........................................................................19 8.1 DESCRIO DO MINI-MUNDO ...................................................................19 8.2 RESTRIES DO SISTEMA .......................................................................19 9 DIAGRAMAS.......................................................................................................20 9.2 DIAGRAMA DE CLASSES ...........................................................................20 10 APRESENTAO DO SOFTWARE .................................................................20

11 CONCLUSO...................................................................................................21 12 REFERNCIA BIBLIOGRFICA .......................................................................25 12 ANEXOS ...........................................................................................................27 12.1 CDIGO FONTE .......................................................................................27 12.2 LICENA GPL/GNU ...................................................................................58

10

1- INTRODUO
Um jogo eletrnico, ou game como conhecido no exterior, pode ser criado utilizando-se quase todas as linguagens de programao disponveis atualmente, mas claro que algumas possuem ferramentas mais especficas para tal fim. O desenvolvimento de um software de entretenimento um trabalho minucioso que requer pacincia e disposio. Mas apesar de ter esses requisitos ainda um investimento ao qual se vale a pena. De acordo com Stuart Moulder, diretor mundial de games para PC da Microsoft, essa uma rea que j vem tendo enorme prestgio e continuar a crescer ainda mais na indstria tecnolgica. Com o avano das tecnologias de grfico, som, entretenimento, etc. os jogos ficaro cada vez mais prazerosos, no s para crianas, mas para jovens, adultos e at idosos. A tecnologia 3D, por exemplo, combinada com placas de vdeos poderosas esto cada vez mais se assimilando realidade, por isso proporciona ao jogador, na maioria das vezes, a sensao de estar dentro do jogo. Como o caso da nova tecnologia do Xbox 360, o Kinect, criada pelo brasileiro Alex Kipman. A novidade traz a vantagem de se poder jogar sem a utilizao de um controle/joystick, graas ao seu sensor de movimento. A mesma tecnologia j foi utilizada at para exerccios fisioteraputicos pela UNICID. Segundo Andr Perucia (2007), os jogos eletrnicos so considerados uma das mais expressivas prticas do sculo XXI e eles tm conquistado pblicos de todos os gneros e idades, criando novos desafios para os profissionais da rea. claro que muitas pessoas se perguntam ou at mesmo afirmam que games podem ser prejudiciais em vrios aspectos, mas como qualquer outra atividade que proporciona prazer pessoa, se em excesso pode se tornar um problema. necessrio estabelecer limites e no fugir deles para no se prejudicar. E ao contrrio do que a maioria pensa, os jogos eletrnicos podem estimular e aguar o raciocnio, uma pesquisa patrocinada pela Fundao Nacional de Cincia da Gr-Bretanha mostra que crianas que jogam videogames desenvolvem as habilidades necessrias para melhor aprendizado nas reas de matemtica e cincia.

11

E tambm a maioria dos jogos hoje em dia em ingls, uma pessoa pode aprender o idioma ao passo em que se joga, pois h jogos que estimulam o jogador a cumprir determinadas tarefas que precisam de uma leitura e interpretao dos dilogos presentes, e tambm diversos games so baseados em eventos histricos e podem oferecer um contedo educativo ao jogador. Segundo Tori (2005):
"A linguagem universal dos games ultrapassa barreiras econmicas, culturais e sociais, podendo se tornar importante instrumento de integrao, treinamento, educao e incluso. Alm disso, o poder de seduo dessa mdia pode ser utilizado a favor de campanhas educativas e em aes afirmativas (TORI, 2005)

A era do videogame est se aprimorando cada vez mais. E o desenvolvimento de um jogo eletrnico est cada vez mais complexo, exigindo equipes maiores e mais recursos, mas isso se tratando de nvel comercial. O desenvolvimento de um jogo caseiro, que o objetivo deste trabalho, pode ser feito por uma pessoa e envolve tempo e determinao. O assunto abordado a criao de um jogo eletrnico, para a plataforma PC/Windows. Hoje em dia existem diversos contedos e recursos que podem ajudar o desenvolvedor e at as ferramentas esto mais prticas, tudo isso com intuito de que os gamers, por gostarem de videogame e saberem do que um precisa ter, tenham interesse em contribuir ainda mais para esse campo, que segundo o site Tecmundo, uma das maiores indstrias de entretenimento atuais, superando at Hollywood.

12

1.1 JUSTIFICATIVA
Os jogos eletrnicos esto ficando cada vez mais avanados, os mais recentes esto voltados mais para o grfico, o som, etc. Obviamente, esses atributos so indispensveis nos games, todavia de toda importncia que os jogos sejam educativos e instrutivos. Prensky (2010) em seu livro No me atrapalhe, me Eu estou aprendendo, diz o seguinte:
As crianas de hoje querem ser envolvidas, e os games no s as envolvem, mas tambm ensinam lies valiosas durante o processo lies que ns queremos que elas aprendam. Esses jogos, na verdade, so um meio importante pelo qual nossos filhos esto aprendendo, preparando-se para a vida no sculo XXI. (...) o verdadeiro segredo que faz nossos filhos dedicarem tanto tempo aos games o conhecimento que eles adquirem. (PRENSKY, p. 28)

Enfatizando o argumento do autor acima, as crianas ficam envolvidas de tal forma que acabam aprendendo sozinhas. H casos de crianas que aprenderam um novo idioma devido aos games. Apesar dos jogos de certa forma j estimularem o aprendizado, necessrio que ele seja voltado para a educao. Para tal este trabalho justifica-se pela necessidade de um aprendizado ldico e divertido atravs de um jogo eletrnico voltado para matemtica.

13

2 OBJETIVOS
2.1 - OBJETIVO GERAL
O objetivo geral deste trabalho desenvolver um jogo eletrnico com contedo que inicie uma criana em matemtica, utilizando-se de uma das operaes bsicas, a soma, e aprimore seu raciocnio perante a esta disciplina. Visando tambm que no seja necessria muita experincia para o jogador, e demonstrar que qualquer pessoa que tenha interesse em criar um game utilizando o XNA, pode conseguir um bom resultado.

2.2 - OBJETIVOS ESPECFICOS


1) 2) 3) Demonstrar resumidamente algumas das funcionalidades da

plataforma 2D do XNA de modo simples e objetivo. Utilizar-se de um contedo educativo com o intuito de que a pessoa Desenvolver um jogo simples e de fcil entendimento para que uma jogue e aprenda. criana ou adulto possa jogar sem precisar de muita experincia em jogos eletrnicos.

14

3 REFERENCIAL TERICO
Segundo Yuri Corra (TOTH Jogo Eletrnico para Aprendizagem da Matemtica) uma das reas em que os jovens encontram mais dificuldades, hoje em dia, a de exatas, a matemtica mais especificamente. Bittencourt e Figueiredo (2005), em Jogos Computadorizados para Aprendizagem Matemtica no Ensino Fundamental, dizem o seguinte:
A Matemtica uma das disciplinas que se caracteriza de forma negativa nas salas de aula, devido ao fato de no despertar o interesse dos alunos e, consequentemente, no ser atrativa. Essa disciplina responsvel por altos ndices de reprovao dos educandos, sendo responsvel, muitas vezes, pela evaso escolar. Contraditoriamente a esse problema, os princpios matemticos ainda so estudados de forma dissociada da realidade do aluno, tornando-se pouco significativos para ele, o que aumenta ainda mais o problema do aprendizado dessa disciplina (BITTENCOURT; FIGUEIREDO, pag. 4-5)

O jogo apresentado neste trabalho tambm pretende contribuir para a rea de exatas, a fim de implementar no game um mtodo de ensino que seja mais estimulante aos jogadores, que iro se divertir e aprender ao mesmo tempo. Segundo Chateau (1987), o jogo tambm assume fins artificiais, onde o adulto pode utiliz-lo para conhecer e formar a criana. Ou seja, uma pessoa adulta pode jogar um jogo para tentar entender o que se passa na cabea de uma criana que o joga e compreender o que chama a ateno da mesma para tal fim. Isso poder estabelecer e/ou fortalecer os vnculos entre jovens e adultos. Erikson (1971), utilizando teorias de Freud, afirma que na teoria catrtica o jogo permite criana liberar emoes enclausuradas e encontrar alvio imaginrio para as frustraes passadas. Portanto, o jogo proporciona a sensao de superao de limites e satisfao pessoal, j que traz ao jogador o sentimento de poder, estimulando a criana a construir e comandar.
A aprendizagem muito mais significativa medida que o novo contedo agregado ao conhecimento de um aluno e adquire significado para ele a

15

partir do estabelecimento de alguma relao com seu conhecimento prvio. Sem essa abordagem ela se torna apenas mecnica, uma vez que se produziu menos essa incorporao e atribuio de significado, e o novo contedo passa a ser armazenado de maneira isolada e arbitrria. (PELIZZARI, 2002)

XNA

da

Microsoft

uma

ferramenta

que

possibilitou

aos

desenvolvedores um salto no desenvolvimento de jogos.


Para aqueles de ns que tm a curiosidade inata e desejo de desenvolver videogames, o framework de desenvolvimento XNA da Microsoft tudo que ns j espervamos. Com a disposio direta dos frames e o poder que ela apresenta para o desenvolvedor, criar jogos para o PC nunca foi to fcil. Alm disso, o XNA 4.0permite que os programadores possam desenvolver os seus prprios jogos para a Xbox 360 e Windows Phone 7. Nunca antes se teve acesso a kits de desenvolvimento de software visando consoles de ltima gerao ou o ltimo dispositivos portteis de mdia foi to prontamente disponvel. (REED, p. 7, 2011)

Alm de o XNA possuir diversas vantagens, ainda gratuito. Assim como o compilador Visual C# que exigido pelo framework.
A paixo dos alunos por jogos de computador e videogames pode ser uma alavanca para a criatividade em sala de aula. O XNA uma plataforma de desenvolvimento de jogos, que permite aos desenvolvedores programar seus jogos (...) Ela foi desenvolvida para ser usado por estudantes, desenvolvedores hobbistas e pequenos grupos de desenvolvimento de jogos independentes, com o intuito de permitir que os usurios criem os prprios games. (MICROSOFT EDUCAO, 2011)

Levando-se em conta todas as vantagens do XNA, que voltado para justamente para aprendizado, por ser voltado para a didtica. Valendo-se de suas ferramentas, o projeto visa acentuar o contedo educativo j comentado para se criar um jogo eletrnico que explore um universo educativo, divertido e simples. O XNA, tambm, um dos frameworks mais aconselhveis para se iniciar em game programming, alm de prover de uma grande diversidade de material de aprendizado, possui recursos mais voltados para iniciantes. H tambm uma caracterstica positiva do XNA que poder contribuir para o trabalho em equipe,

16

estimulando a cooperao, comunicao, responsabilidade, raciocnio, etc., algo que pode ser aproveitado para diversas outras reas.
Professores e alunos podem criar uma bela parceira na descoberta das potencialidades de jogos educativos, criados pela prpria turma. Explorar as possibilidades de mltiplas solues para problemas, caminhos a seguir e decises a tomar so algumas das habilidades e competncias que o professor pode desenvolver com seus alunos. A interao entre os alunos, a criatividade colocada prova e a interatividade com os computadores so alguns elementos que o uso deste programa pode trazer sala de aula sem falar das propostas divertidas e interessantes. (MICROSOFT EDUCAO, 2011)

O projeto, por visar contedo didtico e o aprendizado, ir ser desenvolvido com cdigo aberto, a licena para a disponibilizao est em anexo neste trabalho e tambm se baseia na lei N 9.609 , de 19 de fevereiro de 1998.
Art. 2 da proteo aos direitos de autor e do registro compete: ... II - da proteo aos direitos de autor e do registro ... Pargrafo 1 No se aplicam ao programa de computador as disposies relativas aos direitos morais, ressalvado, a qualquer tempo, o direito do autor de reivindicar a paternidade do programa de computador e o direito do autor de opor-se a alteraes no-autorizadas, quando estas impliquem deformao, mutilao ou outra modificao do programa de computador, que prejudiquem a sua honra ou a sua reputao. [Lei N 9.609 , de 19 de fevereiro de 1998, art. 2.].
o

Ento, ao projeto no sero postos direitos que visem a sua comercializao, ou qualquer tipo de benefcio econmico que o mesmo possa vir a ter, seja pelo autor, ou por terceiros que venham a obter uma cpia do programa, que ser livre para distribuio, obedecendo s normas apresentadas.

17

5 - METODOLOGIA
A metodologia utilizada baseia-se em uma pesquisa descritiva/cientfica que visa uma forma de aprendizagem estimulada atravs de um jogo eletrnico. Esta pesquisa foi realizada atravs de documentos e artigos eletrnicos, livros, etc. A mesma foi feita a fim descobrir a influncia dos games em diferenciadas faixa etrias e qual a rea em que o crebro mais se desenvolve com a sua ajuda. Ao longo do trabalho foram feitos estudos e pesquisas sobre o contedo para que o mesmo seja plausvel. A partir desse ponto foi possvel iniciar o desenvolvimento do jogo baseando-se em matemtica simples. Tratando do assunto sobre a didtica, partindo de uma pesquisa documental. H tambm uma pesquisa bibliogrfica sobre as ferramentas utilizadas para que o uso das mesmas torne mais simples e eficiente o desenvolvimento do jogo. Com base nessa pesquisa foi escolhida a plataforma em que o game ser feito. O XNA, alm de ser uma ferramenta vivel economicamente, pois gratuita, possui recursos 2D e 3D. O projeto tambm parte de um estudo sobre a lei N 9.609 sobre software livre, pois o trabalho ser cdigo aberto que permitir a qualquer pessoa a alterao, modificao e distribuio da aplicao para que a mesma adapte sua maneira ou necessidade.

18

6 LINGUAGEM DE PROGRAMAO
As ferramentas utilizadas no desenvolvimento de um jogo so diversas, entre elas: Visual C# Express, XNA Game Studio, Blender, Astah Community, Math Science Engineering Simulations, Computador.

6.1 C#
Segundo o MSDN o Visual C# uma linguagem de programao orientada objetos pertencente a plataforma .NET de tipo simples e seguro, mas poderosa que permite os programadores criar uma variedade de aplicativos. A linguagem foi desenvolvida pela equipe liderada por Anders Hejlsberg, contratado pela Microsoft

6.2 XNA
O XNA um framework para o Visual Studio que serve para a criao de jogos para Windows, Xbox 360 e Windows Phone 7. A ferramenta se integra ao Visual Studio, permitindo que o usurio desenvolva o seu projeto, este pode contar com recursos 2D ou 3D na elaborao de projetos, dentre outros recursos sobre grfico, som, interface, dispositivos, etc.

19

8 DESCRIO DO SOFTWARE
8.1 DESCRIO DO MINI-MUNDO
O jogo GeoJogo um software voltado para Windows bem simples, que visa o aprendizado em matemtica. Apresentar uma interface simples e de fcil entendimento. O jogo tambm contar com uma lista de comandos que ser disposta neste projeto, caso o jogador possua dvidas quanto a esses. As setas movem o jogador, e a barra de espao seleciona o quadrado em que o jogador est. O objetivo do jogo acumular pontos, acertando as somas que aparecem. Se o jogador errar, um inimigo ser liberado da cela e ir persegui-lo, se o jogador acertar o resultado aps isso, o inimigo ir desaparecer, se o inimigo o alcanar, ele perder um vida. Caso perca as trs vidas ser fim de jogo. Caso seja a resposta correta pontos sero adicionados e o jogador ganhar um polgono, quando adquirir 10, ele passar a um prximo nvel. A tecla enter faz com que a questo mude, sem que o jogador a acerte, enquanto a tecla esc fecha o jogo. Caso ocorra fim de jogo, o jogador poder pressionar espao para reiniciar o jogo, ou esc para finaliz-lo.

8.2 RESTRIES DO SISTEMA


Para se utilizar o XNA 4.0 necessrio ter instalado o. NET framework 4.0, DirectX jun/2010, ou superior e tambm o Visual C# 2010 Express, todos podem ser baixados no site create.msdn.com gratuitamente. H tambm a necessidade de uma placa de vdeo compatvel com WDDM 1.1 e DirectX 10 (ou posterior).

20

9 DIAGRAMAS
9.2 DIAGRAMA DE CLASSES

21

10 APRESENTAO DO SOFTWARE

Tela1.jpg A tela inicial do jogo, mostrando o nvel atual, a quantidade de pontos, a soma, os possveis resultados, etc. Fonte: Arquivo pessoal.

22

Tela2.jpg Quando o jogador erra o resultado, o inimigo liberado. Fonte: Arquivo pessoal.

23

Tela3.jpg Quando se perde as trs vidas ser fim de jogo, e duas opes sero apresentadas: reiniciar, ou sair. Fonte: Arquivo pessoal.

24

11 CONCLUSO
Hoje em dia, com os vrios recursos disponveis na rea de desenvolvimento de jogos, fica bem mais simples criar um jogo no qual desperte o interesse das crianas. Nessa monografia foi visto que as crianas podem desenvolver seu aprendizado jogando. Este projeto teve como base diversos estudos que comprovam a estimulao do raciocnio e da inteligncia (principalmente na rea de exatas) atravs do game. Para o desenvolvimento do jogo foi utilizado a ferramenta XNA, uma plataforma da Microsoft, que permite a criao de jogos para PC. A princpio, foi identificado a importncia da educao e como um jogo poderia complementar os estudos. Na aplicao foi implementado o contedo mais bsico da matemtica: contas simples de adio. No qual o jogador precisa acertar a resposta para acumular pontos e ir para o prximo nvel. Este game ser livre e gratuito para todos os usurios, ou seja, quem quiser e dispuser de conhecimentos na rea de programao poder alter-lo, modific-lo e distribu-lo. Para que todos possam ter esses direitos este projeto contou com a licena GNU, atravs do copyright do software.

25

12 REFERNCIAS BIBLIOGRFICAS
BERTUCCI, J. Metodologia Bsica para Elaborao de Trabalhos de Concluso de Cursos (TCC). So Paulo, Atlas S.A., 2008. BITTENCOURT, J. R.; FIGUEIREDO, C. Z.. Jogos Computadorizados para Aprendizagem Matemtica no Ensino Fundamental. Novas Tecnologias na Educao, Porto Alegre, v. 3, n. 1, p. 4-5, Maio 2005. ESQUISATO, A. In As novas tendncias na educao, Microsoft Educao, 2010. Disponvel em http://www.microsoft.com/brasil/educacao/parceiro/tendencias_educacao.mspx. Acesso em: 10/09/2011. EVANGELISTA; PEREIRA, B.; LOBO, A. XNA 3.0 para Desenvolvimento de Jogos no Windows, Zune e Xbox 360. So Paulo, Brasport, 2010. KRGER, F; CRUZ, D. O fascnio da simulao da vida: por que as crianas jogam (e gostam) do game The Sims. Porto Alegre, Revista Famecos, 2004. Lei N 9.609 , de 19 de fevereiro de 1998, art. 2, pargrafo 1. Disponvel em: http://fortuna.jard.com.br/adds/pirataria.html. Acesso em: 08/09/2011 PELIZZARI, A.; KRIEGL, M. DE L.; BARON, M. P.; FINCK, N. T. L.; DOROCINSKI, S. I., 2002. Teoria da Aprendizagem Significativa Segundo Ausubel. Psicologia Educao Cultura, Curitiba, v. 2, n. 1, p. 37-42, Julho 2002. PRENSKY, M. No me atrapalhe, me Eu estou aprendendo! So Paulo: Phorte, 2010, p.320. TERAMOTO, E.; ALMEIDA, T.; CORRA, Y. Toth: Jogo Eletrnico para a Aprendizagem em Matemtica. Monografia apresentada Escola Politcnica da Universidade de So Paulo para obteno do ttulo de Engenheiro de Computao, So Paulo, 2008. TORI, R. In Jogos eletrnicos utilizados com jovens podem obter bons resultados, folha de So Paulo, So Paulo, 2005. Disponvel em http://www1.folha.uol.com.br/folha/dimenstein/noticias/gd030505.htm. Acesso em 13/09/2011. TORRES, D.; TAVARES, E. Projeto Hydra: Desenvolvimento de Jogos Digitais Utilizando o Framework Microsoft XNA. Trabalho de Curso apresentado como parte das atividades para obteno do grau de bacharel, do curso de Cincia da Computao do Centro Universitrio do Par. rea de Concentrao: Estudo de Caso. Belm, 2009. Educao, Porto Alegre, v. 3, n. 1, p. 4-5, Maio 2005. Curso de 3D Game Studio. Disponvel em: http://www.iped.com.br/3d-egames/curso/3d-game-studio/afiliado/706512. Acesso em 07/08/2011.

26

Curso Programao de Jogos usando XNA Disponvel http://kleberandrade.wordpress.com/xna/. Acesso em 01/08/2011. XNA Game Studio Express. Disponvel http://www.conteudoseducacionais.com.br/xna.asp. Acesso em 25/07/11.

em: em:

Site, http://www.firb.br/abntmonograf.htm. Web. Manhuau. (procura: normas da abnt), em 06/09/2011. Site, http://www.fea.br/Tecnico/informativocursos/inforinformatica.php#a1. Manhuau. (procura: justificativa e objetivos?), em 06/09/2011. Site, http://www.fea.br/Tecnico/informativocursos/inforinformatica.php#a1. Manhuau. (procura: justificativa e objetivos?), em 06/09/2011. Web. Web.

Site, http://www.overmundo.com.br/overblog/laboratorio-de-desenvolvimento-dejogos. Web. Manhuau. (procura: laboratrio de desenvolvimento de jogos), em 06/09/2011. Site, http://www.selectgame.com.br/referencias-livros-sobre-desenvolvimento-dejogos/. Web. Manhuau. (procura: livro sobre desenvolvimento de jogos), em 06/09/2011. Site, http://felipearon.net/curso-online-xna/aula-01-o-que-e-xna. Web. Manhuau. (procura: o que XNA?), em 06/09/2011. Site, http://www.bufaloinfo.com.br/artigos/coluna39.asp. Web. Manhuau. (procura: jogo com XNA), em 06/09/2011. Site, http://www.nelxon.com/blog/xna-3-1-to-xna-4-0-cheatsheet/. Web. Manhuau. (procura: converter xna 3.1 para 4.0), em 06/09/2011. Site, http://www.magnux.org/doc/GPL-pt_BR.txt. Web. Manhuau. (procura: licena gpl), em 06/09/2011. Site, http://pt.wikipedia.org/wiki/Copyleft. Web. Manhuau. (procura: copyleft), em 01/09/2011. Site, http://pt.wikipedia.org/wiki/Dom%C3%ADnio_p%C3%BAblico. Web. Manhuau. (procura: domnio pblico), em 01/09/2011. Site, http://softwarelivre.org/. Web. Manhuau. (procura: software livre), em 01/09/2011.

27

12 ANEXOS
12.1 CDIGO FONTE
using System; namespace GeoJogo { #if WINDOWS || XBOX static class Program { /// <summary> /// The main entry point for the application. /// </summary> static void Main(string[] args) { using (Game1 game = new Game1()) { game.Run(); } } } #endif } using using using using System; System.Collections.Generic; System.Text; Microsoft.Xna.Framework;

namespace GeoJogo.Sprite { class Sprite { public Sprite(string theTextureKey, Rectangle theLocationAndSize) { TextureKey = theTextureKey; Position = new Vector2(theLocationAndSize.X, theLocationAndSize.Y); Width = theLocationAndSize.Width; Height = theLocationAndSize.Height; } public Sprite(string theTextureKey, Rectangle theLocationAndSize, Vector2 theGridPosition) { TextureKey = theTextureKey; Position = new Vector2(theLocationAndSize.X, theLocationAndSize.Y); Width = theLocationAndSize.Width; Height = theLocationAndSize.Height; } GridPosition = theGridPosition;

public Sprite(string theTextureKey, Rectangle theLocationAndSize, Rectangle theTextureLocation) { TextureKey = theTextureKey; Position = new Vector2(theLocationAndSize.X, theLocationAndSize.Y); Width = theLocationAndSize.Width; Height = theLocationAndSize.Height; TexturePositionX = theTextureLocation.X; TexturePositionY = theTextureLocation.Y; TextureWidth = theTextureLocation.Width; TextureHeight = theTextureLocation.Height;

public Sprite(string theTextureKey, Rectangle theLocationAndSize, Rectangle theTextureLocation, Vector2 theGridPosition)

28

TextureKey = theTextureKey; Position = new Vector2(theLocationAndSize.X, theLocationAndSize.Y); Width = theLocationAndSize.Width; Height = theLocationAndSize.Height; TexturePositionX = theTextureLocation.X; TexturePositionY = theTextureLocation.Y; TextureWidth = theTextureLocation.Width; TextureHeight = theTextureLocation.Height;

GridPosition = theGridPosition;

public Sprite(string theTextureKey, Rectangle theLocationAndSize, bool isVisible) { TextureKey = theTextureKey; Position = new Vector2(theLocationAndSize.X, theLocationAndSize.Y); Width = theLocationAndSize.Width; Height = theLocationAndSize.Height; Visible = isVisible; } public Sprite(string theTextureKey, Rectangle theLocationAndSize, Rectangle theTextureLocation, bool isVisible) { TextureKey = theTextureKey; Position = new Vector2(theLocationAndSize.X, theLocationAndSize.Y); Width = theLocationAndSize.Width; Height = theLocationAndSize.Height; TexturePositionX = theTextureLocation.X; TexturePositionY = theTextureLocation.Y; TextureWidth = theTextureLocation.Width; TextureHeight = theTextureLocation.Height; } Visible = isVisible;

public Sprite(string theTextureKey, Rectangle theLocationAndSize, bool isVisible, Vector2 theGridPosition) { TextureKey = theTextureKey; Position = new Vector2(theLocationAndSize.X, theLocationAndSize.Y); Width = theLocationAndSize.Width; Height = theLocationAndSize.Height; Visible = isVisible; } GridPosition = theGridPosition;

public Sprite(string theTextureKey, Rectangle theLocationAndSize, Rectangle theTextureLocation, bool isVisible, Vector2 theGridPosition) { TextureKey = theTextureKey; Position = new Vector2(theLocationAndSize.X, theLocationAndSize.Y); Width = theLocationAndSize.Width; Height = theLocationAndSize.Height; TexturePositionX = theTextureLocation.X; TexturePositionY = theTextureLocation.Y; TextureWidth = theTextureLocation.Width; TextureHeight = theTextureLocation.Height; Visible = isVisible; } GridPosition = theGridPosition;

private string mTextureKey; public string TextureKey {

29

get { } set {

return mTextureKey;

mTextureKey = value; } }//Fim da Propriedade de TextureKey //Posies X e Y do Sprite private Vector2 mPosition; public Vector2 Position { get { return mPosition; } set { mPosition = value; } }//Fim das Propriedades de Posio private int mWidth; public int Width { get { return mWidth; } set { mWidth = value; } }//Fim das propriedades de Largura private int mHeight; public int Height { get { return mHeight; } set { mHeight = value; } }//Fim das Propriedades de Altura private int mTexturePositionX = 0; public int TexturePositionX { get { return mTexturePositionX; } set { mTexturePositionX = value; } } private int mTexturePositionY = 0; public int TexturePositionY { get { return mTexturePositionY; } set { mTexturePositionY = value; }

30

} private int mTextureWidth = 0; public int TextureWidth { get { return mTextureWidth; } set { mTextureWidth = value; } }//Fim das propriedades de TextureWidth(Largura) private int mTextureHeight = 0; public int TextureHeight { get { return mTextureHeight; } set { mTextureHeight = value; } }//Fim das Propriedades de TextureHeight(Altura) private bool mVisible = false; public bool Visible { get { return mVisible; } set { mVisible = value; if (mVisible == true && VisibleTime != 0 && Elapsed == 0) { //Reseta o tempo da imagem para ser visvel Elapsed = VisibleTime; } } } private bool mMoving = true; public bool Moving { get { return mMoving; } set { mMoving = value; } } public Rectangle Destination { get { return new Rectangle((int)Position.X, (int)Position.Y, Width, Height); } } public Rectangle Source { get { return new Rectangle(TexturePositionX, TexturePositionY, TextureWidth, TextureHeight); }

31

} private float mVisibleTime = 0; public float VisibleTime { get { return mVisibleTime; } set { mVisibleTime = value; } }//Fim das propriedades de VisibleTime private float mElapsed = 0; public float Elapsed { get { return mElapsed; } set { mElapsed = value; if (mElapsed < 0) { if (Flash == false) { mElapsed = 0; mVisible = false; } else { mElapsed = mVisibleTime; mVisible = !mVisible; } } } }//Fim das Propriedades de Elapsed private bool mFlash = false; public bool Flash { get { return mFlash; } set { mFlash = value; } }//Fim das Propriedades de Flash //A posio no plano cartesiano bidimensional private Vector2 mGridPosition; public Vector2 GridPosition { get { return mGridPosition; } set { mGridPosition = value; } }//Fim das Propriedades de GridPosition //A posio X no plano cartesiano bidimensional public float GridPositionX { get {

32

GridPosition = new Vector2(value, GridPosition.Y); } }//Fim das Propriedades de GridPositionX //A posio Y no plano cartesiano bidimensional public float GridPositionY { get { return GridPosition.Y; } set { GridPosition = new Vector2(GridPosition.X, value); } }//Fim das Propriedades de GridPositionY public enum eDirection { None, Left, Right, Up, Down } private eDirection mDirection = eDirection.None; public eDirection Direction { get { return mDirection; } set { mDirection = value; } } } } using using using using using

} set {

return GridPosition.X;

System; System.Collections.Generic; System.Text; Microsoft.Xna.Framework; Microsoft.Xna.Framework.Graphics;

namespace GeoJogo.Sprite { class SpriteManagement { public SpriteManagement() { }//Fim //As Texturas usadas pelos Sprites Dictionary<string, Texture2D> mTextures = new Dictionary<string, Texture2D>(); public Dictionary<string, Texture2D> Textures { get { return mTextures; } set { mTextures = value; } }//Fim Propriedades de Textures

33

//Sprites Dictionary<string, Sprite> mSprites = new Dictionary<string, Sprite>(); public Dictionary<string, Sprite> Sprites { get { return mSprites; } set { mSprites = value; } } public void Draw(SpriteBatch theSpriteBatch) { foreach (KeyValuePair<string, Sprite> aSprite in Sprites) { if (aSprite.Value.Visible == true) { if (aSprite.Value.TextureWidth == 0 && aSprite.Value.TextureHeight == 0) { theSpriteBatch.Draw(Textures[aSprite.Value.TextureKey], aSprite.Value.Destination, Color.White); } else { theSpriteBatch.Draw(Textures[aSprite.Value.TextureKey], aSprite.Value.Destination, aSprite.Value.Source, Color.White); } } } }//Fim Sprite.Draw() public void Draw(SpriteBatch theSpriteBatch, string theKey) { if (Sprites[theKey].Visible == true) { if (Sprites[theKey].TextureWidth == 0 && Sprites[theKey].TextureHeight == 0) { theSpriteBatch.Draw(Textures[Sprites[theKey].TextureKey], Sprites[theKey].Destination, Color.White); } else { theSpriteBatch.Draw(Textures[Sprites[theKey].TextureKey], Sprites[theKey].Destination, Sprites[theKey].Source, Color.White); } } } public void Update(float elapsed) { foreach (KeyValuePair<string, Sprite> aSprite in Sprites) { if (aSprite.Value.VisibleTime != 0) { aSprite.Value.Elapsed -= elapsed; } } }//Fim Sprite.Update() } }

using System; using System.Collections.Generic;

34

using System.Text; using Microsoft.Xna.Framework; namespace GeoJogo.Text { class Text { public Text(Vector2 thePosition, string theValue, int theSize) { Position = thePosition; Value = theValue; Size = theSize; } //A Posio do Texto private Vector2 mPosition = new Vector2(0); public Vector2 Position { get { return mPosition; } set { mPosition = value; } }//Fim das propriedades de Position //O valor do texto private string mValue = string.Empty; public string Value { get { return mValue; } set { mValue = value; } }//Fim das propriedades de Value //O tamanho do texto private int mSize = -1; public int Size { get { return mSize; } set { mSize = value; } }//Fim das Propriedades de Size private bool mVisible = true; public bool Visible { get { return mVisible; } set { mVisible = value; if (mVisible == true && VisibleTime != 0) { //Reseta o tempo da imagem para ser visvel Elapsed = VisibleTime; } }

35

}//Fim das propriedades de Visible private float mVisibleTime = 0; public float VisibleTime { get { return mVisibleTime; } set { mVisibleTime = value; } }//Fim das propriedades de VisibleTime private float mElapsed = 0; public float Elapsed { get { return mElapsed; } set { mElapsed = value; if (mElapsed < 0) { mElapsed = 0; mVisible = false; } } }//Fim das propriedades de Elapsed }//Classe Text }//Namesspace GeoJogo using using using using using using System; System.Collections.Generic; System.Text; Microsoft.Xna.Framework; Microsoft.Xna.Framework.Graphics; Microsoft.Xna.Framework.Content;

namespace GeoJogo.Text { class TextManagement { public TextManagement(GraphicsDevice theGraphics, ContentManager theLoader) { FontTexture = theLoader.Load<Texture2D>("./Imagens/Alfabeto") as Texture2D; }//Fim da criaao do objeto Dictionary<string, Text> mTexts = new Dictionary<string, Text>(); public Dictionary<string, Text> Texts { get { return mTexts; } set { mTexts = value; } } Texture2D mFontTexture; public Texture2D FontTexture { get {

36

} set { } }

return mFontTexture;

mFontTexture = value;

public void Draw(SpriteBatch theSpriteBatch) { foreach (KeyValuePair<string, Text> aText in Texts) { if (aText.Value.Visible == true) { char[] aCharacters = aText.Value.Value.ToCharArray(); int aXPositionOffset = (int)aText.Value.Position.X; foreach (char aChar in aCharacters) { theSpriteBatch.Draw(FontTexture, new Rectangle(aXPositionOffset, (int)aText.Value.Position.Y, aText.Value.Size, aText.Value.Size), new Rectangle(GetLetterValue(aChar), 0, 40, FontTexture.Height), Color.White); aXPositionOffset += aText.Value.Size + 3; } } }//Prximo Texto }//Fim de TextManagement.Draw() public void Draw(SpriteBatch theSpriteBatch, string theKey) { char[] aCharacters = Texts[theKey].Value.ToCharArray(); int aXPositionOffset = (int)Texts[theKey].Position.X; foreach (char aChar in aCharacters) { theSpriteBatch.Draw(FontTexture, new Rectangle(aXPositionOffset, (int)Texts[theKey].Position.Y, Texts[theKey].Size, Texts[theKey].Size), new Rectangle(GetLetterValue(aChar), 0, 40, FontTexture.Height), Color.White); aXPositionOffset += Texts[theKey].Size + 3; } }//Fim de Text.Draw() //Pega a posio do caractere na textura Font protected int GetLetterValue(char theCharacter) { int aNumberPositionX = -26; switch (theCharacter) { case 'A': aNumberPositionX = -26; break; case 'B': aNumberPositionX = -25; break; case 'C': aNumberPositionX = -24; break; case 'D': aNumberPositionX = -23; break; case 'E': aNumberPositionX = -22; break; case 'F': aNumberPositionX = -21; break; case 'G': aNumberPositionX = -20; break; case 'H': aNumberPositionX = -19; break; case 'I': aNumberPositionX = -18; break;

37

case 'J': aNumberPositionX break; case 'K': aNumberPositionX break; case 'L': aNumberPositionX break; case 'M': aNumberPositionX break; case 'N': aNumberPositionX break; case 'O': aNumberPositionX break; case 'P': aNumberPositionX break; case 'Q': aNumberPositionX break; case 'R': aNumberPositionX break; case 'S': aNumberPositionX break; case 'T': aNumberPositionX break; case 'U': aNumberPositionX break; case 'V': aNumberPositionX break; case 'W': aNumberPositionX break; case 'X': aNumberPositionX break; case 'Y': aNumberPositionX break; case 'Z': aNumberPositionX break; case '0': aNumberPositionX break; case '1': aNumberPositionX break; case '2': aNumberPositionX break; case '3': aNumberPositionX break; case '4': aNumberPositionX break; case '5': aNumberPositionX break; case '6': aNumberPositionX break; case '7': aNumberPositionX

= -17; = -16; = -15; = -14; = -13; = -12; = -11; = -10; = -9; = -8; = -7; = -6; = -5; = -4; = -3; = -2; = -1; = 0; = 1; = 2; = 3; = 4; = 5; = 6; = 7;

38

break; case '8': aNumberPositionX break; case '9': aNumberPositionX break; case '+': aNumberPositionX break; case '-': aNumberPositionX break; case '/': aNumberPositionX break; case '*': aNumberPositionX break; case ':': aNumberPositionX break; case ' ': aNumberPositionX break;

= 8; = 9; = 10; = 11; = 12; = 13; = 14; = 15;

return 40 * (26 + aNumberPositionX); }//Funo GetLetterValue() Pega os valores dos caracteres public void Update(float elapsed) { foreach (KeyValuePair<string, Text> aText in Texts) { if (aText.Value.VisibleTime != 0) { aText.Value.Elapsed -= elapsed; } } }//Fim de TextManagement.Update() }//Classw TextManagement }//Namespace GeoJogo.Text using using using using using using using using using using System; System.Collections.Generic; System.Linq; Microsoft.Xna.Framework; Microsoft.Xna.Framework.Audio; Microsoft.Xna.Framework.Content; Microsoft.Xna.Framework.GamerServices; Microsoft.Xna.Framework.Graphics; Microsoft.Xna.Framework.Input; Microsoft.Xna.Framework.Media;

namespace GeoJogo { /// <summary> /// Esta a funo principal do jogo /// </summary> public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; enum GameState { Rodando, ProximoNivel, InimigoLiberado, Devorado,

39

FimDeJogo, } private float mTimeInState = 0; GameState mCurrentState; enum PlayerState { Ocioso, AntesPular, ArcoAcima, ArcoAbaixo, AposPular } PlayerState mCurrentPlayerState = PlayerState.Ocioso; //A posio X e Y do jogador antes do movimento int mPlayerStateStartX = 215; int mPlayerStateStartY = 190; Sprite.SpriteManagement mSprites; Text.TextManagement mDisplayText; GeoJogo.GameData mGameData; Random mRandomGenerate = new Random(); //Teclado bool m_SpacePressed = false; bool m_SpacePressedBefore = false; float mEnemyMouthElapsed = (float)0.3; float mMoveEnemyElapsed = (float)0.5; float mMovePlayerElapsed = (float)0.05; public Game1() { graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferHeight = 600; graphics.PreferredBackBufferWidth = 800; } Content.RootDirectory = "Content";

/// <summary> /// Permite ao jogo fazer as inicializaes necessrias antes de comear a rodar. /// Aqui onde pode fazer as consultas de inicializao de todos o contedo no grfico /// Chamando base.Initialize ir enumerar os componentes e inicializ-los /// </summary> protected override void Initialize() { // Adicionar a Lgica de inicializao } base.Initialize();

/// <summary> /// LoadContent ser chamada uma vez por jogo e serve para carregar o contedo grfico /// </summary> protected override void LoadContent() { // Cria um novo SpriteBatch, que pode ser usado para desenhar texturas spriteBatch = new SpriteBatch(GraphicsDevice); LoadResources(); StartGame();

//Carrega todos os recursos do jogo (sprites, sons, etc.) protected void LoadResources() { LoadGameData(); LoadTextures();

40

LoadText(); }//Fim de LoadResources() //Carrega todas as texturas e sprites para serem usados no jogo protected void LoadTextures() { //Initialize the Sprite Management class mSprites = new Sprite.SpriteManagement(); // Carrega todo contedo do ResourceManagementMode.Automatic //Adiciona as texturas para a classe SpriteManagement mSprites.Textures.Add("Background", Content.Load<Texture2D>("Imagens/Background") as mSprites.Textures.Add("Jogador", Content.Load<Texture2D>("Imagens/Jogador") as Texture2D); mSprites.Textures.Add("Fundo", Content.Load<Texture2D>("Imagens/Fundo") as Texture2D); mSprites.Textures.Add("Selecionar", Content.Load<Texture2D>("Imagens/Selecionar") as mSprites.Textures.Add("Computador", Content.Load<Texture2D>("Imagens/Computador") as

Texture2D);

Texture2D); Texture2D);

mSprites.Textures.Add("PainelComputador", Content.Load<Texture2D>("Imagens/PainelComputador") as Texture2D); mSprites.Textures.Add("PaletaCores", Content.Load<Texture2D>("Imagens/PaletaCores") as Texture2D); mSprites.Textures.Add("Aviso", Content.Load<Texture2D>("Imagens/Aviso") as Texture2D); mSprites.Textures.Add("FundoCinza", Content.Load<Texture2D>("Imagens/FundoCinza") as Texture2D); mSprites.Textures.Add("Cela", Content.Load<Texture2D>("Imagens/Cela") as Texture2D); mSprites.Textures.Add("PortaCela", Content.Load<Texture2D>("Imagens/PortaCela") as Texture2D); mSprites.Textures.Add("OlhosVermelhos", Content.Load<Texture2D>("Imagens/OlhosVermelhos") as Texture2D); mSprites.Textures.Add("Inimigo1", Content.Load<Texture2D>("Imagens/Inimigo1") as Texture2D); mSprites.Textures.Add("Inimigo2", Content.Load<Texture2D>("Imagens/Inimigo2") as Texture2D); mSprites.Textures.Add("Jarro", Content.Load<Texture2D>("Imagens/Jarro") as Texture2D); mSprites.Textures.Add("Poligonos", Content.Load<Texture2D>("Imagens/Poligonos") as Texture2D); mSprites.Textures.Add("CaixaBranca", Content.Load<Texture2D>("Imagens/Branca") as Texture2D); //Adiciona os Sprites mSprites.Sprites.Add("Background", new Sprite.Sprite("Background", new Rectangle(0, 0, 800, 600), true)); mSprites.Sprites.Add("Computador", new Sprite.Sprite("Computador", new Rectangle(198, 0, 250, 250), true)); mSprites.Sprites.Add("QuadradoColorido1", new Sprite.Sprite("PaletaCores", new Rectangle(230, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido2", new Sprite.Sprite("PaletaCores", new Rectangle(245, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido3", new Sprite.Sprite("PaletaCores", new Rectangle(260, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido4", new Sprite.Sprite("PaletaCores", new Rectangle(275, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido5", new Sprite.Sprite("PaletaCores", new Rectangle(290, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido6", new Sprite.Sprite("PaletaCores", new Rectangle(230, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido7", new Sprite.Sprite("PaletaCores", new Rectangle(245, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido8", new Sprite.Sprite("PaletaCores", new Rectangle(260, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido9", new Sprite.Sprite("PaletaCores", new Rectangle(275, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido10", new Sprite.Sprite("PaletaCores", new Rectangle(290, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido11", new Sprite.Sprite("PaletaCores", new Rectangle(305, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido12", new Sprite.Sprite("PaletaCores", new Rectangle(320, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido13", new Sprite.Sprite("PaletaCores", new Rectangle(337, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true));

41

mSprites.Sprites.Add("QuadradoColorido14", new Sprite.Sprite("PaletaCores", new Rectangle(352, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido15", new Sprite.Sprite("PaletaCores", new Rectangle(367, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido16", new Sprite.Sprite("PaletaCores", new Rectangle(305, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido17", new Sprite.Sprite("PaletaCores", new Rectangle(320, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido18", new Sprite.Sprite("PaletaCores", new Rectangle(337, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido19", new Sprite.Sprite("PaletaCores", new Rectangle(352, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido20", new Sprite.Sprite("PaletaCores", new Rectangle(367, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido21", new Sprite.Sprite("PaletaCores", new Rectangle(382, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido22", new Sprite.Sprite("PaletaCores", new Rectangle(399, 168, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido23", new Sprite.Sprite("PaletaCores", new Rectangle(382, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("QuadradoColorido24", new Sprite.Sprite("PaletaCores", new Rectangle(399, 180, 15, 15), new Rectangle(GenerateColorSquare(), 0, 31, 31), true)); mSprites.Sprites.Add("PainelComputador", new Sprite.Sprite("PainelComputador", new Rectangle(215, 165, 210, 33), true)); mSprites.Sprites.Add("FundoCinza", new Sprite.Sprite("FundoCinza", new Rectangle(75, 60, mSprites.Textures["FundoCinza"].Width, mSprites.Textures["FundoCinza"].Height), true)); mSprites.Sprites.Add("Selecionar", new Sprite.Sprite("Selecionar", new Rectangle(100, 60, 75, 75))); mSprites.Sprites.Add("Fundo", new Sprite.Sprite("Fundo", new Rectangle(75, 60, mSprites.Textures["Fundo"].Width, mSprites.Textures["Fundo"].Height), true)); mSprites.Sprites.Add("Jogador", new Sprite.Sprite("Jogador", new Rectangle(340, 480, 50, 50), new Rectangle(0, 0, 256, mSprites.Textures["Jogador"].Height), true, new Vector2(1, 1))); mSprites.Sprites.Add("Vidas1", new Sprite.Sprite("Jogador", new Rectangle(340, 540, 30, 30), new Rectangle(0, 0, 256, mSprites.Textures["Jogador"].Height), true)); mSprites.Sprites.Add("Vidas2", new Sprite.Sprite("Jogador", new Rectangle(370, 540, 30, 30), new Rectangle(0, 0, 256, mSprites.Textures["Jogador"].Height), true)); mSprites.Sprites.Add("Vidas3", new Sprite.Sprite("Jogador", new Rectangle(400, 540, 30, 30), new Rectangle(0, 0, 256, mSprites.Textures["Jogador"].Height), true)); mSprites.Sprites.Add("Cela", new Sprite.Sprite("Cela", new Rectangle(400, 230, 200, 245), true)); mSprites.Sprites.Add("OlhosVermelhos1", new Sprite.Sprite("OlhosVermelhos", new Rectangle(465, 271, 10, 20))); mSprites.Sprites.Add("OlhosVermelhos2", new Sprite.Sprite("OlhosVermelhos", new Rectangle(465, 345, 10, 20))); mSprites.Sprites.Add("OlhosVermelhos3", new Sprite.Sprite("OlhosVermelhos", new Rectangle(465, 416, 10, 20))); mSprites.Sprites.Add("PortaCela1", new Sprite.Sprite("PortaCela", new Rectangle(430, 249, 85, 65), true)); mSprites.Sprites.Add("PortaCela2", new Sprite.Sprite("PortaCela", new Rectangle(430, 324, 85, 65), true)); mSprites.Sprites.Add("PortaCela3", new Sprite.Sprite("PortaCela", new Rectangle(430, 394, 85, 65), true)); mSprites.Sprites.Add("Inimigo2", new Sprite.Sprite("Inimigo2", new Rectangle(0, 0, 100, 100), new Vector2(1, 1))); mSprites.Sprites.Add("Inimigo1", new Sprite.Sprite("inimigo1", new Rectangle(0, 0, 100, 100), new Vector2(1, 1))); mSprites.Sprites.Add("Aviso", new Sprite.Sprite("Aviso", new Rectangle(0, 0, this.Window.ClientBounds.Width, this.Window.ClientBounds.Height))); //Adiciona os sprites dos polgonos for (int aIndex = 0; aIndex < mGameData.CustomData["PoligonosMax"]; aIndex++) { string aKey = "Poligonos" + (aIndex + 1).ToString(); mSprites.Sprites.Add(aKey, new Sprite.Sprite("Poligonos", new Rectangle(0, 0, 75, 50), new Rectangle(0, 0, mSprites.Textures["Poligonos"].Width, 77))); }//Realiza clculo para prximo (int aIndex = 0; aIndex < mPoligonosMax; aIndex++) true)); mSprites.Sprites.Add("Jarro", new Sprite.Sprite("Jarro", new Rectangle(-5, 175, 210, 300),

mSprites.Sprites.Add("FimDeJogo", new Sprite.Sprite("CaixaBranca", new Rectangle(this.Window.ClientBounds.Width / 2 - mSprites.Textures["CaixaBranca"].Width / 2 - 100, this.Window.ClientBounds.Height / 2 - mSprites.Textures["CaixaBranca"].Height / 2, mSprites.Textures["CaixaBranca"].Width + 200, mSprites.Textures["CaixaBranca"].Height)));

42

mSprites.Sprites.Add("ProximoNivel", new Sprite.Sprite("CaixaBranca", new Rectangle(this.Window.ClientBounds.Width / 2 - mSprites.Textures["CaixaBranca"].Width / 2 - 100, this.Window.ClientBounds.Height / 2 - mSprites.Textures["CaixaBranca"].Height / 2, mSprites.Textures["CaixaBranca"].Width + 200, mSprites.Textures["CaixaBranca"].Height))); //Insere o tempo em que os sprites estaro visveis mSprites.Sprites["Aviso"].VisibleTime = 1; mSprites.Sprites["OlhosVermelhos1"].VisibleTime = 5; mSprites.Sprites["OlhosVermelhos1"].Flash = true; mSprites.Sprites["OlhosVermelhos1"].Visible = true; mSprites.Sprites["OlhosVermelhos2"].VisibleTime = 7; mSprites.Sprites["OlhosVermelhos2"].Flash = true; mSprites.Sprites["OlhosVermelhos2"].Visible = true; mSprites.Sprites["OlhosVermelhos3"].VisibleTime = 4; mSprites.Sprites["OlhosVermelhos3"].Flash = true; mSprites.Sprites["OlhosVermelhos3"].Visible = true; for (int aIndex = 1; aIndex < 25; aIndex++) { string aKey = "QuadradoColorido" + aIndex.ToString(); mSprites.Sprites[aKey].VisibleTime = (float)mRandomGenerate.Next(2, 9) / 10; mSprites.Sprites[aKey].Visible = true; }//Realiza clculo para prximo (int aIndex = 1; aIndex < 25; aIndex++) mSprites.Sprites["Jogador"].Moving = false; mSprites.Sprites["Jogador"].Direction = GeoJogo.Sprite.Sprite.eDirection.None; }//Fim de LoadTextures() //Carrega todos os objetos de texto que sero mostrados protected void LoadText() { //Inicializa a classe TextManagement mDisplayText = new Text.TextManagement(this.graphics.GraphicsDevice, Content); //Inicializa os objetos Text mDisplayText.Texts.Add("Vidas", new Text.Text(new Vector2(240, 550), "VIDAS* ", 14)); mDisplayText.Texts.Add("Nivel", new Text.Text(new Vector2(459, 80), "NIVEL: ", 14)); mDisplayText.Texts.Add("ValorNivel", new Text.Text(new Vector2(570, 80), mGameData.Level.ToString(), 14)); mDisplayText.Texts.Add("Pontuacao", new Text.Text(new Vector2(459, 100), "PONTOS:", 14)); mDisplayText.Texts.Add("ValorPontuacao", new Text.Text(new Vector2(590, 100), mGameData.Score.ToString(), 15)); mDisplayText.Texts.Add("Poligonos", new Text.Text(new Vector2(10, 100), "POLIGONOS ", 15)); mDisplayText.Texts.Add("ValorPoligonos", new Text.Text(new Vector2(30, 120), mGameData.CustomData["Poligonos"].ToString() + " DE " + mGameData.CustomData["PoligonosMax"].ToString(), 15)); mDisplayText.Texts.Add("ValorQuestao1", new Text.Text(new Vector2(265, 100), " ", 25)); Random aVerifyOperation = new Random(); int mVerifyOperation = aVerifyOperation.Next(1, 2); switch (mVerifyOperation) { case 1: { mDisplayText.Texts.Add("SimboloQuestao", new Text.Text(new Vector2(305, 100), "+", 25)); }break; case 2: { mDisplayText.Texts.Add("SimboloQuestao", new Text.Text(new Vector2(305, 60), "-", 25)); }break; } mDisplayText.Texts.Add("ValorQuestao2", new Text.Text(new Vector2(345, 100), " ", 25)); mDisplayText.Texts.Add("ProximoNivel", new Text.Text(new Vector2((this.Window.ClientBounds.Width / 2) - 200, (this.Window.ClientBounds.Height / 2) - 15), "NIVEL " + mGameData.Level.ToString(), 50)); mDisplayText.Texts.Add("FimDeJogo", new Text.Text(new Vector2(this.Window.ClientBounds.Width / 2 - 210, this.Window.ClientBounds.Height / 2 - 25), "FIM DE JOGO", 35));

43

mDisplayText.Texts.Add("PressioneEspaco", new Text.Text(new Vector2(this.Window.ClientBounds.Width / 2 - 240, this.Window.ClientBounds.Height / 2 + 30), "PRESSIONE ESPACO PARA REINICIAR OU ESC PARA SAIR", 7)); mDisplayText.Texts.Add("Quadrado1", new Text.Text(new Vector2(225, 260), " ", 35)); mDisplayText.Texts.Add("Quadrado2", new Text.Text(new Vector2(300, 260), " ", 35)); mDisplayText.Texts.Add("Quadrado3", new Text.Text(new Vector2(375, 260), " ", 35)); mDisplayText.Texts.Add("Quadrado4", new Text.Text(new Vector2(225, 335), " ", 35)); mDisplayText.Texts.Add("Quadrado5", new Text.Text(new Vector2(300, 335), " ", 35)); mDisplayText.Texts.Add("Quadrado6", new Text.Text(new Vector2(375, 335), " ", 35)); mDisplayText.Texts.Add("Quadrado7", new Text.Text(new Vector2(225, 410), " ", 35)); mDisplayText.Texts.Add("Quadrado8", new Text.Text(new Vector2(300, 410), " ", 35)); mDisplayText.Texts.Add("Quadrado9", new Text.Text(new Vector2(375, 410), " ", 35)); //Este texto no ir aparecer no Batch.Draw, ele ser mostrado em outra ponto do jogo //Deixar invisvel por enquanto mDisplayText.Texts["ProximoNivel"].Visible = false; mDisplayText.Texts["FimDeJogo"].Visible = false; mDisplayText.Texts["PressioneEspaco"].Visible = false; }//Fim de LoadText() //Carrega todos os dados de jogo relacionados ao game protected void LoadGameData() { //Inicializa o objeto GameData mGameData = new GeoJogo.GameData(); //Add some custom game data mGameData.CustomData.Add("Poligonos", 0); mGameData.CustomData.Add("PoligonosMax", 10); mGameData.CustomData.Add("PontosQuestao", 100); }//Fim de LoadGameData() //Inicializa todos os parmetros dos dados do jogo para iniciar ou reiniciar o jogo protected void StartGame() { mSprites.Sprites["Jogador"].GridPosition = new Vector2(1, 1); mGameData.Lives = 3; mGameData.Score = 0; mGameData.Level = 1; mGameData.CustomData["Poligonos"] = 0; mDisplayText.Texts["ProximoNivel"].Value = "NIVEL " + mGameData.Level.ToString(); mDisplayText.Texts["ProximoNivel"].VisibleTime = 1; mDisplayText.Texts["ProximoNivel"].Visible = true; mSprites.Sprites["ProximoNivel"].VisibleTime = 1; mSprites.Sprites["ProximoNivel"].Visible = true; mSprites.Sprites["FimDeJogo"].Visible = false; //Esconde os Poligonos do Jarro for (int index = 0; index < mGameData.CustomData["PoligonosMax"]; index++) { string aKey = "Poligonos" + (index + 1).ToString(); mSprites.Sprites[aKey].Visible = false; } GenerateNextQuestion(); } CurrentState = GameState.Rodando;

/// <summary> /// UnloadContent ser chamado uma vez por instncia para descarregar o contedo manualmente /// </summary> protected override void UnloadContent() { // Descarregar todo o contedo que no for de ContentManager aqui } /// <summary> /// Permite ao jogo rodar a lgica, como se estivesse atualizando o mundo

44

/// Checando colises, teclas pressionadas, tocando sons, etc. /// </summary> /// <param name="gameTime">Fornece o tempo jogo desde sua inicializao.</param> protected override void Update(GameTime gameTime) { // O tempo de jogo desde o ltimo Update() float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; UpdateText(); UpdateSprite(elapsed); UpdateEnemyCreature(elapsed); UpdateComputerPanel(elapsed); UpdateState(elapsed); mSprites.Update(elapsed); mDisplayText.Update(elapsed); UpdateWarning(); UpdatePoligons(); UpdateKeyboard(); //Se o jogador for devorado, a questo no ser mostrada //por um tempo determinado. Aps isso //a questo ser mostrada novamente if (CurrentState == GameState.Devorado) { mDisplayText.Texts["ValorQuestao1"].Visible = false; mDisplayText.Texts["ValorQuestao2"].Visible = false; mDisplayText.Texts["SimboloQuestao"].Visible = false; } else { mDisplayText.Texts["ValorQuestao1"].Visible = true; mDisplayText.Texts["ValorQuestao2"].Visible = true; mDisplayText.Texts["SimboloQuestao"].Visible = true; } //Se o jogador pular, no mostrar que est selecionan um quadrado //s mostrar que est selecionado, quando o jogador estiver parado if (mSprites.Sprites["Jogador"].Moving == false) { //Tornar o Selecionar visvel mSprites.Sprites["Selecionar"].Position = new Vector2((206 - 75) + (mSprites.Sprites["Jogador"].GridPositionX * 75), (240 - 75) + (mSprites.Sprites["Jogador"].GridPositionY * 75)); mSprites.Sprites["Selecionar"].Visible = true; } else { mSprites.Sprites["Selecionar"].Visible = false; } //Atualizar a localizao do jogador if (mSprites.Sprites["Jogador"].Moving == false) { mSprites.Sprites["Jogador"].Position = new Vector2((217 - 75) + (mSprites.Sprites["Jogador"].GridPositionX * 75), (247 - 75) + (mSprites.Sprites["Jogador"].GridPositionY * 75)); } //Desenhar o nmero de vidas mSprites.Sprites["Vidas1"].Visible = false; mSprites.Sprites["Vidas2"].Visible = false; mSprites.Sprites["Vidas3"].Visible = false; for (int aIndex = 0; aIndex < mGameData.Lives; aIndex++) { string aKey = "Vidas" + (aIndex + 1).ToString(); mSprites.Sprites[aKey].Visible = true; } //Olhos Vermelhos

45

if (mSprites.Sprites["Aviso"].Visible == true) { //Mostrar todos os trs olhos vermelhos mSprites.Sprites["OlhosVermelhos1"].Visible = true; mSprites.Sprites["OlhosVermelhos2"].Visible = true; mSprites.Sprites["OlhosVermelhos3"].Visible = true; } //Mostrar o inimigo de boca aberta ou fechada if (CurrentState == GameState.InimigoLiberado) { mSprites.Sprites["Inimigo1"].Position = new Vector2((197 - 75) + (mSprites.Sprites["Inimigo1"].GridPositionX * 75), (227 - 75) + (mSprites.Sprites["Inimigo1"].GridPositionY * 75)); mSprites.Sprites["Inimigo2"].Position = new Vector2((197 - 75) + (mSprites.Sprites["Inimigo1"].GridPositionX * 75), (227 - 75) + (mSprites.Sprites["Inimigo1"].GridPositionY * 75)); } else { mSprites.Sprites["Inimigo1"].Visible = false; mSprites.Sprites["Inimigo2"].Visible = false; } if (CurrentState == GameState.InimigoLiberado) { if (mSprites.Sprites["Inimigo1"].GridPositionX == mSprites.Sprites["Jogador"].GridPositionX && mSprites.Sprites["Inimigo1"].GridPositionY == mSprites.Sprites["Jogador"].GridPositionY) { CurrentState = GameState.Devorado; } } } base.Update(gameTime);

private void UpdateState(float elapsed) { mTimeInState += elapsed; switch (CurrentState) { case GameState.Rodando: { break; } case GameState.Devorado: { if (mTimeInState > (float)1.0) { CurrentState = GameState.Rodando; } break; } case GameState.InimigoLiberado: { break; } case GameState.ProximoNivel: { break; } case GameState.FimDeJogo: { break; }

} }

46

private GameState CurrentState { get { return mCurrentState; } set { mCurrentState = value; mTimeInState = 0; switch (mCurrentState) { case GameState.Devorado: { Eaten(); break; } case GameState.FimDeJogo: { //Funo FimDeJogo(); break; } case GameState.ProximoNivel: { //Funo ProximoNivel(); break; } case GameState.Rodando: { //Funo Rodando(); break; } case GameState.InimigoLiberado: { //Funo InimigoLiberado(); mSprites.Sprites["Inimigo2"].Visible = true; break; }

private void Eaten() { mSprites.Sprites["Jogador"].GridPosition = new Vector2(1, 1); mGameData.Lives -= 1; if (mGameData.Lives < 0) { mGameData.Lives = 0; CurrentState = GameState.FimDeJogo; } } //Pisca o Aviso private void UpdateWarning() { //Se o aviso ainda estiver sendo mostrado(Elapsed > 0) ento ele ser //configurado pelas propriedades de Visible(True/False) if (mSprites.Sprites["Aviso"].Elapsed > 0) { mSprites.Sprites["Aviso"].Visible = !mSprites.Sprites["Aviso"].Visible; } else { mSprites.Sprites["Aviso"].Visible = false; }//Fim do if (mSprites.Sprites["Warning"].Elapsed > 0) }//Fim de UpdateWarning

47

private void UpdatePoligons() { for (int aIndex = 0; aIndex < mGameData.CustomData["PoligonosMax"]; aIndex++) { string aKey = "Poligonos" + (aIndex + 1).ToString(); if (mSprites.Sprites[aKey].Visible == true && mSprites.Sprites[aKey].Moving == true) { mSprites.Sprites[aKey].Position = new Vector2(mSprites.Sprites[aKey].Position.X, mSprites.Sprites[aKey].Position.Y + 1); if (mSprites.Sprites[aKey].Position.Y > 400) { mSprites.Sprites[aKey].Moving = false; } else { for (int aCheck = 0; aCheck < aIndex; aCheck++) { string aComparisonKey = "Poligonos" + (aCheck + 1).ToString(); if (mSprites.Sprites[aKey].Position.Y > mSprites.Sprites[aComparisonKey].Position.Y - 50 && mSprites.Sprites[aKey].Position.X == mSprites.Sprites[aComparisonKey].Position.X) { mSprites.Sprites[aKey].Moving = false; } } } } }

private void UpdateComputerPanel(float elapsed) { for (int aIndex = 1; aIndex < 25; aIndex++) { string aKey = "QuadradoColorido" + aIndex.ToString(); if (mSprites.Sprites[aKey].Visible == false) { mSprites.Sprites[aKey].TexturePositionX = GenerateColorSquare(); mSprites.Sprites[aKey].Visible = true; }

private void UpdateEnemyCreature(float elapsed) { if (CurrentState == GameState.InimigoLiberado) { mMoveEnemyElapsed -= elapsed; if (mMoveEnemyElapsed < 0) { mMoveEnemyElapsed = (float)0.5; int aDirection = mRandomGenerate.Next(1, 3); if (aDirection == 1) { int enemyX = (int)mSprites.Sprites["Inimigo1"].GridPositionX; enemyX += mRandomGenerate.Next(-1, 2); do { enemyX = (int)mSprites.Sprites["Inimigo1"].GridPositionX; int move = 0; switch (mRandomGenerate.Next(1, 4)) { case 1: move = -1; break; case 2: move = 0; break; case 3:

48

} enemyX += move; } while (enemyX < 1 | enemyX > 3); mSprites.Sprites["Inimigo1"].GridPosition = new Vector2(enemyX, mSprites.Sprites["Inimigo1"].GridPositionY); } else { int enemyY = (int)mSprites.Sprites["Inimigo1"].GridPositionY; enemyY += mRandomGenerate.Next(-1, 2); do { enemyY = (int)mSprites.Sprites["Inimigo1"].GridPositionY; int move = 0; switch (mRandomGenerate.Next(1, 4)) { case 1: move = -1; break; case 2: move = 0; break; case 3: move = 1; break; } enemyY += move; } while (enemyY < 1 | enemyY > 3); mSprites.Sprites["Inimigo1"].GridPosition = new Vector2(mSprites.Sprites["Inimigo1"].GridPositionX, enemyY); } } mEnemyMouthElapsed -= elapsed; if (mEnemyMouthElapsed < 0) { mEnemyMouthElapsed = (float)0.3; mSprites.Sprites["Inimigo1"].Visible = !mSprites.Sprites["Inimigo2"].Visible; mSprites.Sprites["Inimigo1"].Visible = !mSprites.Sprites["Inimigo2"].Visible; }

move = 1; break;

//Atualiza todos os objetos de texto para sus ltimos valores protected void UpdateText() { //Atualiza os valores dos textos dinmicos mDisplayText.Texts["ValorNivel"].Value = mGameData.Level.ToString(); mDisplayText.Texts["ValorPontuacao"].Value = mGameData.Score.ToString(); mDisplayText.Texts["ValorPoligonos"].Value = mGameData.CustomData["Poligonos"].ToString() + " DE " + mGameData.CustomData["PoligonosMax"].ToString(); }//Fim de UpdateText() //Atualiza o Sprite protected void UpdateSprite(float elapsed) { mMovePlayerElapsed -= elapsed; //Atualiza o sprite if (mMovePlayerElapsed < 0) { mMovePlayerElapsed = (float)0.05; if (CurrentState != GameState.FimDeJogo && mSprites.Sprites["Jogador"].Moving == true) { switch (mCurrentPlayerState) { //Ocioso case PlayerState.Ocioso: {

49

mSprites.Sprites["Jogador"].TexturePositionX = 256; mCurrentPlayerState = PlayerState.AntesPular; mPlayerStateStartX = (int)mSprites.Sprites["Jogador"].Position.X; mPlayerStateStartY = (int)mSprites.Sprites["Jogador"].Position.Y; break;

//AntesPular case PlayerState.AntesPular: { mSprites.Sprites["Jogador"].TexturePositionX = 0; mCurrentPlayerState = PlayerState.ArcoAcima; break; } //ArcoAcima case PlayerState.ArcoAcima: { mSprites.Sprites["Jogador"].TexturePositionX = 0; if (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Left) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X - 30, mSprites.Sprites["Jogador"].Position.Y - 20); } else if (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Right) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X + 30, mSprites.Sprites["Jogador"].Position.Y - 20); } else if (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Up) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X + 20, mSprites.Sprites["Jogador"].Position.Y - 30); } else if (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Down) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X + 20, mSprites.Sprites["Jogador"].Position.Y + 30); } mCurrentPlayerState = PlayerState.ArcoAbaixo; break;

//ArcoAbaixo case PlayerState.ArcoAbaixo: { mSprites.Sprites["Jogador"].TexturePositionX = 256; mCurrentPlayerState = PlayerState.AposPular; if (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Left) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X - 30, mSprites.Sprites["Jogador"].Position.Y + 10); } else if (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Right) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X + 30, mSprites.Sprites["Jogador"].Position.Y + 10); }

50

else if (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Up) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X - 10, mSprites.Sprites["Jogador"].Position.Y - 30); } else if (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Down) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X - 10, mSprites.Sprites["Jogador"].Position.Y + 30); } } break;

//Ocioso case PlayerState.AposPular: { mSprites.Sprites["Jogador"].TexturePositionX = 0; if ((mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Left) | (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Right)) { mSprites.Sprites["Jogador"].Position = new Vector2(mSprites.Sprites["Jogador"].Position.X, mPlayerStateStartY); } else if ((mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Up) | (mSprites.Sprites["Jogador"].Direction == GeoJogo.Sprite.Sprite.eDirection.Down)) { mSprites.Sprites["Jogador"].Position = new Vector2(mPlayerStateStartX, mSprites.Sprites["Jogador"].Position.Y); } mSprites.Sprites["Jogador"].Direction = GeoJogo.Sprite.Sprite.eDirection.None; mSprites.Sprites["Jogador"].Moving = false; mCurrentPlayerState = PlayerState.Ocioso; } break;

} } //Verificar teclas pressionadas protected void UpdateKeyboard() { //Pega o estado atual do teclado KeyboardState aKeyboard = Keyboard.GetState(); //Pega as teclas que esto sendo pressionadas Keys[] aCurrentKeys = aKeyboard.GetPressedKeys(); m_SpacePressed = false; //Move o sprite de acordo com a tecla pressionada for (int aCurrentKey = 0; aCurrentKey < aCurrentKeys.Length; aCurrentKey++) { if (mSprites.Sprites["Jogador"].Moving == false && CurrentState != GameState.FimDeJogo && mSprites.Sprites["ProximoNivel"].Elapsed == 0) {

51

//Muda a direo do sprite para a esquerda e o move para a mesma if (aCurrentKeys[aCurrentKey] == Keys.Left) { if (mSprites.Sprites["Jogador"].GridPositionX > 1) { mSprites.Sprites["Jogador"].GridPositionX -= 1; mSprites.Sprites["Jogador"].Moving = true; mSprites.Sprites["Jogador"].Direction = GeoJogo.Sprite.Sprite.eDirection.Left; } }

//Muda a direo do sprite para a direita e o move para a mesma if (aCurrentKeys[aCurrentKey] == Keys.Right) { if (mSprites.Sprites["Jogador"].GridPositionX < 3) { mSprites.Sprites["Jogador"].GridPositionX += 1; mSprites.Sprites["Jogador"].Moving = true; mSprites.Sprites["Jogador"].Direction = GeoJogo.Sprite.Sprite.eDirection.Right; }

//Muda a direo do sprite para cima e o move para a mesma if (aCurrentKeys[aCurrentKey] == Keys.Up) { if (mSprites.Sprites["Jogador"].GridPositionY > 1) { mSprites.Sprites["Jogador"].GridPositionY -= 1; mSprites.Sprites["Jogador"].Moving = true; mSprites.Sprites["Jogador"].Direction = GeoJogo.Sprite.Sprite.eDirection.Up; } } //Muda a direo do sprite para baixo e o move para a mesma if (aCurrentKeys[aCurrentKey] == Keys.Down) { if (mSprites.Sprites["Jogador"].GridPositionY < 3) { mSprites.Sprites["Jogador"].GridPositionY += 1; mSprites.Sprites["Jogador"].Moving = true; mSprites.Sprites["Jogador"].Direction = GeoJogo.Sprite.Sprite.eDirection.Down; } }

//Sai do jogo se a tecla ESC for pressionada if (aCurrentKeys[aCurrentKey] == Keys.Escape) { this.Exit(); } if (CurrentState == GameState.FimDeJogo) { if (aCurrentKeys[aCurrentKey] == Keys.Space) { StartGame(); } } if (aCurrentKeys[aCurrentKey] == Keys.Enter)

52

{ }

GenerateNextQuestion();

if (aCurrentKeys[aCurrentKey] == Keys.Space) { m_SpacePressed = true; }

if (CurrentState != GameState.FimDeJogo && mSprites.Sprites["ProximoNivel"].Elapsed == 0) { if (m_SpacePressed == true && m_SpacePressed != m_SpacePressedBefore) { CheckAnswer(); //mAnswered = true; m_SpacePressedBefore = m_SpacePressed; } else if (m_SpacePressed != m_SpacePressedBefore) { m_SpacePressedBefore = m_SpacePressed; } } } protected void NextLevel() { mGameData.Level += 1; mGameData.CustomData["Poligonos"] = 0; for (int index = 0; index < mGameData.CustomData["PoligonosMax"]; index++) { string aKey = "Poligonos" + (index + 1).ToString(); mSprites.Sprites[aKey].Visible = false; } mDisplayText.Texts["ProximoNivel"].Value = "NIVEL " + mGameData.Level.ToString(); mDisplayText.Texts["ProximoNivel"].Visible = true; mSprites.Sprites["ProximoNivel"].Visible = true; mSprites.Sprites["Jogador"].GridPositionX = 1; mSprites.Sprites["Jogador"].GridPositionY = 1; }//Fim de NextLevel() protected void GenerateNextQuestion() { mGameData.CustomData["PontosQuestao"] = 100; mDisplayText.Texts["ValorQuestao1"].Value = mRandomGenerate.Next(0, 10).ToString(); mDisplayText.Texts["ValorQuestao2"].Value = mRandomGenerate.Next(0, 10).ToString(); do {

mDisplayText.Texts["ValorQuestao1"].Value = mRandomGenerate.Next(0, 10).ToString(); mDisplayText.Texts["ValorQuestao2"].Value = mRandomGenerate.Next(0, 10).ToString(); } while (int.Parse(mDisplayText.Texts["ValorQuestao1"].Value) + int.Parse(mDisplayText.Texts["ValorQuestao2"].Value) > 9); //Pega um quadrado aleatrio para inserir neste a resposta correta int aCorrectAnswerSquareIndex = mRandomGenerate.Next(0, 9); int aCorrectAnswer = int.Parse(mDisplayText.Texts["ValorQuestao1"].Value) + int.Parse(mDisplayText.Texts["ValorQuestao2"].Value); for (int aIndex = 0; aIndex < 9; aIndex++) { string aKey = "Quadrado" + (aIndex + 1).ToString(); if (aIndex == aCorrectAnswerSquareIndex) { mDisplayText.Texts[aKey].Value = aCorrectAnswer.ToString(); } else { mDisplayText.Texts[aKey].Value = mRandomGenerate.Next(0, 10).ToString();

53

do {

} } }// Fim de GenerateNextQuestion()

mDisplayText.Texts[aKey].Value = mRandomGenerate.Next(0, 10).ToString(); } while (mDisplayText.Texts[aKey].Value == aCorrectAnswer.ToString());

protected void CheckAnswer() { int aCorrectAnswer = int.Parse(mDisplayText.Texts["ValorQuestao1"].Value) + int.Parse(mDisplayText.Texts["ValorQuestao2"].Value); if (mSprites.Sprites["Jogador"].GridPositionX == 1 && mSprites.Sprites["Jogador"].GridPositionY == 1) { if (mDisplayText.Texts["Quadrado1"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); } } else if (mSprites.Sprites["Jogador"].GridPositionX == 1 && mSprites.Sprites["Jogador"].GridPositionY == 2) { if (mDisplayText.Texts["Quadrado4"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); } } else if (mSprites.Sprites["Jogador"].GridPositionX == 1 && mSprites.Sprites["Jogador"].GridPositionY == 3) { if (mDisplayText.Texts["Quadrado7"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); } } else if (mSprites.Sprites["Jogador"].GridPositionX == 2 && mSprites.Sprites["Jogador"].GridPositionY == 1) { if (mDisplayText.Texts["Quadrado2"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); } } else if (mSprites.Sprites["Jogador"].GridPositionX == 2 && mSprites.Sprites["Jogador"].GridPositionY == 2) { if (mDisplayText.Texts["Quadrado5"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); } } else if (mSprites.Sprites["Jogador"].GridPositionX == 2 && mSprites.Sprites["Jogador"].GridPositionY == 3)

54

} else if (mSprites.Sprites["Jogador"].GridPositionX == 3 && mSprites.Sprites["Jogador"].GridPositionY == 1) { if (mDisplayText.Texts["Quadrado3"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); } } else if (mSprites.Sprites["Jogador"].GridPositionX == 3 && mSprites.Sprites["Jogador"].GridPositionY == 2) { if (mDisplayText.Texts["Quadrado6"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); } } else if (mSprites.Sprites["Jogador"].GridPositionX == 3 && mSprites.Sprites["Jogador"].GridPositionY == 3) { if (mDisplayText.Texts["Quadrado9"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); } } } protected void CorrectAnswer() { mGameData.Score += mGameData.CustomData["PontosQuestao"]; mGameData.CustomData["Poligonos"] += 1; DropPoligons(); CurrentState = GameState.Rodando; //mEnemyReleased = false; if (mGameData.CustomData["Poligonos"] == mGameData.CustomData["PoligonosMax"]) { NextLevel(); } else { GenerateNextQuestion(); }

if (mDisplayText.Texts["Quadrado8"].Value == (aCorrectAnswer).ToString()) { CorrectAnswer(); } else { WrongAnswer(); }

protected void WrongAnswer() { if (CurrentState != GameState.InimigoLiberado) { mSprites.Sprites["Inimigo1"].GridPositionX = 3; switch ((int)mSprites.Sprites["Jogador"].GridPositionY)

55

} CurrentState = GameState.InimigoLiberado; //mEnemyReleased = true;

case 1: mSprites.Sprites["Inimigo1"].GridPositionY = 3; break; case 2: mSprites.Sprites["Inimigo1"].GridPositionY = 3; break; case 3: mSprites.Sprites["Inimigo1"].GridPositionY = 1; break;

mGameData.CustomData["PontosQuestao"] -= 20; if (mGameData.CustomData["PontosQuestao"] < 0) { mGameData.CustomData["PontosQuestao"] = 0; } mSprites.Sprites["Aviso"].Visible = true; } //Gera uma nova cor para o quadrado colorido protected int GenerateColorSquare() { //Pega uma cor para o quadrado na paleta de cores que est no painel switch (mRandomGenerate.Next(0, 5)) { case 0: { return 0; } case 1: { } case 2: { } case 3: { } case 4: { } }

return 31;

return 61;

return 93;

return 121;

return 0; }//Fim de GenerateColorSquare() //Caindo poligonos no Jarro protected void DropPoligons() { //Pega a chava do polgono que est caindo e a insere no seu respectivo sprite para que a mesma e mova e seja visvel string aKey = "Poligonos" + mGameData.CustomData["Poligonos"].ToString(); mSprites.Sprites[aKey].Visible = true; mSprites.Sprites[aKey].Moving = true; apropriada //Pega uma das cinco cores dos poligonos e a insere na posioY do polgono com a textura switch (mRandomGenerate.Next(0, 5)) {

56

case 0: { } case 1: { } case 2: { } case 3: { } case 4: {

mSprites.Sprites[aKey].TexturePositionY = 0; break;

mSprites.Sprites[aKey].TexturePositionY = 95; break;

mSprites.Sprites[aKey].TexturePositionY = 190; break;

mSprites.Sprites[aKey].TexturePositionY = 285; break;

} }//Fim de switch (mRandomGenerate.Next(0, 5)) //Determina se o polgono est caindo if (mGameData.CustomData["Poligonos"] { mSprites.Sprites[aKey].Position = } else { mSprites.Sprites[aKey].Position = }// fim de if (mPoligons - 1 < 5) }//Fim de DropyPoligons()

mSprites.Sprites[aKey].TexturePositionY = 380; break;

no lado esquerdo ou direito do jarro - 1 < 5) new Vector2(20, 0);

new Vector2(95, 0);

/// <summary> /// Isto chamado quando o jogo vai desenhar na tela /// </summary> /// <param name="gameTime">Fornece o tempo de jogo desde sua inicializao.</param> protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(Color.White); // O cdigo de desenho inserido aqui //Comea a desenhar os sprites Usando AlphaBlend como o modo de Blend, ir fornece a propriedades de transparncia s imagens. spriteBatch.Begin(); //Desenha todos os objetos visveis mSprites.Draw(spriteBatch); //Desenha todos os textos visveis mDisplayText.Draw(spriteBatch); //Redesenha os sprites que mSprites.Draw(spriteBatch, mSprites.Draw(spriteBatch, mSprites.Draw(spriteBatch, precisam ser mostrados no canto superior esquerdo "Jogador"); "Inimigo1"); "Inimigo2");

//Redesenha o texto do prximo nvel e o insere na caixa branca, caso necessrio if (mSprites.Sprites["ProximoNivel"].Elapsed > 0) { mSprites.Draw(spriteBatch, "ProximoNivel"); mDisplayText.Draw(spriteBatch, "ProximoNivel"); }//Fim de End if (mSprites.Sprites["ProximoNivel"].Elapsed > 0) //Redesenha o texto de Fim de Jogo e o insere na caixa, caso necessrio if (CurrentState == GameState.FimDeJogo) {

57

mSprites.Sprites["FimDeJogo"].Visible = true; mSprites.Draw(spriteBatch, "FimDeJogo"); mDisplayText.Draw(spriteBatch, "FimDeJogo"); mDisplayText.Draw(spriteBatch, "PressioneEspaco"); }//Fim de if (CurrentState == GameState.FimDeJogo) spriteBatch.End(); base.Draw(gameTime); }//Fim de Draw

} } using System; using System.Collections.Generic; using System.Text; namespace GeoJogo { class GameData { //Class Construtura de GameData public GameData() { }//Fim da criao do objeto GameData() //Nmero de Vidas private int mLives = 3; public int Lives { get { return mLives; } set { mLives = value; } }//Fim das propriedades de Lives //Nvel atual private int mLevel = 1; public int Level { get { return mLevel; } set { mLevel = value; } }//Fim das propriedades de Level //Pontuao Atual private int mScore = 0; public int Score { get { return mScore; } set { mScore = value; } }//Fim da Propriedade de Score //Dados aleatrios do Jogo Dictionary<string, int> mCustomData = new Dictionary<string, int>(); public Dictionary<string, int> CustomData { get { return mCustomData;

58

mCustomData = value; } }//Fim de CustomData(Dados Aleatrios) }//Fim da classe GameData }//Fim do namespace GeoJogo

} set {

12.2 LICENA GPL/GNU


Jogo eletrnico com nfase didtica Copyright (C) 2011 Maycown Douglas de Oliveira Miranda This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. A licena deve ser anexada em ingls ao projeto, segundo as normas da mesma. Devido a confuses causadas por parte de tradues, pois no disponibilizada nenhuma licena oficial em outros idiomas, apenas no-oficiais para consulta.

Você também pode gostar