




































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila do Framework XNA voltado para criação de jogos, usado junto a linguagem .NET
Tipologia: Manuais, Projetos, Pesquisas
1 / 44
Esta página não é visível na pré-visualização
Não perca as partes importantes!





































Bruno Rabello^1
Edson Mattos^1
Bruno Evangelista^2
Esteban Clua^1
desenvolvimento de games criada pela Microsoft chamado XNA (XNA’s Not Acronymed). Ela permite criar jogos para PCs com Windows e para o console Xbox 360. O XNA vem substituir o Managed DirectX, uma versão do DirectX para a plataforma dotNET. Todas as aplicações XNA são compiladas para código gerenciado (managed code, ou Microsoft Intermediate Language). Esse código é executado no Common Language Runtime (CLR), que é a máquina virtual da plataforma dotNET.
development plataform developed by Microsoft, called XNA (XNA´s Not Acronymed). XNA allows the creation of PC games, for Windows plataform and XBOX 360, for a console plataform. XNA aims to substitute the DirectX Manager, a version of DirectX for a .NET plataform. All the applications made in XNA are compiled in a managed code. This code is executed at the Common Language Runtime (CLR), which is the virtual machine of the .NET plataform.
1 Instituto de Computação, Universidade Federal Fluminense 2 Instituto de Informática, Universidade Federal de Minas Gerais
Em 2006 a Microsoft lançou uma plataforma inédita para desenvolvimento de games e aplicações de computação gráfica tempo real, denominado XNA - XNA’s Not Acronymed. Esta é a primeira API unificada para desenvolvimento em PCs e Consoles de Games.
Muitas empresas estão adotando esta plataforma para propósitos comerciais e muitos game engines tradicionais estão sendo portados para este ambiente. O sucesso da ferramenta pode ser comprovado pelo grande volume de fóruns, sites e comunidades que surgem espontaneamente pelo mundo. Além da sua grande qualidade técnica e a simplicidade da arquitetura proposta, o fato de possuir versões de distribuição gratuita garante que a enorme massa de desenvolvedores independentes voltem sua atenção para o XNA.
A confirmada capacidade de produzir aplicações sofisticadas em pouco tempo e com poucos recursos, torna o XNA também uma excelente plataforma para desenvolvimento de pesquisas, não apenas em entretenimento digital mas em outras áreas de interesse acadêmico, tais como inteligência Artificial, computação gráfica, redes e interface homem-máquina.
Em termos acadêmicos, acrescenta-se também ao seu potencial o fato de poder ser utilizado para ensino de diversas disciplinas de computação, o que pode ser comprovado ao observar diversas universidades prestigiosas ao redor de todo o mundo adotando esta estratégia.
O XNA vem substituir o Managed DirectX, uma versão do DirectX para a plataforma dotNET. Todas as aplicações XNA são compiladas para código gerenciado (managed code, ou Microsoft Intermediate Language). Esse código é executado no Common Language Runtime (CLR), que é a máquina virtual da plataforma dotNET.
O ambiente de desenvolvimento que o XNA provê envolve são os seguintes:
2.2 XNA Game Studio Express
IDE baseada no Visual C# 2005 Express. Mantém algumas facilidades do Visual C# 2005 como: syntax highlighting, tecnologia de code complete chamada IntelliSense, just-in time debugging, criação de starter kits (templates de projeto), interface agradável, intuitiva e fácil de usar.
O XNA Game Studio Express (XNA GSE) permite que se criem projetos de games tanto para Windows como para Xbox 360, com o mesmo código fonte, sem grandes alterações. Caso a escolha seja gerar código para Xbox 360, deve-se evitar a utilização de bibliotecas (DLL) com código não gerenciado (unmanaged code). Este console utiliza um sistema operacional específico para ele e um processador próprio, baseado no IBM Power PC com três cores. Assim, uma DLL compilada com código nativo não será entendida no ambiente do Xbox 360, causando erro.
Para introduzir ao uso do XNA, será criado um pequeno exemplo de uma versão 3D do jogo Sokoban. Com ele serão mostrados alguns passos na utilização da IDE, no uso de algumas classes do Framework e do Content Pipeline. Os passos básicos serão descritos de maneira genérica, para que possa ser utilizado em qualquer projeto.
3.1 Criação de um projeto no XNA Game Studio Express
A área de impressão é de 13cmX17cm sendo o tamanho da página definido como 16cm × 23cm. O texto deve ocupar a linha inteira e as figuras não podem ultrapassar as margens definidas. Procure preencher toda a área de impressão da página de modo não deixar mais do que 2 cm em branco no final de cada página. Faça seu maior esforço, movimentando figuras e texto, para completar cada página.
Ao criar um novo projeto, podem-se usar diversos templates, o que facilitarão no ajuste do ambiente para uma aplicação específica. Neste primeiro exemplo, inicia-se com o template do tipo “Windows Game” no MS XNA GSE. Para tal deve-se:
Nesta etapa, o XNA GSE estará configurado para iniciar o desenvolvimento da aplicação. Tanto o ambiente de desenvolvimento como uma série de arquivos foram criados. Estes servirão como ponto de partida para a criação do jogo. Os dois arquivos mais importantes são o Program.cs e o Game.cs.
3.2 Analisando as classes recém-criadas: Program e Game
namespace Sokoban3D { static class Program { static void Main(string[] args) { using (Game1 game = new Game1()) { game.Run(); } } } } A listagem acima mostra a classe Program, que representa o ponto de entrada da aplicação. Por se tratar de uma aplicação .net, o game precisa de uma classe que contenha o método Main, que será a primeira a ser chamada pelo sistema quando for carregado.
Nesta classe foi instanciado um objeto do tipo Game. Pode-se renomear a classe e seu arquivo para atender as nossas necessidades da aplicação. Mais adiante será mostrado como fazer isso usando os recursos do XNA GSE. A classe Game irá conter o código principal com a lógica e renderização da aplicação. A chamada ao método Run consiste na execução desta classe, implicando na execução do loop de um game, que estará desmembrado na implementação da classe Game.
Game1 é uma classe derivada de Game, pertencente ao XNA Framework. Em qualquer jogo implementado no XNA deve-se ter pelo menos uma classe derivada de Game no, pertencente ao Microsoft.Xna.Framework. Esta classe contém métodos que são chamados automaticamente pelo sistema, compondo o game loop. À partir da implementação
Figura 3: Escolhendo o novo nome da classe.
Figura 4: Confirmando o renomeio da classe.
3.4 Entendendo a classe Game
A seguir, na listagem abaixo, apresenta-se detalhes da classe SokobanGame: namespace Sokoban3D { public class SokobanGame : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; ContentManager content;
public Game1() {
graphics = new GraphicsDeviceManager(this); content = new ContentManager(Services); }
protected override void Initialize() protected override void LoadGraphicsContent (bool loadAllContent) protected override void Update(GameTime gameTime) protected override void Draw(GameTime gameTime) protected override void UnloadGraphicsContent (bool unloadAllContent) } } Como já foi dito, SokobanGame sobrescreve alguns métodos presentes na classe Game. O XNA GSE criou stubs destes métodos automaticamente para poderem ser completados com o código apropriado para a aplicação específica. A seguir será explicado sobre o porquê desta classe ser a base de um game XNA.
3.4.1 Abstração do hardware gráfico
O atributo graphics presente em SokobanGame permite ter-se acesso ao hardware gráfico. É possível que se tenha mais de uma GPU presente no sistema, e a GraphicsDeviceManager, pertencente ao namespace Microsoft.Xna.Framework provê meios de se obter acesso a elas. Neste caso se está considerando apenas uma placa gráfica, portanto o atributo GraphicsDevice, pertencente à graphics, representa esta única GPU.
Através do atributo graphics se poderá obter informações relavantes para a aplicação, tais como o tamanho da janela, se a janela ela se encontra em full screen, qual suporte da GPU em relação à shading, etc.
3.4.2 Acesso aos artefatos
A manipulação das imagens, modelos e efeitos (Texture2D, Model e Effect, respectivamente) se dá utilizando-se o atributo content, presente em SokobanGame.
Pode-se carregar este tipo de conteúdo através do seu método Load. Por exemplo, para carregar um modelo 3D, deve-se seguir o procedimento abaixo:
Model myModel = this.content.Load
No Solution Explorer, clicar com o botão direito do mouse sobre o nome do projeto. Um menu pop-up aparecerá, como mostrado na figura 5. Escolher a opção Add / New Folder.
Figura 5: Criando uma nova pasta.
A nova pasta foi criada. Deve-se dar um nome à ela. Para tanto, Escolher Content, como mostrado na figura 6.
Figura 6: Dando nome à pasta.
3.5.2 Adicionando elementos para a pasta no projeto
Um game é composto por diversos elementos, além do seu código: texturas, sprites, modelos 3D, etc. Antes de usar estes elementos na programação da lógica do jogo, deve-se inseri-los numa pasta que contará estes dados. Para realizar esta tarefa, deve-se seguir o procedimento abaixo:
Figura 7: Adicionando novos itens a pasta.
Figura 18: Adicionando a pasta de projeto um Item.
Figura 9: GameThumbnail.png no Solution Explorer.
compilada. Isso permite o uso de referências relativas ao arquivo. Colocar a opção “Copy If Newer”
Como foi apresentado na seção Importando artefatos no GSE, viu-se que é relativamente simples o processo de importar estes elementos. Agora será discutido como exibi-los numa aplicação. As duas seções a seguir mostram como carregar e exibir uma imagem 2D e um modelo 3D. Será visto que o modo de carregamento entre os dois é semelhante, porém o modo de desenhar é distintos para ambos.
4.1 Exibindo imagens 2D
Para exemplificar o processo de lidar com uma figura será usando um arquivo de imagem como mostrado na figura 12.
Figura 12: texturaCaixa.png
Considere-se que este arquivo já foi adicionada ao projeto e o nome que lhe foi atribuído é texturaCaixa, dentro de uma pasta chamada Content. Este processo adicionou um atributo ao SokobanGame,mas precisa ser criado um objeto que guardará uma referência para a imagem carregada, como pode ser visto na listagem abaixo
public class SokobanGame : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; ContentManager content;
//Novos atributos Texture2D imagem; SpriteBatch batch;
Além disso, colocou-se mais um atributo chamado batch, que serve para desenhar imagens 2D na tela. Para carregar a imagem e inicializar o modo de desenho na tela, será utilizado o método LoadGraphicsContent, da seguinte forma:
protected override void LoadGraphicsContent(bool loadAllContent) { if (loadAllContent) { batch = new SpriteBatch(graphics.GraphicsDevice); imagem = content.Load
protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here this.batch.Begin(); this.batch.Draw(this.imagem, Vector2.Zero, Color.White); this.batch.End(); }
Foram passados ao método Draw de batch um total de 3 parâmetros, a saber: a imagem a ser exibida, sua posição na tela e sua cor. No caso, Color.White significa que ela será desenhada em sua cor original. Pode-se desenhar quantas imagens se desejar, bem como adicionar várias linhas entre Begin e End para cada imagem em questão.
Matrix view = Matrix.Identity; Matrix projection = Matrix.Identity; Matrix world = Matrix.Identity;
A listagem acima mostra os atributos da classe SokobanGame, alguns já descritos, como graphics, content e sokoban além dos novos. A seguir a explicação sobre os 3 novos atributos: view, projection e cameraPosition. A matriz que foi chamada de view é responsável pela abstração da câmera no mundo 3D. Sua criação implica na definição da sua posição, direção do alvo e do up Vector, vetor que determina o eixo vertical da câmera. Já a matriz projection define o cone de visão da câmera (frustum). Os parâmetros passados são os seguintes: Near plane: distância entre a posição da câmera e a base menor do cone. Far plane: distância entre a câmera e a base maior do cone. Field of View: angulo de abertura do cone de visão Aspect Ratio: fator de escala Por último, deve-se definir a matriz que define as transformações que o modelo deve sofrer, como rotação, translação ou escala. Neste exemplo não será feita nenhuma alteração, pois será exibido com as configurações default. Por esta razão a matriz da listagem 7 recebe o valor de uma matriz identidade, ou seja, uma matriz que não influencia no cálculo das transformações. A figura 15 ilustra o conceito apresentado:
Figura 15: Cone de visão da camera (frustum).
Com isso já é possível carregar o modelo e definir valores às matrizes. A listagem a seguir mostra como definir isto no XNA.
protected override void LoadGraphicsContent(bool loadAllContent) { if (loadAllContent)
GraphicsDevice device = graphics.GraphicsDevice; sokoban = content.Load
float fieldOfView = MathHelper.ToRadians(45); float aspectRatio = device.Viewport.Width / device.Viewport.Height; float nearPlane = 1.0f; float farPlane = 10000.0f;
cameraPosition = new Vector3(300.0f, 300.0f, 300.0f);
projection = Matrix.CreatePerspectiveFieldOfView(fieldOfView, aspectRatio, nearPlane, farPlane); view = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up); }
Neste caso, o modelo é composto por várias partes (cabeça, braços, corpos, pés). O conceito de modelo presente no XNA é um pouco diferente do que se costuma ver nos softwares de modelagem 3D, como Maya ou 3DS Max. Aqui, o modelo é o arquivo todo, e os modelos dentro do arquivo são os chamados de meshes, sendo que cada um tem seu nome, sua cor, texturas, etc.
Uma vez carregado o modelo, deseja-se efetivamente plotá-lo na tela. A listagem abaixo mostra como isto é realizado.
protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
foreach (ModelMesh mesh in this.sokoban.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.EnableDefaultLighting(); effect.View = this.view; effect.Projection = this.projection; effect.World = this.world; }
mesh.Draw(); }
Figura 17: Primeira tela.
Figura 18: Segunda tela. Figura 19: Terceira tela.
A idéia geral deste esquema é que cada tela terá sua própria classe, descrevendo o seu comportamento. Além disso, será criada uma classe abstrata que conterá propriedades e métodos comuns a todas elas. Mais adiante será explicado como fazer para saber qual é a tela atual. A estrutura proposta permite que se possam inserir mais telas, de maneira limpa e sem afetar as já existentes.
A seguir será criada uma classe abstrata chamada Screen, que posteriormente será adicionada ao projeto. Para isto deve-se seguir os seguintes passos:
Figura 20: Adicionando novas classes
Figura 21: criando e nomeando uma nova classe
abstract public class Screen { private SpriteBatch batch = null; private Game game = null; public Game GameInstance { get { return game; } } public SpriteBatch SpriteBatch { get { return batch; } }