lunes, 14 de septiembre de 2009

Diseña tus propios videojuegos para Windows, Zune y XBOX 360 con Microsoft XNA (Parte IV)

Buenas a todos, tras tres post explicando la programación de videojuegos con XNA ya debéis tener una idea más o menos clara del contenido necesario para programar videojuegos en 2D. Hoy vamos a complementarla con un pequeño truco en el que enseñaremos a simular el movimiento que realizaría nuestro alienígena andando. Para ello, tenemos que conseguir sprites del alienígena en diferentes posturas en las que salga andando. En mi caso, como os comenté el otro día, el muñeco lo he dibujado con el 3D Studio y me limité a tomar capturas del mismo, pues bien, hoy he colocado el personaje en diferentes posturas y he tomado las siguientes capturas mirando hacia ambos lados:

 

image image image image image image

 

Cómo es evidente, el mayor realismo a la hora de andar lo conseguiremos con sprites en posturas realistas, los mías no son los mejores, pero para enseñaros el ejemplo nos valdrán.

En primer lugar, cargaremos los sprites en la carpeta “Content” y los agregaremos al proyecto, como aprendimos en el pasado post.

Después deberemos agregar una variable textura nueva por cada nuevo sprite que vayamos a añadir, en mi caso, las seis variables siguientes:

 

Texture2D textura_alien_der_parado;

Texture2D textura_alien_der_andando;

Texture2D textura_alien_der_andando2;

Texture2D textura_alien_izq_parado;

Texture2D textura_alien_izq_andando;

Texture2D textura_alien_izq_andando2;

 

Y en la función Loadcontent() enlazaremos a las variables sus respectivas imágenes:

 

textura_alien_der_parado = Content.Load<Texture2D>("alien-der-parado");

textura_alien_der_andando = Content.Load<Texture2D>("alien-der-andando");

textura_alien_der_andando2 = Content.Load<Texture2D>("alien-der-andando2");

textura_alien_izq_parado = Content.Load<Texture2D>("alien-izq-parado");

textura_alien_izq_andando = Content.Load<Texture2D>("alien-izq-andando");

textura_alien_izq_andando2 = Content.Load<Texture2D>("alien-izq-andando2");

 

Bien, una vez cargados los sprites, nos queda la tarea de simular el movimiento, para ello mostraremos los sprites en cadena, enlazándolos a las pulsaciones de las teclas, es decir, en principio el alienígena comienza parado, si pulsamos una vez la tecla derecha, avanza 5pixels a la derecha y mostramos el sprite del alienígena levantando un poco una pierna, si volvemos a pulsar la tecla derecha avanzaremos otros 5pixels y mostraremos el sprite del alienígena levantando mas la pierna. Para ello hay infinitas maneras, yo os voy a proponer la siguiente que es bastante sencilla:

En primer lugar crearemos las siguientes variables, que nos permitirán almacenar la dirección del movimiento del teclado, y el número de sprite a mostrar (parado, andando1 o andando2):

 

const int izq = 1;

const int der = 2;

int direccion_movimiento=2, num_movimiento=0;

 

Después modificaremos el contenido de la función Update() por el siguiente:

 

estadoteclado = Keyboard.GetState();

Keys[] teclaspulsada = estadoteclado.GetPressedKeys();

foreach (Keys ekey in teclaspulsada)

{

if (ekey == Keys.Left)

{

alien.X -= 5;

direccion_movimiento = izq;

num_movimiento += 1;

if (num_movimiento == 3) num_movimiento = 0;

}

if (ekey == Keys.Right)

{

alien.X += 5;

direccion_movimiento = der;

num_movimiento += 1;

if (num_movimiento == 3) num_movimiento = 0;

}

}

 

Como veis, el único cambio que hemos realizado es que cuando identificamos que se ha pulsado la tecla del cursor derecho o izquierdo almacenamos el movimiento, y aumentamos la variable num_movimiento, que definirá el nº del sprite a mostrar.

Finalmente modificaremos la línea de código de la función Draw() que pintaba al alienígena en la pantalla por el siguiente código, en el que dependiendo de la dirección del movimiento y del número de movimiento pintará un sprite u otro:

 

switch (direccion_movimiento)

{

case izq:

switch (num_movimiento)

{

case 0:

spriteBatch.Draw(textura_alien_izq_parado, alien, Color.White);

break;

case 1:

spriteBatch.Draw(textura_alien_izq_andando, alien, Color.White);

break;

case 2:

spriteBatch.Draw(textura_alien_izq_andando2, alien, Color.White);

break;

}

break;

case der:

switch (num_movimiento)

{

case 0:

spriteBatch.Draw(textura_alien_der_parado, alien, Color.White);

break;

case 1:

spriteBatch.Draw(textura_alien_der_andando, alien, Color.White);

break;

case 2:

spriteBatch.Draw(textura_alien_der_andando2, alien, Color.White);

break;

}

break;

}

 

Si compilamos y ejecutamos deberíamos ver un movimiento como el siguiente:

 

 

 

En mi caso no ha quedado perfecto ya que los sprites no eran los mejores, para que salga el efecto más realista os recomiendo bajaros los sprites hechos de internet, como hice con el juego que os mostré en el primer post y que programé para rememorar un antiguo Sonic.

El próximo día avanzaremos un poco con las clases de XNA y estudiaremos como reproducir colisiones entre dos objetos del juego, en el ejemplo del videojuego alien, vamos a hacer que se encuentre con una piedra que le frene el paso, y tenga que saltarla para seguir adelante.

Así que hasta el próximo post os dejo tiempo para que practiquéis y probéis varios sprites hasta que os queden movimientos más realistas, lo más importante es la imaginación!

Saludos!!

No hay comentarios: