Level 03: Detección de Colisiones II

Tercer tutorial sobre Programación con XNA Framework 4.0. Esta vez escribí sobre algunos problemas que pueden presentarse en la detección de colisiones 2D y también sobre cuáles serían las posibles soluciones, como la detección a nivel pixel (Pixel Perfect).

Frogger Kombat

Este juego fue realizado en conjunto con algunos amigos durante una Game Jam, a finales del 2011. Se trata de una pelea de sapos, que son manejados por 2 jugadores simultáneamente. El objetivo del juego es saltar y aplastar al contrincante hasta quitarle todos sus puntos de vida.

Votación CODEAR 2012: DEMO

CODEAR es un concurso en donde compiten desarrolladores de videojuegos. Consiste en producir un juego según una temática. En este caso, la temática fue "Demo". La votación termina el 11 de Septiembre. Puedes ver y jugar a todos los juegos que compiten, haciendo click en la imagen.

Nuevo mini COREAR: Cinemática

Estoy participando en un mini COREAR, que es un concurso en el cual compiten músicos y sonidistas. Cada competencia tiene una temática, a partir de la cual se crean pistas de música para poder participar. Esta vez la temática es "Cinemática". La idea es tomar cualquier cinemática de cualquier juego y componer una pista de música que pueda reemplazar a la original. Si quieres escuchar lo que hice, haz click en la imagen. Para más información sobre este COREAR, haz click en el título.

Sumate a la comunidad de DUVAL!

DUVAL (Desarrolladores Unidos de Videojuegos de América Latina) es una comunidad cuyo objetivo es mantener un lugar donde pueda existir una comunicación libre e independiente entre los desarrolladores de videojuegos de la region, para compartir trabajos, conocimientos, armar grupos, etc.

martes, 31 de enero de 2012

Juego: Frogger Kombat

"Sorprendernos por algo es el primer paso de la mente hacia el descubrimiento."
Louis Pasteur (1822 - 1895) - Químico y Microbiólogo francés

Antes que nada...

Agradecimientos: A todos los que hicieron posible y compartieron esta gran experiencia que fue muy importante para mí. Un agradecimiento especial al grupo de Killabunnies por toda su buena onda.

Saludos!

Este es un juego que surgió de una Game Jam organizada el 26 de noviembre del 2011 por Killabunnies. El evento se realizó en la provincia de Santa Fe (Argentina). Participamos 8 personas en total, algunos de ellos compañeros de la facultad. Las tareas se repartieron 3 áreas: diseño de juego, programación y diseño gráfico.
Algunos no teníamos experiencia en desarrollo de videojuegos, pero todos colaboraros en algunas cosas. La experiencia fue muy buena, fue muy emocionante para mí, ya que era la primera vez que colaboraba en un proyecto de videojuego. Realmente aprendí muchas cosas.

Por mi parte, pude aportar con la música del juego. El proyecto se construyó usando C++ como lenguaje y con la ayuda de una API conocida como SMFL. Lamentablemente no tenía conocimientos sobre aquel lenguaje, por lo que no pude contribuir en la programación del juego.
Este fue uno de los motivos que me impulsaron a investigar y aprender sobre la programación de videojuegos. Y finalmente ese impulso me llevó a crear este blog para poder compartir sobre lo que me gusta y, en lo posible, contagiar un poco de mi pasión por los videojuegos.




Frogger Kombat V 1.0

Game Jam: Es un encuentro entre diseñadores, artistas, programadores y otras personas que tengan conocimientos sobre el desarrollo de videojuegos. El objetivo del Game Jam es producir un videojuego durante el transcurso de un tiempo prestablecido (generalmente son 2 días). El Game Jam suele tener temáticas y limitaciones en el desarrollo.

El Game Jam tuvo como temática el concepto de "Juego Multijugador  -  Dos Botones". Es decir, el proyecto tenía la condición de no usar más de 2 botones y, además, debería poder ser jugado por más de una sola persona simultáneamente.

Con esas condiciones y luego de intercambiar ideas en el grupo, se creó Frogger Kombat. El juego consiste en una pelea entre 2 ranas/sapos. El jugador se mueve saltando y deberá caer encima de su contrincante para poder reducir su vida hasta cero y dejarlo fuera de combate. Los movimientos de los anfibios hacen que la partida sea muy entretenida, ya que requiere calcular muy bien los saltos para atacar o esquivar. ¡Y los diseños de los personajes son espectaculares!

Pueden descargar el juego haciendo click en el botón "Descargar". ¡Espero que inviten a alguien más a jugarlo y disfruten pisoteándose entre los dos! ¡Espero sus comentarios!
 
Autores:
  • Alexis Roldán (Diseño Gráfico)
  • Andrés Miranda (Diseño Gráfico)
  • Dante Costilla (Música)
  • Esteban Corva (Diseño de Personajes)
  • Gonzalo Agosta (Programación)
  • Marcelo Guardia (Programación)
  • Marcos Cabaña (Programación)
  • Mariano Obeid (Programación)
 

¡Sigue adelante, siempre!

viernes, 27 de enero de 2012

Level 00: Nuevo Proyecto y Uso de Texto

"Los primeros 40 años de vida nos dan el texto; los 30 siguientes, el comentario."
Arthur Schopenhauer (1788 - 1860 - Filósofo alemán.

Antes que nada...

Aviso: El contenido puede estar incompleto. Iré actualizando en caso de que necesite hacer algunas correciones o agregar nuevos temas.

¡Llegó la hora de empezar!

Esta es la primer entrada relacionada a la programación de videojuegos 2D en XNA 4.0. En esta oportunidad, vamos a comenzar viendo temas básicos (...y algo aburridos, debo admitir) necesarios para poder comenzar con un videojuego. Estos son los siguientes temas que veremos esta vez:
  1. Cómo comenzar un Nuevo Proyecto
  2. Cómo cambiar el tamaño de Pantalla del juego.
  3. Qué es y cómo crear un SpriteFont.
  4. Cómo cargar un archivo al proyecto.
  5. Cómo mostrar un Texto en la Pantalla.
Así que bueno, ¡comencemos de una buena vez!



Comenzando un Nuevo Proyecto

Una vez instalado XNA Game Studio 4.0, busquemos la carpeta de Microsoft Visual Studio 2010 Express que también fue instalada. Luego ejecutemos la aplicación Microsoft Visual Studio 2010 Express for Windows Phone. Tendría que aparecer la siguiente ventana de inicio:
Imágen 1.0: Pantalla de inicio

Luego, para comenzar un nuevo proyecto, vamos a la pestaña File y hacemos click en New Project. Aparecerá lo siguiente:
Imágen 1.1: Selección de un Nuevo Proyecto

Elije un nombre para tu proyecto y una dirección donde se guardarán sus datos. En mi caso, mi proyecto se va a llamará Prueba01 y lo guardaré en el Escritorio de Windows.
Cuando todo esté listo para comenzar, seleccionan OK y les aparecerá el siguiente código automáticamente (el cual fue explicado brevemente en Press Start!: Introducción a XNA 4.0 ):

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 Prueba01
{
    /// 
    /// 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);
        }
    }
}

Para ejecutar el código de nuestro proyecto, apretamos F5. Si lo hacemos ahora, tendría que salir la siguiente pantalla:
Imagen 1.2: Ejecución de un Proyecto
 
Para nada emocionante, la verdad ¿eh?. Pues quieras creerlo o no, esto ya es tu primer juego y gana quien soporte más tiempo observar la amigable pantallita azul. Puedes invitar a toda tu familia... pero no cuentes conmigo.


Configurando el Tamaño de Pantalla


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

            // this.graphics.IsFullScreen = true;
            
            //this.graphics.PreferredBackBufferWidth = 600;
            //this.graphics.PreferredBackBufferHeight = 800;
        }

Antes de comenzar, configuremos un poco el tamaño de pantalla. Si deseas ejecutar tu juego en pantalla completa, debes activar la propiedad IsFullScreen como "true" (línea 6). O si prefieres, puedes modificar el valor de su ancho y su alto (líneas 8 y 9 respectivamente) con las propiedades PreferredBackBufferWidth (ancho) y PreferredBackBufferHeigth (alto) con las medidas que elijas (por ejemplo 600x800 pixeles).

En este caso, decidí usar el tamaño de pantalla que tiene inicialmente. Por eso, las propiedades están a modo de comentarios.


Creación de un SpriteFont

Aviso: Aprende más sobre SpriteFont aquí.

¡Bien! Ya configuramos la pantalla, ahora veamos cómo podemos mostrar un simple texto en ella. En este caso vamos a mostrar el valor del ancho y alto de la pantalla. Aunque en un futuro, lo que aprendamos ahora, seguramente nos servirá para mostrar los puntos de vida de un jugador, o su puntaje, o un texto que narre una historia, etc. Por ahora,  vayamos por lo básico.

Antes de poder escribir algo, es necesario crear un SpriteFont (fuente de texto). Para ello, hacemos click derecho en Prueba01Content y seleccionamos "New Item", como muestra la siguiente imagen:

Imágen 2.0: Añadir un nuevo Sprite Font


Luego, elijan un nombre (SpriteFont1 es en mi caso) y seleccionen el item llamado "Sprite Font", el cual representará la fuente de texto que usaremos para mostrar.

Entonces se generará el siguiente código en una nueva pestaña:
<?xml version="1.0" encoding="utf-8"?>
<!--
This file contains an xml description of a font, and will be read by the XNA
Framework Content Pipeline. Follow the comments to customize the appearance
of the font in your game, and to change the characters which are available to draw
with.
-->
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  <Asset Type="Graphics:FontDescription">

    <!--
    Modify this string to change the font that will be imported.
    -->
    <FontName>Arial</FontName>

    <!--
    Size is a float value, measured in points. Modify this value to change
    the size of the font.
    -->
    <Size>14</Size>

    <!--
    Spacing is a float value, measured in pixels. Modify this value to change
    the amount of spacing in between characters.
    -->
    <Spacing>0</Spacing>

    <!--
    UseKerning controls the layout of the font. If this value is true, kerning information
    will be used when placing characters.
    -->
    <UseKerning>true</UseKerning>

    <!--
    Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",
    and "Bold, Italic", and are case sensitive.
    -->
    <Style>Regular</Style>

    <!--
    If you uncomment this line, the default character will be substituted if you draw
    or measure text that contains characters which were not included in the font.
    -->
    <!-- <DefaultCharacter>*</DefaultCharacter> -->

    <!--
    CharacterRegions control what letters are available in the font. Every
    character from Start to End will be built and made available for drawing. The
    default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin
    character set. The characters are ordered according to the Unicode standard.
    See the documentation for more information.
    -->
    <CharacterRegions>
      <CharacterRegion>
        <Start>&#32;</Start>
        <End>&#126;</End>
      </CharacterRegion>
    </CharacterRegions>
  </Asset>
</XnaContent>


Lo más importante sucede en las líneas 14, 20 y 26:
  • La línea 14 se refiere al tipo de fuente que vamos a usar. En esta caso usé "Arial" como fuente.
  • La línea 20 indica el valor (en float) del tamaño que el texto tendrá. En este caso, el tamaño de fuente es de 14.
  • La línea 26 establece el valor (en float) del espaciado entre los caracteres del texto. En este caso es de 0.
Si deseas cambiar alguna de estas características, sólo modifica sus valores por los que quieras.


Carga de un archivo (SpriteFont)

Aviso: Aprende más sobre el método LoadContent() aquí.

Ahora que creamos un SpriteFont, podemos escribir algo en pantalla. Primero, declaramos una variable de instancia que hará referencia al SpriteFont que acabamos de crear. Lo hacemos agregándola de esta manera, al comienzo de la clase Game1 (ubicada en la línea 12 del código mostrado al principio) :
public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;        
     
        SpriteFont font;                        // Se guardará el tipo de fuente que se usará en los textos.
        


Luego, continuamos cargando el SpriteFont que creamos hace un rato, que estará referenciada por la variable font. Para ello, añadimos lo siguiente dentro del método LoadContent() de la clase Game01:

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

            font = Content.Load<SpriteFont>("SpriteFont1");
        }

El método Load() carga aquellos archivos que necesitará el juego, como por ejemplo archivos mp3, jpg, png... y en este caso necesitamos un SpriteFont. El método necesita como parámetro el nombre del archivo, que aquí es "SpriteFont1". Podría simplificarse la expresión del método de la siguiente manera:

instanciaDeArchivo = Content.Load <tipoDeArchivo>("NombreDelArchivo");

En donde:
  • instanciaDeArchivo: es una variable de instancia que hace referencia a un archivo en particular (unaImagen, unSonido, unaTextura). En este caso la variable se llama font.
  • tipoDeArchivo: es la clase de archivo que se desea cargar. Puede ser un archivo de la clase SpriteFont, Texture2D, Texture3D, Song...etc. Aquí usamos un SpriteFont.
  • nombreDelArchivo: es el nombre del archivo que fue cargado en la carpeta Content. En este caso es "SpriteFont1"Es muy importante que todo los archivos que vayas a usar (gráficos, donidos, texturas) los guardes en esa carpeta. Para ello, sólo arrastra con el mouse el archivo que quieras guardar en el proyecto y deposítalo dentro de la carpeta Content.


Escribir un Texto en Pantalla

Aviso: Recomiendo que mires antes un post sobre cómo es el Sistema de Coordenadas en 2D aplicado en XNA. De todas formas, explicaré un poco de esto en la siguiente Entrada. Muchas gracias al ingeniero David Mariscal Fernández por la información.

Todo listo para escribir algo en pantalla. Para ello añadimos lo siguiente dentro del método Draw() de la clase Game1:

protected override void Draw(GameTime gameTime)
        {
            string anchoPantalla = Convert.ToString(GraphicsDevice.Viewport.Width);
            string altoPantalla = Convert.ToString(GraphicsDevice.Viewport.Height);                     
            
            GraphicsDevice.Clear(Color.CornflowerBlue);
            

            // ============ Comienza dibujado ===================
            spriteBatch.Begin();

            // Se dibuja el texto donde informa el valor de Ancho de la pantalla
            spriteBatch.DrawString(font,
                                "Ancho: " + anchoPantalla,
                                new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X,
                                            GraphicsDevice.Viewport.TitleSafeArea.Y),
                                Color.White,
                                0f,
                                new Vector2(0,0),
                                0.8f,
                                SpriteEffects.None,0f);

            // Se dibuja el texto donde informa el valor de Alto de la pantalla
            spriteBatch.DrawString(font,
                                    "Alto: " + altoPantalla,
                                    new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X+20,
                                                GraphicsDevice.Viewport.TitleSafeArea.Y+50),
                                    Color.DarkBlue,
                                    MathHelper.ToRadians(90),
                                    new Vector2(0,0),
                                    0.8f,
                                    SpriteEffects.None,
                                    0f);
           
            spriteBatch.End();
            // ============ Termina dibujado ===================           
                 

            base.Draw(gameTime);
        }

En las líneas 3 y 4, lo único que hice fue convertir el valor del ancho y alto de la pantalla a String y guardar esos valores en su respectivas variables.

Pero lo más importante de este método sucede entre las líneas 11 y 36. Todo aquello que esté escrito entre el método spriteBatch.Begin() y el método spriteBatch.End() se dibujará en pantalla por cada loop del juego. Es decir, mientras el juego funcione, se dibujará a cada momento todo lo que esté entre esos 2 métodos.

Se observa también que se usa el método DrawString() en las líneas 14 y 25. Este método sirve para dibujar un texto en pantalla y requiere (en este caso) de los siguientes parámetros:
  1. spriteFont: [SpriteFont] fuente para mostrar texto.
  2. text: [String] Cadena de texto a escribir.
  3. position: [Vector2] Ubicación (en coordenadas de la pantalla) en donde se escribirá el texto.
  4. color: [Color] El color que tendrá el texto.
  5. rotation: [float] Ángulo de rotación (en radianes) del texto que se girará respecto a su centro. En este caso usé uno de los métodos de MathHelper
  6. origin:  [Vector2] Coordenadas orígen del texto. El valor predeterminado es (0,0), que representa su esquina superior izquierda.
  7.  scale: [float] Factor de escala.
  8. effects: [SpriteEffects] Efectos que se aplican al texto (negrita, cursiva).
  9. layerDepth: [float] Profundidad de la capa. De forma predeterminada, 0 representa la capa anterior y 1 representa una capa posterior.
 Es importante saber que para representar la posición de un texto, una imagen... en fin un objeto, se usa la clase Vector2, que indica su posición en coordenadas (x,y). Hablaremos mejor de esto en las próximas entradas. 

Así entonces, si presionamos F5 se obtiene como resultado lo siguiente:

Imagen 3.0: Demostración de Texto en Pantalla

Vemos que el texto "Ancho: " no tiene rotación. Por eso el quinto parámetro (rotation) vale cero. En cambio el texto "Alto: " Tiene una rotación de 90º. Pude hacer eso con la ayuda de uno de los métodos de la clase MathHelper. Esta clase resulta muy útil para ahorrarnos el trabajo de hacer algunos cálculos. Por ejemplo: 

Pregunta: ¿Cuántos radianes son equivalentes a 90 grados?
Respuesta: No lo sé, pero si usas el método ToRadians() de la clase MathHelper y le pasas como parámetro esos 90 grados, te aseguro que te los convierte en radianes.

Si, ya sé que no soy muy amigo de las matemáticas. Pero Wikipedia si, asi que puedes ver un artículo sobre radianes e informarte en lugar de seguir mi mal ejemplo :) ... o puedes pedirle ayuda de vez en cuando a nuestro querido amigo MathHelper, como yo :D



Conlusión
Hemos visto algo muy aburrido para mi gusto (... en verdad ¬¬ ). El uso de texto no es la gran cosa, pero seguramente saber esto nos resultará muy útil más adelante. Puedes descargar el código fuente:



Y esto es todo por ahora. Les prometo que la próxima, hacemos algo más entretenido. Vamos a comenzar a controlar el movimiento de un objeto que represente al jugador. Y luego podremos ver temas más emocionantes, como la detección de colisiones.

Tengo varios proyectos ya armados y funcionando, pero el problema es armar las Entradas del blog. Realmente me lleva mucho tiempo organizar, corregir y tratar de hacer todo lo más entendible posible. Pero cuando tenga listas las entradas, las subo.

¡Hasta entonces!


¡Sigue adelante, siempre!

miércoles, 25 de enero de 2012

Juego: Buscaminas en C#

"Sólo triunfa en el mundo quien se levanta y busca las circunstancias y las crea si no las encuentra."
George Bernard Shaw (1856 - 1950) - Escritor Irlandés.

Una captura del juego

Antes que nada...

Aviso: Cuando tenga más tiempo, voy a incluir el código fuente.

Saludos!

Les presento mi versión del buscaminas que realicé en el cursado de programación. Podría decirse que es mi primer juego, pero mentiría si digo que eso me convence. Aunque es muy humilde, sirve para dejar de hacer tareas y entretenerse un rato jaja!

Más tarde voy a compartir con ustedes el código fuente, que quizás les pueda ser útil. A aquellos que están estudiando programación en C# sólo les digo una cosa: ¡No vale copiar la tarea! ¡Jajaja!
 
¡Siéntanse libres de usarlo, gente! ¡No hay ningún problema! ¡Pero si el profesor los atrapa, no se olviden de darme el crédito ;) jaja. Pero por ahora les dejo el juego. Cuando tenga más tiempo, actualizo esta entrada con el código fuente.

¡Descarguen y disfruten!


¡Sigue adelante, siempre!

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!