martes, 26 de julio de 2011

XNA – Movimiento


En el anterior tutorial vimos como cargar una imagen y mostrarla en pantalla, ahora para hacer que nuestra imagen tenga movimiento debemos enfocarnos en una parte de nuestro codigo.


spriteBatch.Begin();
spriteBatch.Draw(imagen, new Rectangle(0, 0, imagen.Width, imagen.Height), Color.White);
spriteBatch.End();

Todo objeto que este en nuestro juego, tiene un espacio en el mundo, ya sea 2D(X,Y) o 3D(X,Y,Z), en nuestra imagen se representa en los 0 dentro del Rectangle(X e Y).
Para hacer que esta imagen tenga movimiento debemos modificar esos dos valores.
Para empezar crearemos las siguiente variables.
int x;
int y;

Con esas dos variables nosotros manejaremos la posición de nuestra imagen.
Nuestra imagen debe moverse al momento de que yo apreto un boton, para nuestro ejemplo, las flechas. La clase que captura cuando nosotros apretamos o no un boton de nuestro teclado es KeyboardState.

La variable creada desde la clase KeyboardState, debe estar siendo constantemente actualizada, eso quiere decir que lo debemos poner en el metodo Update de nuestro juego.
protected override void Update(GameTime gameTime)
{
KeyboardState key = Keyboard.GetState();
base.Update(gameTime);
}1
KeyboardState tiene 2 propiedades que son las que mas vamos a usar.
IsKeyUp(Keys keys): Detecta si la tecla ingresada como parametro NO esta apredata. IsKeyDown(Keys keys): Detecta si la tecla ingresada como parametro esta siendo apretada.
Entonces, nosotros queremos que cuando aprete alguna de las flechas del teclado que nuestra imagen se mueva. Creamos dos variables que serán las posiciones X e Y, y con la variable key detectaremos si alguna de las flechas del teclado esta siendo apretada. Todo eso se convertiría en esto. 1protected override void Update(GameTime gameTime) { KeyboardState key = Keyboard.GetState(); if (key.IsKeyDown(Keys.Right) == true) x += 3; if (key.IsKeyDown(Keys.Left) == true) x -= 3; if (key.IsKeyDown(Keys.Down) == true) y += 3; if (key.IsKeyDown(Keys.Up) == true) y -= 3; base.Update(gameTime); }

Con un IF, detectamos si las teclas estas siendo apretadas, si es asi, aumentaremos en 3 la variables que creamos.
Nota: En XNA, el eje Y esta invertido, eso quiere decir que cuando bajamos, nuestra Y debe aumentar, por esa razon en el tercer IF, nosotros sumamos Y cuando la flecha de abajo esta siendo apretada

Solo nos queda algo por cambiar.
spriteBatch.Begin();
spriteBatch.Draw(imagen, new Rectangle(x, y, imagen.Width, imagen.Height), Color.White);
spriteBatch.End();

Los ceros que se pasaban como parámetro en el rectangle los cambiamos por las variables X e Y.

Acá termina el tutorial de movimiento, para el próximo tutorial veremos rotaciones y algunas cosillas mas.
Codigo completo
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
 
namespace MiJuego_Tutorial_3
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D imagen;
 
int x;
int y;
 
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
 
protected override void Initialize()
{
x = 0;
y = 0;
base.Initialize();
}
 
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
imagen = Content.Load<Texture2D>("caja");
}
 
protected override void UnloadContent(){
}
 
protected override void Update(GameTime gameTime)
{
KeyboardState key = Keyboard.GetState();
if (key.IsKeyDown(Keys.Right) == true) x += 3;
if (key.IsKeyDown(Keys.Left) == true)x -= 3;
if (key.IsKeyDown(Keys.Down) == true)y += 3;
if (key.IsKeyDown(Keys.Up) == true)y -= 3;
base.Update(gameTime);
}
 
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
 
spriteBatch.Begin();
spriteBatch.Draw(imagen, new Rectangle(x, y, imagen.Width, imagen.Height), Color.White);
spriteBatch.End();
 
base.Draw(gameTime);
}
}
}