5. Movimiento sprite.

4 11 2008

Movimientos basicos de un sprite( left, right, up, down). el codigo es el mismo utilizado en uno de los primeros tutoriales, el de hola mundo X e Y , con la unica diferencia que este utiliza una texture2d y hola mundo X e y era un string.

Hola mundo X e Y:

spriteBatch.DrawString(arial, saludo+»(«+posicionPalabra.X+»,»+ posicionPalabra.Y+»)»,
posicionPalabra, Color.Black);

Movimiento Nave : spriteBatch.Draw(nave,posicionNave, Color.White);

Movimiento sprite

rar





3. Rotacion de sprite 2.0

2 05 2008

hola en el anterior tema se hablo de como rotar un sprite ,pero ahi algo que nohabia podido hacer , en como rotar un sprite y q segun el angulo de rotacion , el avioncete avanzara en esa direccion, bueno gracias a un amigo de xna community pude hacerlo, en esto ahi que tomar en cuenta material de computacion grafica, hasta el momento no sabia nada de ello, pero es una rama de ingeneria muy interesante para todos los que quereis aprender manipulaciones graficas tanto para 2d y 3d, lo que nosotros haremos es materia de transformaciones 2d.

protected void teclado(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 hacia la que apunta la avioneta

         VelocityAdd.X = (float)Math.Sin(rotacion);
         VelocityAdd.Y = -(float)Math.Cos(rotacion);
         velocidad += VelocityAdd;
         }
         if (tecla == Keys.Escape)
         {
         this.Exit();
         }
       }
       //le sumamos el vector de velocidad calculado
       posicionNave += velocidad;
    //Acemos que la velocidad disminulla poco a poco para
       simular la desaceleración
          velocidad *= 0.95f;
        }

Anteriormente habia explicado que valores vajo 1 osea valores flotantes era cuando el avionzete, giraba hacia derecha, ahora lo que hacemos es obtener ese valor y guardarlo en un vector cuyos valores esten en vacio (Vector2 VelocityAdd = Vector2.Zero;) , de nuestro vector obtenemos 2 valores: el seno y coseno ,ontonces tenemos:

VelocityAdd.X = (float)Math.Sin(rotacion);
VelocityAdd.Y = -(float)Math.Cos(rotacion);

que seno tiene rotacion? que coseno tiene rotacion? lo obtenemos de la funcion Math.sin y Math.cos,
desde el punto de origen, nuestro punto de origen que es el vector velocityAdd.

y donde P(x,y) es nuestro valor obtenido, osea obtenemos nuestro valor y se lo pasamos al vector velocityAdd, luego el valor de velocityAdd se lopasamos al vector velocidad y luego al vector posicion nave para que esta se mueva , y he la ciencia de esta rotacion2d.

Supongamos que nos pocicionamos en el angulo 40 , calculamos su seno y su coseno luego nuestra velocidad quedaria algo asi :en seno 0.642 y coseno 0.766 , ontonces pasamos los valores a velocityAdd, velocityAdd(0.642,0.766) aumentando en 1++ con el vector velocidad y luego a posicion nave.

aps otro detalle , velocidad * = 0.95f, esta muy bien esto para hacer deseleraciones no tan bruscas y que vayan de a poco ( tenemos un contador multiplo de numeros flotantes que hacen llegar a un valor 0).

bueno creo q me alarge un poco , si no se esta entendiendo enviarme un post, y asi podre ver que es lo queno se entiende, ya aqui como siempre me despido con mi video en youtube xd, esta ves de nightwish

y los archivos.

rar





2. Rotacion de sprites

29 04 2008

Los sprites son objetos que nos permite representar imagenes en nuestros juegos.

En un ejemplo anterior del hola mundo utilizamos un spriteFont , un sprite normal tiene casi el mismo proceso de carga que un spriteFont, la diferencia radica en unos pequeños detalles de carga:

Texture2D nave;

nave = Content.Load("nave");

Se inicializa nuestro objeto textura.

En el proceso loadContent() en ves de loas<spriteFont> lo remplazamos por nuestra textura.

Para darle rotacion a nuestro objeto textura devemos tener en cuenta el proceso draw(), ya que en este tendremos sobrecargas importastes a considar:

nustra imagen, posicion, Color, rotacion, vector origen,escala, efectos, capa).

esto queda asi:

            spriteBatch.Draw(nave, posicionNave,
                             new Rectangle(0, 0, nave.Width, nave.Height),
                             Color.White, rotacion, new Vector2(nave.Width / 2,
                             nave.Height / 2), 1.5f, SpriteEffects.None, 0);

El objeto rotacion sera el que manipularemos:

float rotacion = 0.0f;

Aplicando como en elejemplo de movimiento de teclas en el hola mundo, ontonces rotamos al momento de hacer lelf , right con las teclas:

                if (tecla == Keys.Left)
                {
                    rotacion -= ((float)gameTime.ElapsedGameTime.TotalSeconds) * 3f;
                }

                if (tecla == Keys.Right)
                {
                    rotacion += ((float)gameTime.ElapsedGameTime.TotalSeconds) * 3f;
                }

El gameTime ha sido sacado del mismo proceso en que estamos, asi que no le busques mucho sentido a este codigo ya q solo es un para mover el frame a una cierta velocidad considerable.

Ontonces supongamos que nuestro objeto esta dividido en dos mitades , la mitad de la izquierda la dejamos para valores mayores a 1 y la otra mitad para valores menores que 1, osea si el objeto rotacion valiese 0.5 nos encontrariamos quenuestroobjeto se mueve hacia la derecha. En caso contrario hacia la izquierda.

Eso es todo, espero volver con mas info de movimientos de sprites, hasta luego.

Archivo

rar





1.Hola Mundo XNA.

3 04 2008

Esto es cosa de buscar en San google y encontrar, no pensaba hacer el hola mundo en xna pero me acorde que una vez hize un hola mundo en java y que se movia , bueno eso ya resulta mas atractivo je, esto a primeras es un asunto deprimente ,porque lo digo , porque te dices a ti mismo :hice esto ,para esto no mas, pero bueno a medidas que vayas practicando te daras cuenta que haces cosas mas complejas y mas entretenidas.

Empezemos…

Una ves que tienen todo instalado podemos proseguir , acuerdense del link de todo lo que le deje en un articulo anterior q les deje.
Instalacion

Les dejo el Link de mi compañero ahi esta mas claro que el agua de todos los primeros pasos para la generacion de un proyecto. Proyecto XNA

Y ahora les dejo el source.

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;

/* Bueno para los que no saben y tan recien aprendiendo, using
es importar una libreria en nuestro codigo , es como decir: oye
emprestame esto que lo voy a necesitar, Se lo solicitamos al
framework, el framework es el marco de trabajo que nos entrega
variadas funcionalidades*/

/*****Microsoft.Xna.Framework*****
    Ofrece clases de juego común que se necesita, como
temporizadores y los bucles del juego.

 ****Microsoft.Xna.Framework.Audio***
   Contiene bajo nivel de interfaz de programación de
   aplicaciones (API) de los métodos que pueden cargar
   y manipular XACT-proyecto creado y los archivos de
   contenido para reproducir audio.

****Microsoft.Xna.Framework.Graphics*****
   Contiene bajo nivel de interfaz de programación de
   aplicaciones (API) de los métodos que aprovechan las
   capacidades de aceleración de hardware para mostrar
   objetos 3D.

***Microsoft.Xna.Framework.Input*****
  Contiene las clases para recibir el aporte de teclado,
  el ratón y dispositivos de Xbox 360 Controller.

***Microsoft.Xna.Framework.Net****
  Contiene clases que implementan el apoyo a Xbox
  LIVE, multijugador,  y la creación de redes para el
  Marco de juegos XNA.

***Microsoft.Xna.Framework.Storage***
  Contiene clases que permiten la lectura y escritura
  de archivos.
 **/
namespace Hola_mundo_X_Y
{

 /*La palabra clave namespace se utiliza para declarar un ámbito.
     Este ámbito permite organizar el código y proporciona una
     forma de crear tipos globalmente únicos.*/

 public class Game1 : Microsoft.Xna.Framework.Game
 {

   // Esta es la clase base del juego
   GraphicsDeviceManager graphics;

  //Con este objeto administras los dispositivos
  graficos SpriteBatch spriteBatch;

 /* Permite a un grupo de sprites que se
    expedirá con la misma configuración.
   Namespace: Microsoft.Xna.Framework.Graphics
   Assembly: Microsoft.Xna.Framework
   (en microsoft.xna.framework.dll)*/
        Vector2 posicionPalabra;
        
        /*Define un vector con dos componentes;
        X-Componente e Y-Componente.
        Namespace: Microsoft.Xna.Framework
        Assembly: Microsoft.Xna.Framework
       (en microsoft.xna.framework.dll)*/
        SpriteFont arial;

        //nuestra fuente
        const int velocidadPalabra = 5;

        //una variable entera y constante
        string saludo = "Hola Mundo";

        //una variable cadena
        public Game1()
        {

        //inializador de los componentes.
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {

        // logica de iniciación
        //Variables de puntajes y objetos del juego
        //No inicies nada grafico en este lugar

            posicionPalabra.X = 50;
            posicionPalabra.Y = 50;
            base.Initialize();
        }

        protected override void LoadContent()
        {

        // instanciando SpriteBatch, para ya poder
       // empezar a dibujar.
     spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
         arial = Content.Load("arial");

        }

  protected override void UnloadContent()
  {

  // Elimina todo contenido q no pertenesca
  //a ContentManager.
  }
  protected override void Update(GameTime gameTime)
  {
     KeyboardState keyboard = Keyboard.GetState();
    teclado(gameTime);

  //funcion teclado
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed||
				keyboard.IsKeyDown(Keys.Escape))
   {
       // si queremos salir de la ventana con Esc.
       this.Exit();
   }

   base.Update(gameTime);

   //Este se llama cuando el juego se Dibuja.
   }
        protected void teclado(GameTime gameTime)
        {

            // controlador de teclado
            KeyboardState estadoTeclado = Keyboard.GetState();

            // estado de nuetro teclado ,
           //el metodo GetState nos recolecta el estado de
            //nuestro teclado
      Keys[] teclapulsada = estadoTeclado.GetPressedKeys();

  // todos los eventos de teclado los guardamos en Keys[].

      foreach (Keys tecla in teclapulsada)
         {

      //repite un grupo de instrucciones incluidas
       // en el bucle para
          //cada elemento de una matriz o de un objeto collection
         // en este caso Keys[].
         if (tecla == Keys.Left)
         {
         posicionPalabra.X -= velocidadPalabra;

        //disminiyendo--   
        }
        if (tecla == Keys.Right)
        {
        posicionPalabra.X += velocidadPalabra;

        //aumentando++
        }
         if (tecla == Keys.Up)
        {
        posicionPalabra.Y -= velocidadPalabra;

        //disminiyendo--
        }

       if (tecla == Keys.Down)
       {
       posicionPalabra.Y += velocidadPalabra;

       //aumentando++
       }

       if (tecla == Keys.Escape)
       {
       this.Exit();

       //cierre del programa
       }
     }
   }
   protected override void Draw(GameTime gameTime)
   {

   //Metodo de pintado
     graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
     spriteBatch.Begin();
     spriteBatch.DrawString(arial, saludo+
                                   "("+posicionPalabra.X+"
                                 ,"+ posicionPalabra.Y+")",
                             posicionPalabra, Color.Black);
     spriteBatch.End();
     base.Draw(gameTime);
   }
  }
}

bueno despues de todo este codigo veran algo como esto:

Seguiremos por mas cosas que ver .Les dejo los archivos adjuntos, lo cual para ver este pequeño proyecto, tienen que tener el XNA Games Studio 2.0 Redistributable y XP con sp2( servipack 2) .

aqui los links de descarga.

rar

Hola mundo X_Y

XNA Games Studio 2.0 Redestributable.

Emmm probe todo esto en el pc de mi hermano , no me ha funkado , bueno lo dejo de tarea para despues, la ideas es hacer un instalador en donde vaya todo empaquetado , si alguien sabe me avisa en un post, pero si tienes todo instalado y lo pruebas con el Visual C# , no tendreis problemas.

Bueno me despido, hasta la proxima , practiquen harto!!! La practica hace al maestro, bytes.