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
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.
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home