El objetivo de este pequeño tutorial es  cargar y animar un Sprite en XNA, este Sprite deberá recorrer los cuatro extremos de la ventana del video juego.

Primero Creamos un proyecto en c# en visual studio 2008 y seleccionamos la plantilla Windows Game y lo nombramos Tuto_CargarAnimarSprite:

 

seleccionamos el explorador de soluciones y damos clic derecho sobre Content y agregamos una subcarpeta llamada Imágenes, esta carpeta contendrá todas nuestras imágenes para la aplicación.

 

Clic derecho sobre la carpeta que acabamos de crear y seleccionamos la opción agregar, elegimos Elemento existente,  buscamos las imágenes a utilizar en mi caso yo utilizare el logo de Windows player .

 

Una vez realizado esto, en la clase Game1 creamos las siguientes variables:

public class Game1 : Microsoft.Xna.Framework.Game

    {

        GraphicsDeviceManager graphics;

        SpriteBatch spriteBatch; //permite dibujar textura creado por XNA

        //Imagen a dibujar de wmplayer

        Texture2D wmPlayer;

        Vector2 wmPlayerPos = Vector2.Zero; //posicion de la imagen por defecto (0,0)

Existe un método llamado LoadContent(), este método permite cargar todo nuestro contenido para el juego.  Escribimos el siguiente código dentro del método LoadContent:

protected override void LoadContent()

        {

            // Crea un nuevo SpriteBatch, que puede ser usado para dibujar texturas.

            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: usa this.Content para cargar el contenido del juego here

            wmPlayer = this.Content.Load<Texture2D>(@”Imagenes/wmplayer”);

        }

el nombre de nuestra imagen no debe llevar la extension .png

para poder dibujar nuestra imagen tambien esxiste un metodo llamado Draw(), nos permite dibujar cualquier contenido que utilizemos o que cargamos en el metodo LoadContent. Escribimos el siguiente codigo:

protected override void Draw(GameTime gameTime)

        {

            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            spriteBatch.Begin();

            spriteBatch.Draw(wmPlayer,wmPlayerPos,Color.White);

            spriteBatch.End();

            base.Draw(gameTime);

        }

 Compilamos con F5 para ejecutar nuestro juego:

 

Ahora animaremos el logo de Windows player, nuevamente en la clase Game1 agregamos las siguientes variables:

Point wmPlayerTamañoMarco = new Point(125, 125);//tamaño del marco

Point wmPlayerMarcoActual = new Point(0, 0);

Point wmPlayerTamañoCapa = new Point(6, 8);

Modificamos los parametros en el metodo spriteBatch.Draw()y el metodo spriteBatch.Begin(), dentro del metodo Draw():

spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.FrontToBack, SaveStateMode.None);

            spriteBatch.Draw(wmPlayer, wmPlayerPos, new Rectangle(wmPlayerMarcoActual.X * wmPlayerTamañoMarco.X,

                wmPlayerMarcoActual.Y * wmPlayerTamañoMarco.Y, wmPlayerTamañoMarco.X, wmPlayerTamañoMarco.Y),

                Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0);

Compilamos con F5, solamente mostrara el logo estos cambios no deberán afectar, el juego deberá seguir funcionando. Si se encuentra con algún error verifica que  hayas escrito bien el código.

Localicemos el método update, este permite actualizar todo lo que realizamos en el juego como colisiones, puntajes, etc.  Escribimos el siguiente código para animar el sprite:

protected override void Update(GameTime gameTime)

        {

            // permite finalizar el juego

            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

                this.Exit();

            // TODO: agrega tu logica para actulizar aqui

            ++wmPlayerMarcoActual.X;

            if (wmPlayerMarcoActual.X >= wmPlayerTamañoCapa.X)

            {

                wmPlayerMarcoActual.X = 0;

                ++wmPlayerMarcoActual.Y;

                if (wmPlayerMarcoActual.Y >= wmPlayerTamañoCapa.Y)

                {

                    wmPlayerMarcoActual.Y = 0;

                }

            }

            base.Update(gameTime);

        }

Compilamos con F5 y deberíamos ver que el sprite parpadea:

 

Agregamos dos nuevas variables a la clase Game1:

int wmPlayerTiempoFrameAnterior = 0;

const int wmPlayerMiliSegundoPorFrame = 50;

Modificamos la animacion que fue agregada en le metodo Update(), quedaria de la siguiente manera:

//animar la imagen wmPlayer

         wmPlayerTiempoFrameAnterior += gameTime.ElapsedGameTime.Milliseconds;

            if (wmPlayerTiempoFrameAnterior > wmPlayerMiliSegundoPorFrame)

            {

                wmPlayerTiempoFrameAnterior -= wmPlayerMiliSegundoPorFrame;

                ++wmPlayerMarcoActual.X;

                if (wmPlayerMarcoActual.X >= wmPlayerTamañoCapa.X)

                {

                    wmPlayerMarcoActual.X = 0;

                    ++wmPlayerMarcoActual.Y;

                    if (wmPlayerMarcoActual.Y >= wmPlayerTamañoCapa.Y)

                    {

                        wmPlayerMarcoActual.Y = 0;

                    }

                }

            }

Para poder mover nuestra imagen agregamos una variable en la clase Game1:

float wmPlayerVelocidad = 4;//velocidad del sprite

Ahora moveremos nuestra imagen por los cuatro bordes del juego y evitando que sobre pase la ventana del juego. El código deberás colocarlo  al final de la animación de la imagen pero antes del método base.Upadate(gameTime):

//moviendo el sprite por los cuatro bordes

        wmPlayerPos.X += wmPlayerVelocidad;

    if (wmPlayerPos.X > Window.ClientBounds.Width – wmPlayerTamañoMarco.X)

       {

            wmPlayerPos.X = Window.ClientBounds.Width – wmPlayerTamañoMarco.X;

            wmPlayerPos.Y += wmPlayerVelocidad;

       }

    if (wmPlayerPos.Y > Window.ClientBounds.Height – wmPlayerTamañoMarco.Y)

       {

           wmPlayerPos.Y = Window.ClientBounds.Height – wmPlayerTamañoMarco.Y;

           wmPlayerVelocidad *= -1;

       }

    if (wmPlayerPos.X < 0)

       {

            wmPlayerPos.X = 0;

            wmPlayerPos.Y += wmPlayerVelocidad;

       }

    if (wmPlayerPos.Y < 0)

       {

             wmPlayerPos.Y = 0;

             wmPlayerVelocidad *= -1;

       }

Compilamos con F5: