

| com exemplos em VB |
| Componente para deixar forms em Vb semelhantes às telas do winnamp |
| Componente para colocar sua aplicação VB no Systray |
| Componente para transformar sua aplicação VB em serviço |
| Ferramentas úteis para quem usa Olap Server |
| |

![]() |
||||||||
|
|
||||||||
Por Dennes
Torres dennes@bufaloinfo.com.brDennes Torres possui as certificações MCAD, MCSD,MCSE, MCDBA e MCT. Atualmente atua Como diretor da Búfalo Informática, líder do grupo de usuários DevASPNet no Rio de Janeiro e membro da liderança dos grupos getWindows e devSQL, também do Rio de Janeiro, podendo sempre ser encontrado na lista de discussão do grupo DevASPNet (devaspnet-subscribe@yahoogrupos.com.br) bem como nas reuniões do grupo. Mantém dois blogs em http://cidadaocarioca.blogspot.com |
|
|
|
|
| Criando um jogo com o XNA Game Studio Express | |
|
|
|
O XNA Framework roda em windows e é utilizado no XBOX 360, sendo que futuramente rodará também em plataformas móveis.
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 criação de jogos com o XNA Framework. É baseado no C# Express, depende da instalação do C# Express - precisa ser o express, não aceita outras versões do visual studio. De fato, o XNA Game Studio Express apenas adiciona templates para a criação de jogos.
A versão Express do Game Studio será gratuita mesmo depois de lançada a versão final, porém desenvolverá jogos apenas para Windows.
Já a versão professional do Game Studio será comercial e permitirá o desenvolvimento de jogos para o XBOX 360
Vamos ver, passo-a-passo, a criação 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 variáveis que serão necessárias para montar a tela do jogo
(o jogador, uma bola e um objeto spriteBatch, responsável pela montagem da tela)
Texture2D Jogador, Bola;
SpriteBatch sprite;
4) Inserir as 2 imagens no projeto
5) Criar um método para inicializar as imagens
Precisamos carregar as imagens para a memória. Isso é feito pelo método FromFile do objeto Texture2D. Também 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 método inicializar.
Precisamos disparar nosso método inicializar em 2 locais diferentes : Primeiramente no método OnStart de nossa classe, que ocorre no momento do inicio do jogo. Além disso precisaremos fazer a inicialização novamente sempre que ocorrer o evento DeviceReset do objeto GraphicsDevice.
Observe que a carga das imagens e criação do SpriteBatch estão ligados ao GraphicsDevice. Desta forma, quando ocorre o DeviceReset é necessário refazer a inicialização.
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 posição 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 posição e velocidade da bola. Nesse caso, porém, temos duas velocidades : A velocidade de movimentação horizontal e a velocidade de movimentação 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 variáveis para a bola e o jogador
Vamos declarar essas variáveis 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 também para reinicia-lo.
10) Agora iremos fazer o desenho da tela do jogo. Isso é feito dentro do método Draw, que já existe no arquivo Game.cs
No método 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 começarmos a reconhecer a movimentação do teclado do jogador. Para isso vamos criar um método, EntradaTeclado.
O objeto KeyBoard, do XNA Framework, nos permite obter o estado atual do teclado. Com o estado atual do teclado podemos utilizar o método GetPressedKeys para obter as teclas pressionadas. Realizamos então um laço pelas teclas que foram pressionadas e fazemos o correspondente processamento.
Veja como fica o código :
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 movimentação.
Nossa classe possui um método Update. Esse método é o responsável pela continuidade do jogo, por estar executando a atividade do jogo em pequenos intervalos. Neste método Update encontramos uma marca TODO: e neste ponto deveremos chamar o método 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 começarmos a controlar a movimentação da bola. Vamos criar um método chamado MoverBola para fazer a movimentação 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 nós multiplicamos a velocidade por -1. Isso irá inverter a direção. Desta forma as variáveis de velocidade na classe bola indicam não só a velocidade mas também a direção da bola.
Se a bola passar pelo limite inferior da tela, trata-se de uma perda e o jogo é reiniciado.
14) Vamos chamar o método MoverBola de dentro do método Update, no TODO
15) Criar um método, 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 fórmulas ao considerar o tamanho dos objetos na comparação. Caso o jogador tenha acertado, invertemos a direção da bola.
16) Vamos agora aumentar a velocidade da bola conforme o número de acertos. Vamos ajustar o método 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;
}
}
}
Conclusão
O jogo já está funcionando. Mas este método de construção utilizou desenvolvimento estruturado. O desenvolvimento estruturado não é muito recomendável, pois a lógica 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 codificação de cada objeto do jogo em um único ponto. No próximo artigo veremos um pouco mais sobre isso.
Veja alguns exemplos do que não está bom nesta codificação :
O controle das imagens e desenho das imagens no jogo não é feito pela própria classe do objeto.
A movimentação da bola e todos os cálculos envolvidos não estão dentro da classe bola
O controle de colisão não está em uma das classes de objeto.
Desta forma o código do jogo pode ser bem melhorado, é isso que fizemos no artigo que você encontra em http://www.devaspnet.com.br/colunas/coluna0130.aspx
Veja abaixo os comentários já enviados :
| Nome : Fabiano Baptista - Estacio | E-Mail : brbonus2000@yahoo.com.br |
| Dennes, parabens pela iniciativa de criar esses tutoriais, realmente é muito bom! Uma de minhas dúvidas era exatamente isso: Por onde eu começo? E esse artigo realmente acendeu uma luz. Estarei aguardando os próximos artigos. Abraços Fabiano |
|
| Nome : Shinji | E-Mail : shindesign@gmail.com |
| Legal o artigo Dennes, só uma observação. Use Vector2 ao invés de Point para aproveitar ao máximo os recursos oferecidos pelo xna framework e não esbarrar em nenhum futuro problema de compatibilidade entre windows e xbox 360. Grande abraço! |
|
| Nome : Gustavo | E-Mail : guto86@gmail.com |
| Gostei muito do artigo. Ainda nao tenho o XNA instalado na minha máquina, pois não consegui baixa-lo no site. Poderia me enviar o setup? |
|
| Nome : DEYVISON | E-Mail : dededuere@hotmail.com.br |
| E QUE POR FAVOR EU QERO MESMO É FAZER MEUS PRÓPRIOS JOGO POR FAVOR VAI | |
| Nome : Leandro | E-Mail : lms_tr.live.com.pt |
| Muito bom ajudam mesmo!!! espero que continuem a fazer mais. mas em jogos 3d :) |
|
| Nome : Gorska | E-Mail : gorska1@hotmail.com |
| Muito Obrigado Dennis, este tutorial ajudou muito a começar a inteder o XNA, ja assisti a uma palestra sua na São Judaz sobre .NET e foi muito boa, só espero ver mais abordagens sua sobre o XNA que é um programa para jogos excelente da microsoft, e o tutorial esta show. continue assim! |
|
| Nome : Midori fukami | E-Mail : midori.fukami@hotmail.com |
| mto bom! gostei ^^ vlw pela ajuda ^^ |
|
| Nome : Michele 12 anos | E-Mail : mimichereta@hotmail.com |
| Ameei *O* adorei esse tuto e agora tenho meu próprio jogo, eu amei muito e qndo mostrei pra minhas amigas elas adoraram o jogo que eu fiz, e ainda qndo elas foram pra casa dei esse site pra elas aprenderem, MUITO SUSESSO NA TUA VIDA ;D beijiinhos |
|
| Nome : shady | E-Mail : shady_coringa15@yahoo.com.br |
| olá parabens pelo tuturial mais eu quero fazer jogo de orkut,aquele jogo:colheita feliz no xna tem como criar esse jogo nele?quem souber mande mensagem pra meu email.vlw | |
| Nome : katiane | E-Mail : katiane@hotmail.com |
| eu quero fazer o jogo da isa tkm por favor lula tea | |