Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«
intcontpiada : 118
Guilherme Tell
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 





Por Dennes Torres
dennes@bufaloinfo.com.br
Dennes 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

Pesquisa personalizada
Pesquisar Dicas:







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 manipulação de recursos do DirectX para a criação de jogos e outros tipos de aplicações gráficas.

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



Envie seus comentários sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentários nesta página

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
Nome : kleberton E-Mail : kleberton_pinheiro10@hotmail.com
Bota um vídeo pra explicar melhor,tá se não tu não vai ser tão visitado assim essa é a dica bota um vídeo tá valeu!!!!
Nome : bloodred E-Mail : j.nikkosparkker@rocketmail.com
legal o tutorial mas o problema é q eu não entendi nada de nada e toda vez que uso
o programa pra criar um projeto eu não vejo nada o que está explícito aí no teu
tutorial.faz o seguinte, fazes outro tutorial e explique + detalhadamente passo a passo pois não dá para entender mexericas doq vc está falando.
Nome : Claudio Lins E-Mail : prof.claudio.lins@gmail.com
Hum...
Que tal formar um curso de criação de jogos na búfalo ?
Nome : Dennes E-Mail : dennes@bufaloinfo.com.br

A idéia do treinamento de criação de jogos é boa, mas no momento não posso me dedicar a isso, porém estou aberto a idéias deste tipo.

Abs,

Dennes
Nome : ruti E-Mail : rutinha_251@yahoo.com.br
eu quero criar ums jogos
Nome : ruti E-Mail : rutinha_251@yahoo.com.br
eu quero criar ums jogos
Nome : laine barbosa E-Mail : laineb03@gmail.com
como ser dona de um jogo do orkut quero o nome do meu jogo assim vila maravilhosa
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : Dennes Torres de Oliveira E-Mail : dennes@bufaloinfo.com.br
Teste
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : Judi E-Mail : support@genericpharmacydrug.com
qTtdYW https://www.genericpharmacydrug.com
Nome : Kevinhow E-Mail : ellensas1203@gmail.com