martes, 24 de enero de 2012

Press Start!: Introducción a XNA 4.0

"El optimista tiene siempre un proyecto, el pesimista, una excusa."
Anónimo

Antes que nada...
Aviso: Recomiendo tener conocimientos básicos en C#. A lo largo de este año me dedicaré (en mis tiempos libres) al desarrollo de videojuegos en 2D, enfocándome principalmente en XNA 4.0 y sin hacer mucho hincapié en temas sobre la programación en C#.
Por lo tanto, seguir adelante puede resultar difícil a quienes no tengan conocimientos previos. Los invito a que se animen e investiguen acerca de tutoriales de este lenguaje. En la web hay muchos tutoriales y aprender C# no es tan difícil. Sólo depende del tiempo y dedicación que quieras darle. Asique, ¡anímense!

¡Estamos a punto de empezar!

Personalmente, creo que es necesario tener claro algunos conceptos básicos antes de empezar con el proyecto. En esta oportunidad, exploraremos superficialmente el IDE de XNA 4.0 Game Studio. ¿Qué es un IDE? ¿Qué es XNA Game Studio 4.0? ¿Cómo empezar?


XNA Game Studio 4.0

Es un Entorno de Desarrollo Integrado (IDE) creado por Microsoft que incluye XNA framework, destinado al desarrollo de videojuegos en 2D y 3D. Los juegos producidos son compatibles únicamente con las siguientes plataformas: PC, Xbox360 y Windows Phone 7.

IDE: (Integrated Development Environment) Es un entorno utilizado para la programación, que ha sido empaquetado como un programa de aplicación. Microsoft Visual Studio Express es un ejemplo.

Utilizaré este entorno para realizar el proyecto. Hay 2 formas de intalación:
Ultima versión de XNA
 

XNA Framework

Es conveniente conocer algunas de las principales características de las herramientas que vamos a usar. ¡Veamos un poco!

XNA framework es un conjunto de bibliotecas administradas diseñadas para el desarrollo de juegos basado en Microsoft .NET Framework 2.0.

Framework: Es una estructura de programación (por ejemplo un conjunto de bibliotecas) utilizada como base para poder facilitar el desarrollo de programación de software. Los frameworks son extensibles y se caracterizan por tener una estructura muy grande. Pueden albergar APIs. XNA 4.0 (C# como lenguaje nativo) y SFML (C++ como lenguaje nativo) son ejemplos de Frameworks.
API: (Application Program Interface o Interfaz de Programacion de Aplicación) es el conjunto de definiciones de métodos o funciones que exponen las clases. A veces se utiliza este término como sinónimo de Framework, pero la realidad es que el Framework se diferencia por ser extensible y/o más extenso.

XNA framework puede describirse como una serie de capas:
  • Plataforma: Es la capa inferior conformada por APIs, como Direct3D (gráficos), XACT (audio), XInput(dispositivos de entrada), XContent (almacenaje), entre otros.
  • Núcleo del framework: Esta capa se encarga de administrar las funciones más importantes del framework. Las áreas de funcionalidad están agrupadas en gráficos, audio, entrada, matemáticas, y almacenaje. Entre ellas, el área de matemáticas es destacable ya que nos brinda los tipos más usados en la programación de videojuegos, como el uso de Vectores, Matrices, Planos... lo que resulta de mucha utilidad para hacer cálculos importantes (como por ejemplo la detección de colisiones).
  • Framework extendido: Posee 2 componentes: El Modelo de Aplicación y el Content Pipeline. El primero, tiene la misión de facilitar la escritura de código. El segundo, es un API extensible que permite incorporar componentes multimedia. Esto facilita la creación de una librería de componentes reusables.
  • Juegos: Es la capa superior compuesta por el código de juego y su contenido.
 
Si quieres leer un informe más específico sobre XNA Framework, mira el aporte realizado por Mitch Walker.

 

Los Espacios de Nombre de XNA

La biblioteca de XNA Framework tiene muchos Espacios de Nombre (NameSpaces) con clases muy útiles para el desarrollo de videojuegos tanto en 2D como en 3D. Cada uno de ellos, tiene su propia funcionalidad:
  • Microsoft.Xna.Framework: Ofrece clases comunes del juego como temporizadores y bucles de juego.
  • Microsoft.Xna.Framework.Audio: Contiene los métodos de la interfaz de programación de aplicaciones (API) de bajo niveol que pueden cargar y manipular los archivos de proyecto y de contenido creados mediante XACT con la finalidad de reproducir audio.
  • Microsoft.Xna.Framework.Content: Contiene los componentes en tiempo de ejecución de la canalización de contenido.
  • Microsoft.Xna.Framework.Design: Proporciona una forma unificada de convertir tipos de valores en otros tipos.
  • Microsoft.Xna.Framework.GameServices: Contiene clases que implementan diversos servicios relacionados con los jugadores. Estos servicions se comunican directamente con el jugador y los datos del jugador, o reflejan de algún modo elecciones que este toma. Los servicios de jugador incluyen las API de dispositivo de entrada y de datos del perfil.
  • Microsoft.Xna.Framework.Graphics: Contiene métodos de la interfaz de programación de aplicaciones (API) de bajo nivel que aprovechan las ventajas de las capacidades de aceleración de hardware para mostrar objetos en 2D y 3D.
  • Microsoft.Xna.Framework.PackedVector: Representa tipos de datos con componentes que no son múltiplos de 8.
  • Microsoft.Xna.Framework.Input: Contiene las clases que reciben entradas desde el teclado, el mouse y los dispositivos de mando Xbox360.
  • Microsoft.Xna.Framework.Input.Touch: Contiene las clases que permiten acceder a entradas táctiles en los dispositivos que lo admiten.
  • Microsoft.Xna.Framework.Media: Contiene clases para enumerar, reproducir y ver canciones, álbumes, listas de reproducción e imágenes.
  • Microsoft.Xna.Framework.Net: Contiene clases que permiten la compatibilidad con XboxLIVE, multijugador y conexión en red para juegos con XNA Framework.
  • Microsoft.Xna.Framework.Storage: Contiene las clases que permiten leer y escribir archivos.


Creando un Nuevo Proyecto

Ahora que conocemos lo básico sobre nuestra herramienta, veamos cómo podemos empezar a trabajar con un proyecto de juego, ya sea para PC, Xbox360 o Windows Phone 7. Continuemos realizando los siguientes pasos:
  1. Una vez instalado XNA Game Studio 4.0, ejecuta la aplicación.
  2. Cuando aparezca la página de inicio, haz click en el menú Archivo y, a continuación, en Nuevo proyecto.
    Aparecerá un cuadro de diálogo llamado Tipos de proyecto con una lista en árbol en el panel de la izquierda.
  3. Selecciona el nodo de árbol XNA Game Studio 4.0 bajo el nodo Visual C#.
    En el panel de la derecha, aparece el conjunto de proyectos disponibles.
  4. En el panel de la derecha del cuadro de diálogo, haz click en Juego de Windows (4.0) y, a continuación escribe el título del proyecto (como "MiPrimerJuego") en el cuadro Nombre.
  5. Escribe la ruta donde le gustaría guardar el proyecto en el cuadro Ubicación y, a continuación, haz click en Aceptar
Así habrás creado un nuevo proyecto. Deberías poder ver el siguiente código, generado automáticamente:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace MiPrimerJuego
{
    /// 
    /// This is the main type for your game
    /// 
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// 
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// 
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
        }

        /// 
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// 
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

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

        /// 
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// 
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// 
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// 
        /// Provides a snapshot of timing values.
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            base.Update(gameTime);
        }

        /// 
        /// This is called when the game should draw itself.
        /// 
        /// Provides a snapshot of timing values.
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }
    }
}


Interpretando el Código
Lo anterior no es solamente una simple plantilla de código inicial, sino que es algo mucho más importante, pues representa al corazón de un juego: es el Bucle de Juego (o Game Loop).

Game Loop: Cuando un juego se ejecuta, el programa debe interactuar con el usuario y llevar a cabo una serie de métodos que administran la parte lógica y la vizualización de imágenes del juego. Estos métodos se ejecutarán una y otra vez mientras el juego siga funcionando. Este ciclo se conoce como Game Loop.

El Bucle de Juego está compuesto por los siguiente métodos o funciones:
  • El método Initialize es donde puede inicializar los datos que no requieran un GraphicsDevice para inicializarse.
  • El método LoadContent es donde se cargan los datos necesarios del juego, como modelos, texturas y sonidos.
  • El método UnloadContent es donde se pueden liberar los activos del juego. Generalmente no se requiere código adicional aquí, ya que los objetos se liberarán automáticamente cuando dejen de ser necesarios.
  • El bucle Update es el mejor lugar donde actualizar la lógica del juego: mover objetos, recolectar los datos que especifica el jugador, decidir sobre el resultado de colisiones entre objetos, etc.
  • El bucle Draw es el mejor lugar donde representar todos los objetos y fondos en la pantalla.
El Game Loop de XNA



Conclusión
Hemos visto algunos conceptos básicos antes de empezar el proyecto. Más adelante comenzaremos a programar y, mientras explicamos algunos conceptos simples, realizaremos prácticas básicas, como por ejemplo carga de archivos, movimiento de un sprite, verificación de colisiones... etc.

Pero primero lo primero, comencemos viendo lo básico en la siguiente entrada: Nuevo Proyecto y Uso de Texto en XNA Game Studio 4.0

¡Sigue adelante, siempre!

2 comentarios:

Excelente!!! esto es justamente lo que andaba buscando

Me alegro que te sirva y espero que sigas encontrando lo que necesites!

Publicar un comentario