Sunteți pe pagina 1din 9

Criando Jogos com o XNA Game Studio

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.Draw(imgBola,new
Rectangle(objBola.posicao.X,objBola.posicao.Y,
imgBola.Width,imgBola.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()
{

currentState = Keyboard.GetState();
Keys[] currentKeys = currentState.GetPressedKeys();

//check for up and down arrow keys

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