segunda-feira, 25 de julho de 2011

XNA 4.0 - Criar jogos para PC e XBOX360 - Parte 3++

Se pegarmos o código do último Tutorial e formos até a última linha do arquivo "Game1.cs" veremos que temos 194 linhas e tudo o que fizemos foi um simples sistemas de eixos, agora imagina se acrescentarmos câmeras, modelos 3D, Inteligência artificial, HUD, tela de opções e tudo o que tem a mais em um jogo... teriamos um inferno formado por linhas de código.

Então devemos melhorar nossa arumação. Vamos criar uma classe, a classe "terrain", essa classe vai cuidar tudo sobre o terreno e tudo o que for ligado a terreno estará dentro dessa classe. Encapsulamento. A partir de agora tudo o que fizermos terá sua classe especifica.

Clique com o botão direito na Solução "Tutorial1", -> "Add" -> "New Folder", dê o nome para essa paste de "GameBase", a seguir clique, de novo com o botão direito, sobre "GameBase" -> "Add" -> "New Folder" e coloque o nome "Shapes". Novamente só que agora sobre a pasta "Shapes" -> "Add" -> "New item". Selecione "Class" e dê o nome de "Terrain.cs".

Vai abrir o arquivo "Terrain.cs" e a seguir a primeira coisa a fazer é procurar a linha "class Terrain" e altera-la para

"public class Terrain : DrawableGameComponent"

Dizemos que nossa classe é publica e que ela "se desenha".

Vamos agora botar tudo o que é ligado ao terreno, volte ao arquivo "Game1.cs" e copie para o arquivo "Terrain.cs" as variáveis de renderização e depois apague-as do arquivo "Game1.cs": São elas VertexBuffer, IndexBuffer e BasicEffect.

O nosso arquivo "Terrain.cs" deve estar parecido com isso:

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

namespace Tutorial1.GameBase.Shapes
{
public class Terrain : DrawableGameComponent
{
//Variaveis de Renderização
VertexBuffer vertexBuffer;
IndexBuffer indexBuffer;
BasicEffect effect;
}

Volte ao arquivo "Terrain.cs" posicione o cursos depois do BasicEffect effect; aperte enter 2 vezes e crie um novo método como o a seguir:

public Terrain(Game game)
: base(game)
{

}

e depois outro método:

public void Load()
{

}

Vá ao arquivo "Game1.cs" no método LoadContent() e copie e depois apague tudo, menos a primeira linha. Então a linha do SpriteBatch fica onde esta.

Cole tudo no método Load() do arquivo "terrain.cs". Algumas linhas vão ficar sublinhadas em vermelho são elas:

effect = new BasicEffect(GraphicsDevice);
float aspectRatio = (float)GraphicsDevice.Viewport.Width / (float)GraphicsDevice.Viewport.Height;
vertexBuffer = new VertexBuffer(GraphicsDevice, decl, vertexCount, BufferUsage.WriteOnly);
indexBuffer = new IndexBuffer(GraphicsDevice, IndexElementSize.SixteenBits, 20 * sizeof(int), BufferUsage.WriteOnly);

Como mudamos elas de lugar a propriedade "GraphicsDevice" para de funcionar pois só é acessível da classe que devia de Game, então para corrigir devemos alterar para "Game.GraphicsDevide" todas as entradas, aperte ctrl + H, coloque em find what: "GraphicsDevice" e em replace with "Game.GraphicsDevide". Depois "Replace All".

agora vamos criar outro método digide "public overrride" aperte espaço e vai aparecer varias opções de métodos para serem criados, escolha o método Draw() e dê enter, o método será criado automaticamente. Volte a "Game1.cs" e copie tudo o que está no método Draw() deixando apenas a linha "GraphicsDevice.Clear()" apague o resto e cole tudo dentro do método Draw() do arquivo "Terrain.cs". Você deve fazer a mesma alteração que foi feita acima para que tudo fique "Game.GraphicsDevice".

Agora para finalizar vamos fazer as chamadas no "Game1.cs". Adicione a seguinte entrada no final das linhas "using"

using Tutorial1.GameBase.Shapes;

Vai indicar ao nosso jogo onde esta a classe Terrain.

Adicione a seguinte variável:

Terrain terrain

No método Initialize adicione

terrain = new Terrain(this);

Estamos criando uma nova instância da classe Terraim e passando como argumento "this" referindo-se ao nosso jogo. Agora no Metodo LoadContent adicione

terrain.Load();

Carregar os efeitos do terrain, o effect e tudo o que tiver dentro de Load(0

E para finalizar adicione no método Draw()

terrain.Draw(gameTime);

Pronto, seu programa agora está pronto mas só faz as mesmas coisas de antes, mas agora dá pra saber tudo o que é ligado ao terreno.

Aqui esta os arquivos do ultimo tutorial:
http://www.megaupload.com/?d=D4SW3B3K

Um comentário:

  1. no método update vc citou a variável effect que foi transferida para a classe Terrain.cs. Suas declarações foram junto e agora na classe Game.cs dá erro.

    ResponderExcluir