A Microsoft est desenvolvendo, ainda em fase beta, o XNA Framework e o
XNA Game Studio Express. O XNA Framework um framework de classes para manipulao de recursos do DirectX para a criao de jogos e outros tipos de aplicaes grficas. O XNA Framework roda em windows e utilizado no XBOX 360, sendo que futuramente rodar tambm em plataformas mveis. O XNA Framework substitui o Managed DirectX e suas classes utilizam diretamente o DirectX Runtime. Veja os namespaces do XNA pelo object browser :
O XNA Game Studio Express, por sua vez, a ferramenta utilizada para a criao de jogos com o XNA Framework. baseado no C# Express, depende da instalao do C# Express - precisa ser o express, no aceita outras verses do visual studio. De fato, o XNA Game Studio Express apenas adiciona templates para a criao de jogos. A verso Express do Game Studio ser gratuita mesmo depois de lanada a verso final, porm desenvolver jogos apenas para Windows. J a verso professional do Game Studio ser comercial e permitir o desenvolvimento de jogos para o XBOX 360 Vamos ver, passo-a-passo, a criao de um jogo bem simples para vermos o funcionamento do XNA Game Studio Express. Veja a imagem do jogo que iremos gerar :
1) Criar o novo projeto de nosso jogo
2) Alterar as propriedades do objeto Graphics para definir o tamanho da tela 3) Definir as variveis que sero necessrias para montar a tela do jogo (o jogador, uma bola e um objeto spriteBatch, responsvel pela montagem da tela) Texture2D Jogador, Bola; SpriteBatch sprite; 4) Inserir as 2 imagens no projeto 5) Criar um mtodo para inicializar as imagens Precisamos carregar as imagens para a memria. Isso feito pelo mtodo FromFile do objeto Texture2D. Tambm precisaremos inicializar o SpriteBatch. Em todos esses casos precisaremos fornecer um GraphicsDevice. O objeto Graphics que j existe na classe Game1.cs nos fornece o GraphicsDevice, facilitando as coisas. void Inicializar() { Jogador = Texture2D.FromFile(graphics.GraphicsDevice, "../../paddle.png"); Bola = Texture2D.FromFile(graphics.GraphicsDevice, "../../ball.png"); sprite = new SpriteBatch(graphics.GraphicsDevice); } 6) Disparar o mtodo inicializar. Precisamos disparar nosso mtodo inicializar em 2 locais diferentes : Primeiramente no mtodo OnStart de nossa classe, que ocorre no momento do inicio do jogo. Alm disso precisaremos fazer a inicializao novamente sempre que ocorrer o evento DeviceReset do objeto GraphicsDevice. Observe que a carga das imagens e criao do SpriteBatch esto ligados ao GraphicsDevice. Desta forma, quando ocorre o DeviceReset necessrio refazer a inicializao. protected override void OnStarting() { base.OnStarting(); graphics.GraphicsDevice.DeviceReset += GraphicsDevice_DeviceReset; Inicializar(); }
void GraphicsDevice_DeviceReset(object sender, EventArgs e) { Inicializar(); } 7) Criar a classe representando o jogador
Essa classe ir controlar a posio do jogador e a velocidade do jogador no jogo (velocidade sendo contada em pixels. using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework;
namespace Bolinha { class Jogador { Point posicao; int velocidade;
public Jogador(int x, int y) { posicao = new Point(x, y); velocidade = 3; } } } 8) Criar a classe representando a bola Assim como a classe do jogador, a classe representando a bola guarda a posio e velocidade da bola. Nesse caso, porm, temos duas velocidades : A velocidade de movimentao horizontal e a velocidade de movimentao vertical. using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework;
namespace Bolinha { class Bola { public Point posicao; public int velocidadeH; public int velocidadeV;
public Bola(int x, int y) { posicao = new Point(x, y); velocidadeH = 3; velocidadeV = 3; } } } 9) Declarar variveis para a bola e o jogador Vamos declarar essas variveis em nossa classe do jogo. O disparo ser feito no constructor, veja : void IniciarClasses() { if (objJogador==null) { objJogador=new Jogador(400,550); objBola=new Bola(200,50); } else { objJogador.posicao =new Point(400,550); objBola.posicao = new Point(200,50); } }
public Game1() { InitializeComponent(); IniciarClasses(); } Observe como o IniciarClasses testam para verificar se o objeto null. Desta forma pode ser utilizado no inicio do jogo mas tambm para reinicia-lo. 10) Agora iremos fazer o desenho da tela do jogo. Isso feito dentro do mtodo Draw, que j existe no arquivo Game.cs No mtodo Draw existe uma marca TODO: que exatamente onde deveremos codificar a montagem na tela. Utilizamos o sprite para fazer a montagem da tela, realizamos um Begin, desenhamos os objetos e fazemos um End. // TODO: Add your drawing code here sprite.Begin( SpriteBlendMode.AlphaBlend ); sprite.Draw(imgJogador,new Rectangle(objJogador.posicao.X,objJogador.posicao.Y, imgJogador.Width,imgJogador.Height),Color.White);
sprite.End(); 11) J hora de comearmos a reconhecer a movimentao do teclado do jogador. Para isso vamos criar um mtodo, EntradaTeclado. O objeto KeyBoard, do XNA Framework, nos permite obter o estado atual do teclado. Com o estado atual do teclado podemos utilizar o mtodo GetPressedKeys para obter as teclas pressionadas. Realizamos ento um lao pelas teclas que foram pressionadas e fazemos o correspondente processamento. Veja como fica o cdigo : void EntradaTeclado() {
foreach (Keys key in currentKeys) { if (key == Keys.Left) objJogador.posicao.X -=objJogador.velocidade;
if (key == Keys.Right) objJogador.posicao.X +=objJogador.velocidade;
if (key == Keys.Escape) this.Exit(); }
} 12) Chamar o teste de movimentao. Nossa classe possui um mtodo Update. Esse mtodo o responsvel pela continuidade do jogo, por estar executando a atividade do jogo em pequenos intervalos. Neste mtodo Update encontramos uma marca TODO: e neste ponto deveremos chamar o mtodo EntradaTeclado. if (objJogador.posicao.X<5) objJogador.posicao.X=5;
if (objJogador.posicao.X>(800 - (imgJogador.Width +5))) objJogador.posicao.X=(800 - (imgJogador.Width +5)); 13) hora de comearmos a controlar a movimentao da bola. Vamos criar um mtodo chamado MoverBola para fazer a movimentao da bola e checar se a bola encontra-se dentro dos limites da janela. void MoverBola() { objBola.posicao.X+=objBola.velocidadeH; objBola.posicao.Y+=objBola.velocidadeV;
if ((objBola.posicao.X<=0)||(objBola.posicao.X>=(800 - imgBola.Width))) objBola.velocidadeH *=-1;
if ((objBola.posicao.Y<=0)) objBola.velocidadeV *=-1;
if (objBola.posicao.Y>=(600-imgBola.Height)) IniciarClasses(); } Observe que se a bola estiver passando dos limites ns multiplicamos a velocidade por -1. Isso ir inverter a direo. Desta forma as variveis de velocidade na classe bola indicam no s a velocidade mas tambm a direo da bola. Se a bola passar pelo limite inferior da tela, trata-se de uma perda e o jogo reiniciado. 14) Vamos chamar o mtodo MoverBola de dentro do mtodo Update, no TODO 15) Criar um mtodo, AcertouBola, para identificar quando o jogador consegue acertar a bola. void AcertouBola() { if (objBola.posicao.Y>= (objJogador.posicao.Y - imgBola.Height))
if ((objBola.posicao.X>=(objJogador.posicao.X - imgBola.Width))&&(objBola.posicao.X<=objJogador.posicao.X + imgJogador.Width))
{ objBola.velocidadeV *=-1; } } Observe o cuidado das frmulas ao considerar o tamanho dos objetos na comparao. Caso o jogador tenha acertado, invertemos a direo da bola. 16) Vamos agora aumentar a velocidade da bola conforme o nmero de acertos. Vamos ajustar o mtodo AcertouBola para isso : void AcertouBola() { if (objBola.posicao.Y>= (objJogador.posicao.Y - imgBola.Height))
if ((objBola.posicao.X>=(objJogador.posicao.X - imgBola.Width))&&(objBola.posicao.X<=objJogador.posicao.X + imgJogador.Width))
{ objBola.velocidadeV *=-1; Acertos +=1; if (Acertos==6) { if (objBola.velocidadeH>0) objBola.velocidadeH +=1; else objBola.velocidadeH -=1;
if (objBola.velocidadeV>0) objBola.velocidadeV +=1; else objBola.velocidadeV -=1;
Acertos=0; } } }
Concluso O jogo j est funcionando. Mas este mtodo de construo utilizou desenvolvimento estruturado. O desenvolvimento estruturado no muito recomendvel, pois a lgica de cada objeto do jogo fica espalhada em diversos locais do jogo. O ideal que o jogo seja desenvolvido de forma orientada a objetos, centralizando a codificao de cada objeto do jogo em um nico ponto. No prximo artigo veremos um pouco mais sobre isso. Veja alguns exemplos do que no est bom nesta codificao : O controle das imagens e desenho das imagens no jogo no feito pela prpria classe do objeto. A movimentao da bola e todos os clculos envolvidos no esto dentro da classe bola O controle de coliso no est em uma das classes de objeto. Desta forma o cdigo do jogo pode ser bem melhorado, isso que fizemos no artigo que voc encontra em http://www.devaspnet.com.br/colunas/coluna0130.aspx