Moviendo la nave.

octubre 7, 2008 at 9:54 pm 11 comentarios

 Como comente en el anterior post, primero voy a poner el código del juego para que te vayas animando al ver algo en movimiento y para los que ya tienen algo de conocimientos no se aburran, lo explicare muy por encima, pero no te preocupes si no entiendes muchas cosas, en los siguientes tutoriales lo iré explicando.

Bien, abrimos el proyecto que ya creamos en anteriores capítulos, ahora creamos una nueva clase:

1.       Click derecho en el fichero de proyecto, agregar  -> Clase.

2.       Ahora ponle de nombre NaveProtagonista.cs

Ahora ya podemos empezar a programar la lógica de nuestra nave.

Primero de todo, agregamos las referencias necesarias:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

 

Acto seguido hacemos que nuestra clase herede de DrawableGameComponent, la herencia la veremos en un capitulo para ella solita.

class NaveProtagonista : DrawableGameComponent

Ahora creamos las variables que necesitaremos más adelante:

float rotacion = 0.0f;
Vector2 posicion;
Vector2 velocidad;
Asteroids juegoActual = null;
Texture2D SpriteNave;

Se crea un constructor para la clase:

public NaveProtagonista(Game juego) : base(juego)
 {
        juegoActual = (Asteroids)juego;
}

Ahora, gracias a la herencia podemos hacer una sobreescritura de algunos metodos que nos permitiran manejar el grafico.

En la clase Initialize cargamos el grafico de la nave y lo colocamos en pantalla, en este caso en el centro.

public override void Initialize()
{
        posicion.X = juegoActual.Window.ClientBounds.Width / 2;
        posicion.Y = juegoActual.Window.ClientBounds.Height / 2;
        SpriteNave = juegoActual.Content.Load<Texture2D>("Graficos/nave2");
}

Ahora sobreescribimos el metodo que nos permitira mover la nave:

public override void Update(GameTime gameTime)
{
       KeyboardState estadoTeclado = Keyboard.GetState();
       Keys[]teclapulsada = estadoTeclado.GetPressedKeys();
      foreach (Keys tecla in teclapulsada)
      {
            if (tecla == Keys.Left)
            {
                  rotacion -= ((float)gameTime.ElapsedGameTime.TotalSeconds) * 3f;
            }
            if (tecla == Keys.Right)
            {
                 rotacion += ((float)gameTime.ElapsedGameTime.TotalSeconds) * 3f;
            }
            if (tecla == Keys.Up)
           {
               Vector2 VelocityAdd = Vector2.Zero;
               //calculamos la direccion de la nave
               VelocityAdd.X = (float)Math.Sin(rotacion);
               VelocityAdd.Y = -(float)Math.Cos(rotacion);
               velocidad += VelocityAdd;
          }
     }
    //le sumamos el vector de velocidad calculado
     posicion += velocidad;
     velocidad *= 0.91f;

            base.Update(gameTime);
        }

Por ultimo dibujamos el gráfico:

  public override void Draw(GameTime gameTime)
        {
                       juegoActual.SpriteBatch.Draw(SpriteNave, posicion,
                             new Rectangle(0, 0, SpriteNave.Width, SpriteNave.Height),
                             Color.White, rotacion, new Vector2(SpriteNave.Width / 2,
                             SpriteNave.Height / 2), 1.5f, SpriteEffects.None, 0);

            base.Draw(gameTime);
        }

Con esto tenemos toda la lógica de la nave para moverse por la pantalla.

Ahora tenemos que inicializarla, como os comente en el capitlo de orientación a objetos, para poder usarla tenemos que instanciarla, ¿Dónde haremos esto?, en el fichero base del juego.

Haz doble click en Game1.cs

Creamos las variables y propiedades necesarias:

 GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        NaveProtagonista protagonista;

        public SpriteBatch SpriteBatch
        {
            get { return spriteBatch; }
        }

        private GraphicsDeviceManager _propiedadesGraficos;
        public GraphicsDeviceManager propiedadesGraficos
        {
            get { return _propiedadesGraficos; }
            set { _propiedadesGraficos = value; }

        }

 Ahora creamos el constructor de la clase(todo esto se explicará, tranquilo) donde instanciamos la nave protagonista que hemos creado antes.

public Asteroids()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            graphics.PreferredBackBufferHeight = 768;
            graphics.PreferredBackBufferWidth = 1024;
            graphics.IsFullScreen = true;

            protagonista = new NaveProtagonista(this);

            _propiedadesGraficos = graphics;
        }

 En el metodo LoadContent creamos el objeto spriteBatch.

 protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            protagonista.Initialize();

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

En el método Update hacemos que al darle a escape se salga del juego:

 protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed ||             Keyboard.GetState().IsKeyDown(Keys.Escape))
                this.Exit();

            // TODO: Add your update logic here
            protagonista.Update(gameTime);
            base.Update(gameTime);
        }

Y por ultimo dibujamos…

  protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.Black);
            spriteBatch.Begin();

            protagonista.Draw(gameTime);

            spriteBatch.End();
            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }

Sé que todo ha sido muy a saco, pero necesito que tengas algo de código real para ir trabajando en los tutoriales, en siguientes capítulos veremos el ciclo que sigue XNA al ejecutar un juego, porque métodos pasa primero y que hacer en cada uno de ellos, también veremos la sintaxis que estamos usando en el tutorial de C#

Ahora solo nos queda una cosa para que esto funcione, cargar el grafico en el proyecto,

En la carpeta content, click derecho, agregar nueva carpeta, la llamamos  Graficos, click derecho en la carpeta recién creada y agregar elemento existente, acto seguido seleccionamos el grafico, mañana subiré el que estoy usando yo al blog, puedes probar con cualquier grafico, pero ten en cuenta que has de cambiar la ruta con el nombre de tu grafico en el método Initialize de la clase NaveProtagonista:

            SpriteNave = juegoActual.Content.Load<Texture2D>(“Graficos/nave2”); <- Cambialo!

Anuncios

Entry filed under: XNA. Tags: , , , , , , .

Ya tenemos grafico para la nave. Ficheros del proyecto. Moviendo la nave.

11 comentarios Add your own

  • 1. Roberto Castillo  |  marzo 5, 2009 en 9:08 am

    Hermano tengo un problema a la hora de compilar…
    El problema es con el constructor de la clase…donde se hace referencia al namespace… lo tengo tal y como tu lo tienes

    Error 1 ‘Asteroids’ es ‘espacio de nombres’ pero se utiliza como ‘tipo’ naveprotagonista.cs

    Excelente tutorial…de antemano, gracias

    Responder
  • 2. kennyhp  |  marzo 5, 2009 en 2:13 pm

    Hola Roberto,
    ¿puedes ponerme aquí la linea que te da el error?

    Responder
  • 3. Roberto Castillo  |  marzo 5, 2009 en 5:30 pm

    Muchas gracias por la pronta respuesta..Pero lo he resuelto…

    en Program.cs tengo esta línea
    using (Game1 game = new Game1())

    y en naveprotagonista.cs

    Game1 juegoActual= null;

    El error era que yo invocaba “Asteroids juegoActual=null” , es decir, como viene en tu ejemplo…
    y como yo no tenia declarado Asteroids en Program.cs , es por esto que el compilador se confundia con el “namespace” de la clase…
    Gracias gracias por este excelente blog!! sigue asi!!!

    Responder
  • 4. kennyhp  |  marzo 5, 2009 en 5:43 pm

    Al comentarmerlo ahora me acabo de dar cuenta de una cosa… cuando creas un proyecto nuevo el nombre que le pone a la clase para el juego es Game1, yo se la cambie y le puse Asteroids, por eso te daba el error!
    Deduzco que no estabas trabajando con el proyecto que yo subí, si no que estabas picando tu propio código a partir del tutorial… muy bien, picando el código es como mas se aprende 😉
    Un saludo!

    Responder
  • 5. Roberto Castillo  |  marzo 7, 2009 en 7:18 am

    Exacto, esa es la mejor forma de aprender..
    La retroalimentación al encontrar nuestras fallas…
    Gracias y espero la continuación de tus tutoriales…

    Responder
  • 6. Sergio Cárdenas  |  junio 28, 2009 en 5:50 pm

    Yo también he estado picando el código a mano, todo ello. Al ver el fallo del que habéis estado hablando, coloqué Game1 en vez de Asteroids, pero el nombre de mi proyecto sí que era Asteroids desde el principio.

    Usando Game1 como tipo en vez de Asteroids solucioné el fallo.

    Mi pregunta es, ¿a estas alturas del tutorial la nave debe de moverse cuando pulse las teclas del teclado?

    Me carga el juego, se ve el fondo negro y la navecita en el centro, pero no se mueve usando el teclado ni siquiera usando un controlador de xbox360 que tengo. La ventana se cierra correctamente usando Esc.

    Responder
  • 7. Sergio Cárdenas  |  junio 28, 2009 en 6:26 pm

    Vale, ya lo he arreglado.

    Me faltaba una línea en Update. Y eso que lo había revisado.

    Gracias por los tutoriales. Son muy buenos, seguiré haciéndolos.

    Responder
  • 8. Kenny_hp  |  junio 29, 2009 en 8:38 pm

    Pues puedes seguir los nuevos tutoriales en la nueva dirección del blog.
    desarrolloxna.blogspot.com

    Responder
  • 9. humberto  |  enero 8, 2011 en 7:29 pm

    hey men buen tutorial
    amm solo que no entendi bien eso de crear una carpeta y agragarle el elemento existente.

    ¿Que elemento existente?
    me podrias explicar mejor

    gracias de antemano!!

    Responder
  • 10. humberto  |  enero 8, 2011 en 7:47 pm

    men ya le entendi jaja ammm, ahora donde dices que cambiemos lo de la SpriteNave, amm como le pongo la ruta, amm asi :

    (Documentos/VisualEstudio/Proyects/Game1/Content/Graficos/nave)

    de ese modo?? o solo Graficos/nave??

    Responder
  • 11. InG_G  |  noviembre 22, 2011 en 2:43 pm

    Una pregunta! en que fichero y linea coloco el constructor de la clase?

    public NaveProtagonista(Game juego) : base(juego)

    {

    juegoActual = (Asteroids)juego;
    }
    Gracias por el Tuto!

    Responder

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

Trackback this post  |  Subscribe to the comments via RSS Feed


Entradas recientes

Categorías

octubre 2008
L M X J V S D
« Sep   Nov »
 12345
6789101112
13141516171819
20212223242526
2728293031  

Feeds

Visitas totales:

  • 92,139 visitas
wordpress stats

A %d blogueros les gusta esto: