A jornada, não tão jornada, mas, ainda uma jornada.. você entendeu ;-)

Este espaço é destinado a diversos temas, relacionados a minhas atividades ou mesmo ao cotidiano.

Monday, October 22, 2007

Tutorial de XNA – Parte II

Tutorial de XNA – Parte II
Por José Ferreira da Silva Junior

Para o melhor entendimento deste material é necessário que o leitor tenha conhecimentos prévios de C# e de orientação a objetos e que tenha lido a primeira parte do tutorial.

Dando seqüência ao meu pequeno tutorial, vamos revisar os conceitos estudados no primeiro texto para em seguida aprender algo novo. Na “aula” anterior, descobrimos o XNA, vimos o que é, qual a sua idéia e como é a estrutura básica de um jogo. Baseado nisso, criamos a nossa primeira janela do jogo e desenhamos uma imagem na tela.

Agora, vamos ver como movimentar a imagem, testando o recebimento de teclas e encerrando o jogo caso o ESC seja pressionado.

Revisando a estrutura básica do jogo:
- Primeiro carregamos os elementos necessários ao jogo (método ContentLoadGraphics)
- Atualizamos os dados dos objetos do jogo (método Update)
- Desenhamos as imagens na tela (método Draw)

Mas, de nada adianta desenhar a imagem no mesmo lugar, ou seja, ficar sem movimentação.

A nossa nova lógica vai ser bem simples, na rotina de atualização (Update) nós verificamos o status do teclado (teclas pressionadas) e tomamos alguma atitude de acordo com o nosso novo status.

Para guardar o status do teclado, nós vamos usar a classe KeyboardState, ela vai nos informar as teclas que foram pressionadas pelo usuário. Para obter as teclas usaremos o método GetState da classe Keyboard, para tanto, usamos a seguinte sintaxe:

KeyboardState teclado = Keyboard.GetState();

Aqui nós guardamos o status do teclado, falta apenas testar se alguma das teclas pressionadas corresponde a um de nossos comandos, para tanto, usaremos o método “IsKeyDown” da classe KeyboardState.

A enumeração “Keys” nos fornece a listagem das teclas para que você possa testar o status de cada uma delas (caso seja necessário). Nesse caso testaremos a tecla “Right” (seta para a direita).

teclado.IsKeyDown(Keys.Right)

O resultado desse comando é do tipo “booleano” (true ou false) e informa se a tecla foi pressionada ou não. Para utilizar essas classes, precisamos incluir o namespace Microsoft.Xna.Framework.Input.

Com esses recursos já podemos movimentar o sprite na tela, testando qual foi a tecla pressionada e incrementado as posições X e Y do vetor “Posicao”. Repare na rotina de desenho do nosso sprite:

sprite.Draw(textura, posicao, Color.White);

“Posicao” é um objeto do tipo vector2 e possui dois atributos “x” e “y” do tipo float, que serão usados para representar as posições do nosso sprite na tela, o que faremos aqui é, a cada pressionamento das teclas direcionais, modificaremos os valores dessas coordenadas.

Devemos lembrar que as coordenadas da tela iniciam com a posição “zero” (ponto (0,0)) no canto superior esquerdo da tela, ao contrário do que estamos acostumados quando estudamos o plano cartesiano, então nossa tela tem as coordenadas assim:


Então, se incrementamos os valores de Y, na verdade, estamos fazendo com o que o Sprite se movimente para baixo, os limites para desenhar o sprite, são as resoluções, ou seja, para os valores de X temos o tamanho horizontal da tela e para Y o tamanho vertical.

Então o que fazemos é, na rotina Update, testamos as teclas pressionadas e atualizamos os valores de X e Y do vetor posição, quando a rotina Draw for chamada, o sprite será desenhado no local correto, com as posições atualizadas.

Por exemplo, para testar se o direcional para cima foi pressionado e movimentar o sprite para cima nós faríamos:

if (teclado.IsKeyDown(Keys.Up))
{
posicao.Y--;
}

Podemos fazer o mesmo com as outras teclas que desejamos testar, assim, chegamos ao nosso novo código:

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

//executando o jogo
namespace meu_jogo
{
class novo_jogo
{
static public void Main() //método principal da aplicação
{
jogo teste = new jogo();
teste.Run();
}

}
}

//o código da classe jogo, herdado da classe pai "Game"

class jogo : Game
{
//permite a configuração do ambiente
GraphicsDeviceManager config_am;
ContentManager recursos;

//texturas
Texture2D textura;
//sprite
SpriteBatch sprite;
//struct para posição
Vector2 posicao = Vector2.Zero;

//construtor da classe
public jogo()
{
config_am = new GraphicsDeviceManager(this);
recursos = new ContentManager(Services);

}

//método para carregar a textura.
protected override void LoadGraphicsContent(bool loadAllContent)
{
if (loadAllContent)
{
textura = recursos.Load(@"imagens\bola");
sprite = new SpriteBatch(config_am.GraphicsDevice);

}
}

protected override void Update(GameTime gameTime)
{
//um objeto para guardar o status do teclado
KeyboardState teclado = Keyboard.GetState();


//testando a qual tecla foi pressionada e
//incrementando a coordenada correta
if (teclado.IsKeyDown(Keys.Right))
{
posicao.X++; //mover para a direita
}
else if (teclado.IsKeyDown(Keys.Left))
{
posicao.X--; //mover para a esquerda
}
else if (teclado.IsKeyDown(Keys.Down))
{
posicao.Y++; //mover para baixo
}
else if (teclado.IsKeyDown(Keys.Up))
{
posicao.Y--; //mover para cima
}
else if (teclado.IsKeyDown(Keys.Escape))
{
this.Exit(); //sair da aplicação
}


}

protected override void Draw(GameTime gameTime)
{
config_am.GraphicsDevice.Clear(Color.Black);

sprite.Begin();
sprite.Draw(textura, posicao, Color.White);
sprite.End();

}
}


Por hoje é só, aprendemos como mover o sprite na tela e como verificar o pressionamento de teclas, espero que este texto seja útil a vocês.

Até a próxima.

Labels: , ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home