Inicio > Mis cosas, XNA > Tutorial [Entrega 3]: Añadiendo disparos

Tutorial [Entrega 3]: Añadiendo disparos

Continuamos con las entregas del tutorial para hacer un clon del Space Invaders en XNA.

Ahora que ya tenemos una nave protagonista moviéndose por la pantalla, le realizaremos algunas mejoras a la nave y haremos que pueda dispara.

Podrás leer el tutorial completo después del salto. Y recuerda que si tienes alguna duda con el tutorial, puedes preguntármela en el foro: http://www.foro.xna-tutorial.com/viewtopic.php?f=4&t=4

Clase Nave

Para empezar, vamos a encapsular nuestra nave en una clase llamada “Nave”. Esto lo deberíamos haber hecho desde el principio, pero como quería mostraros lo fácil que era cargar sprites en XNA y moverlos por la pantalla, me lo pase por alto.

Para crear la clase “Nave”, clicamos con el botón derecho sobre el proyecto y de damos a “Agregar/Clase”.

image

 

Como nombre escribimos “Nave.cs” y le damos a “Agregar”. Vale, ya tenemos nuestra clase. Ahora vamos a completarla.

Atributos

De momento, vamos a crear dos atributos:

private Vector2 pos; //posicion de la nave
private Texture2D textura; //textura de la nave

 

Y sus respectivas propiedades:

public Vector2 Posicion
{
   get { return pos; }
   set { pos = value; }
}

public Texture2D Textura
{
   get { return textura; }
   set { textura = value; }
}

Métodos

Necesitamos el constructor de la clase, donde le daremos una posición inicial a la nave, un método para actualiza la posición de la nave, y otro ultimo para pintar la nave en la pantalla.

CONSTRUCTOR

public Nave()
{
   pos = new Vector2(400,550); //nave centrada en la pantalla, parte inferior
}

METODO ACTUALIZA

Ahora, además de mover la nave, vamos a comprobar que no se salga de la pantalla. Si esto ocurre, no le vamos a dejar moverse.

public void actualiza()
{
   if (Keyboard.GetState().IsKeyDown(Keys.Left))
   {
      if (pos.X > 0) //no se sale por la izquierda
      pos.X -= 5;
   }
   if (Keyboard.GetState().IsKeyDown(Keys.Right))
   {
      if (pos.X + textura.Width < 800) //no se sale por la derecha
      pos.X += 5;
   }
}

METODO DRAW

public void Draw(SpriteBatch batch)
{

//Pintamos la nave
batch.Draw(textura, pos, Color.White);

}

 

Ya tenemos nuestra clase nave. Vamos ahora con la siguiente.

Clase Disparo

Ahora vamos a crear la clase disparo. Realmente no haría falta, ya que podríamos asignar al personaje una nueva textura y una variable posición y lo tendríamos solucionado. Sin embargo, pensando a largo plazo, creo que nos va a venir bien una clase disparo para poder meterle animaciones, distintos tipos de disparos, etc…

Atributos

De momento, vamos a crear cuatro atributos:

private Vector2 pos; //posición del disparo
private Texture2D textura; //textura del disparo
private bool vivo; //indica si el disparo aun esta en el juego

 

 

Y sus respectivas propiedades:

public Vector2 Posicion
{
   get { return pos; }
   set { pos = value; }
}
public Texture2D Textura
{
   get { return textura; }
   set { textura = value; }
}
 
public bool Vivo
{
   get { return vivo; }
   set { vivo = value; }
}

Métodos

Al igual que antes, vamos a programar un constructor de la clase y un método al que llamaremos para actualizar su posición en la pantalla.

Para el constrictor, necesitaremos una posición inicial y un sprite. Lo posición inicial:

public Disparo(Vector2 posicionInicial, Texture2D sprite)
{
   pos = posicionInicial;
   textura = sprite;
   vivo = true;
}

 

 

El método actualiza lo usaremos para comprobar que el disparo sale de la pantalla o no. Si sale de la pantalla, pondremos su variable “vivo” a false. Si sigue vivo, entonces lo movemos.

public void actualiza()
{
   if (pos.Y + textura.Height < 0) vivo = false;
   if (pos.Y > 600) vivo = false;

   if (vivo)
   pos.Y -= 10;
}

Cambios en la clase nave

Ahora que ya tenemos una clase disparo, vamos a hacer que nuestra nave pueda disparar. Solo le vamos a permitir un disparo (al igual que en el juego original), y hasta que ese disparo no impacte con un enemigo, o se salga de la pantalla, no vamos a poder volver a disparar.

Para hacer esto, tenemos que realizar las siguientes modificaciones en la clase “Nave.cs

public void actualiza()
{
   if (Keyboard.GetState().IsKeyDown(Keys.Left))
   {
      if (pos.X > 0)
          pos.X -= 5;
   }
   if (Keyboard.GetState().IsKeyDown(Keys.Right))
   {
      if (pos.X + textura.Width < 800)
         pos.X += 5;
   }

   //Añadimos el disparo
   if (Keyboard.GetState().IsKeyDown(Keys.Up))
   {
      if (disp == null)
         disp = new Disparo(new Vector2(pos.X + textura.Width/2, pos.Y), texturaDisparo);       //la    posicion del disparo es la mitad de nuestra nave
   }

   //Si el disparo esta vivo, lo movemos. Si no, lo ponemos a null
   //para poder volver a disparar
   if (disp != null)
   {
      if (disp.Vivo)
         disp.actualiza();
      else
         disp = null;
   }
}

public void Draw(SpriteBatch batch)
{
   batch.Draw(textura, pos, Color.White);

   //Pintamos el disparo
   if (disp != null)
   {
   batch.Draw(disp.Textura, disp.Posicion, Color.White);
   }
}

Clase Game1.cs

Y ya tenemos nuestra clase “Disparo”. Ahora nos falta agregar la lógica necesaria en “Game1.cs”.

 

Lo que haremos en “Game1.cs” será definirnos y crearnos la nave:

Nave nave;

 

Cargar las texturas necesarias para la nave y el disparo de la nave:

protected override void LoadContent()
{
      // Create a new SpriteBatch, which can be used to draw textures.
      spriteBatch = new SpriteBatch(GraphicsDevice); //Le decimos a la nave que textura       tiene que cargar
      nave.Textura = Content.Load<Texture2D>("nave");
      nave.TexturaDisparo = Content.Load<Texture2D>("disparoNave");

      // TODO: use this.Content to load your game content here
}

 

Llamar al método actualizar de nuestra nave en cada bucle del juego:

protected override void Update(GameTime gameTime)
{
// Allows the game to exit
      if (Keyboard.GetState().IsKeyDown(Keys.Escape))
         this.Exit(); // TODO: Add your update logic here

      nave.actualiza();

      base.Update(gameTime);
}

 

Y por ultimo pintar la nave. pero ahora como nuestra clase nave tiene un método para pintarse, simplemente llamaremos a ese método pasándole como argumento nuestro Spritebacht.

 

protected override void Draw(GameTime gameTime)
{
      GraphicsDevice.Clear(Color.Black); //Pintamos el fondo de negro // TODO: Add your       drawing code here
      spriteBatch.Begin();
      nave.Draw(spriteBatch);
      spriteBatch.End();

      base.Draw(gameTime);
}

 

Y voilá!! Tenemos nuestra nave moviéndose por la pantalla, pero sin salirse de ella, y disparando con la tecla “Arriba”. Al igual que el Space Invaders, solo podemos tener un disparo en la pantalla.

 

spinvaders

Como podéis observar, le he cambiado el color de fondo para que en lugar de azul sea negro. Además, he pintado la nave de blanco para que se vea mejor. Así conseguimos un estilo más “retro”.

 

Y como siempre, aquí tenéis el código fuente para poder probarlo vosotros mismos.

image Descargar Código Fuente

 

 

Si tienes alguna duda con el tutorial, puedes preguntármela en el foro: http://www.foro.xna-tutorial.com/viewtopic.php?f=4&t=4

Un saludo y hasta la próxima entrega, donde añadiremos a los enemigos!!

Categorías:Mis cosas, XNA Etiquetas: , , ,
  1. Adrian
    8 marzo 2015 a las 3:42

    Me sale error en la clase Game1.cs, Que no existe la variable disp…

  1. 8 noviembre 2014 a las 14:44
    mp3

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: