Ejemplo XNA parte 8 – Implementado la acción disparar del Jugador

Ya se puede observar el progreso de nuestro juego ejemplo. Ya cuenta con elementos animados como la nave y los enemigos, un fondo que le da una profundidad y una sensación de mayor movimiento en el entorno. Por los momentos, la única forma de destruir los enemigos es estrellando la nave contra ellos. Es hora de equipar la nave con un arma para disparar proyectiles contra las minas explosivas.

Comienza agregando una nueva clase llamada Projectile.cs; y elimina las declaraciones using que trae por defecto, y agrega las siguientes:

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

Ya que estaremos trabajando con clases y metodos del framework XNA. Ahora prosigue a agregar los siguientes atributos de la clase Projectile. En los comentarios observa la importancia de cada atributo.

// Imagen del proyectil
public Texture2D Texture;

// Posicion del proyectil
public Vector2 Position;

// Estado del proyectil
public bool Active;

// Cantidad de daño del proyectil
public int Damage;

// Limite visible del juego
Viewport viewport;

// Ancho del proyectil
public int Width
{
	get { return Texture.Width; }
}

// Alto del proyectil
public int Height
{
	get { return Texture.Height; }
}

// Velocidad de desplazamiento
float projectileMoveSpeed;

Ahora agreguemoe el metodo Initialize para inicializar las propiedades de la clase. Observa que le llegan tres parametros, el viewport que son las dimensiones de la escena del juego, la textura del proyectil que en nuestro caso es un rayo laser azul, y por ultimo la posicion inicial del proyectil.

public void Initialize(Viewport viewport, 
	Texture2D texture, Vector2 position)
{
	Texture = texture;
	Position = position;
	this.viewport = viewport;
	Active = true;
	Damage = 2;
	projectileMoveSpeed = 20f;
}

Como la idea de los proyectiles es que viajen de izquierda a derecha contra las minas enemigas, en el método Update evidentemente debemos incrementar la posición con respecto al eje X de acuerdo a la velocidad establecida en el método Initialize (proyectileMoveSpeed = 20f). Por último verificamos si el proyectil se ha salido de la escena para desactivar su despliegue, con el propósito de evitar desplegar imágenes que no podremos visualizar en la escena.

public void Update()
{
	// Projectiles always move to the right
	Position.X += projectileMoveSpeed;
	// Deactivate the bullet if it goes out of screen
	if (Position.X + Texture.Width / 2 > viewport.Width)
	Active = false;
}

Finalmente para esta clase, agregamos el método Draw para visualizar un proyectil en la pantalla.

public void Draw(SpriteBatch spriteBatch)
{
	spriteBatch.Draw(Texture, Position, null, Color.White, 0f,
	new Vector2(Width / 2, Height / 2), 1f, SpriteEffects.None, 0f);
}

Ya con nuestra nueva clase Projectile lista, proseguimos a hacer unas modificaciones en la clase principal.

En la Clase Game1

Comenzamos declarando los siguientes atributos.

// Textura de un proyectil
Texture2D projectileTexture;
// Lista de proyectiles
List <Projectile>projectiles;
// Tasa de proyectiles a disparar
TimeSpan fireTime;
// Tiempo de disparo anterior
TimeSpan previousFireTime;

Nota que agregamos una lista de proyectiles. Hacemos esto porque planeamos desplegar múltiples proyectiles disparados por la nave, por ende esta estructura de dato dinámica es ideal para llevar control de cada proyectil en escena en todo momento. fireTime nos dice en cada cuanto intervalo de tiempo el jugador disparará un proyectil en escena, ya verás cómo eso funciona más adelante. En el método Initialize, al final, agrega las siguientes instrucciones:

projectiles = new List<Proyectile>();
// Un laser se dispara cada cuarto de segundo
fireTime = TimeSpan.FromSeconds(.15f);

Observas el valor de fireTime? Esto quiere decir que la nave disparará 4 láseres por segundo. Ahora, En el LoadContent, al final del método, proseguimos a cargar la textura del láser, con la siguiente instrucción.

projectileTexture = Content.Load<Texture2D>("laser");

Como cuando trabajamos con el despliegue de enemigos, debemos agregar un método para AddProjectile, para instanciar y agregar nuevos proyectiles en la lista, inicializándolos con el viewport, su textura y su posición inicial.

private void AddProjectile(Vector2 position)
{
	Projectile projectile = new Projectile(); 
	projectile.Initialize(GraphicsDevice.Viewport,
	projectileTexture,position); 
	projectiles.Add(projectile);
}

Ahora debemos buscar donde invocar este método. Ya que el jugador es el único elemento que estará disparando rayos láser, tiene sentido ir al método UpdatePlayer, y agregar las siguientes instrucciones al final:

// Disparar bajo el valor de fireTime
if (gameTime.TotalGameTime - previousFireTime > fireTime)
{
	// Reiniciamos nuestro tiempo actual
	previousFireTime = gameTime.TotalGameTime;
	// Agregamos el proyectil al frente de la nave
	AddProjectile(player.Position + new Vector2(player.Width / 2, 0));
}

Aquí estamos agregando nuevos proyectiles en la cola, y disparando a la tasa del valor de fireTime. Ahora necesitamos actualizar las posiciones de cada proyectil en la escena. Como ya hicimos antes con los enemigos, debemos agregar un nuevo método llamado UpdateProjectiles y se verá de la siguiente manera:

private void UpdateProjectiles()
{
	// Actualizar los Proyectiles
	for (int i = projectiles.Count - 1; i >= 0; i--) 
	{
		projectiles[i].Update();
		if (projectiles[i].Active == false)
		{
			projectiles.RemoveAt(i);
		} 
	}
}

Observa que se invoca el método Update por cada proyectil en la escena, donde estos se desplazarán de izquierda a derecha a una velocidad uniforme, y cuando Active se encuentre en false, son removidos de la lista de proyectiles. En cuanto al método Update, proseguimos a invocar UpdateProjectiles al final:

// Actualizar proyectiles
UpdateProjectiles();

Hasta este punto los proyectiles se dibujan, se mueven, pero no colisionan con los enemigos. Dirígete al método UpdateCollision y agrega las siguientes intrucciones al final:

// Colision entre Proyectiles vs Enemigos
for (int i = 0; i < projectiles.Count; i++)
{
	for (int j = 0; j < enemies.Count; j++)
	{
		// Creamos los rectangulos para validar si hay colision
		rectangle1 = new Rectangle(
			(int)projectiles[i].Position.X - 
			projectiles[i].Width / 2,
			(int)projectiles[i].Position.Y - 
			projectiles[i].Height / 2,
			projectiles[i].Width, 
			projectiles[i].Height);

		rectangle2 = new Rectangle(
			(int)enemies[j].Position.X - 
			enemies[j].Width / 2,
			(int)enemies[j].Position.Y - 
			enemies[j].Height / 2,
			enemies[j].Width, 
			enemies[j].Height);

		// Determinamos si se intersectan
		if (rectangle1.Intersects(rectangle2))
		{
			enemies[j].Health -= projectiles[i].Damage;
			projectiles[i].Active = false;
		}
	}
}

Entiendes la lógica? Simplemente se está creando un rectángulo por cada proyectil, y se crea un rectángulo por cada enemigo visible en esa iteración (para capturar su posición en ese instante de tiempo). Luego se verifica si algún rectángulo enemigo se intersecta con el rectángulo del proyectil, y en caso afirmativo, se le resta vida al enemigo colisionado, y se desactiva el proyectil para que sea removido de la lista.

Finalmente, implementamos la logica para desplegar los proyectiles en escena. Vamos al metodo Draw, y debajo de Jugador.Draw(), inserta las siguientes instrucciones:

for (int i = 0; i < projectiles.Count; i++)
{
	projectiles[i].Draw(spriteBatch);
}

Al ejecutar nuestro juego se vera algo así:

Observa la colisión de los proyectiles contra los enemigos, pero veras que solo desaparecen cuando son destruidos. En la siguiente parte de este juego ejemplo haremos que las minas muestren un efecto de explosión cuando son destruidas por el jugador. Si estas teniendo problemas armando la solución, puedes descargarte el proyecto haciendo clic en el siguiente enlace:

Proyecto Shooter Parte 8

Interacción en XNA para Windows Phone: Capturas usando TouchCollection

A pesar de la comodidad que nos brinda el framework XNA para reconocer gestos de manera sencilla, a veces podemos encontrarnos en la situación que queremos tener mas control sobre el manejo de eventos en la pantalla táctil del teléfono. Es por esto que existe otra forma de realizar captura de datos de la pantalla por parte del usuario. Hagamos un ejemplo para que veas este camino de interactividad con la pantalla táctil de un Windows Phone.

Ejemplo de captura de eventos táctiles

Abre Visual Studio 2010, y crea un proyecto Windows Phone Game (4.0), nómbralo «TouchXNA». Ahora para este proyecto, implementaremos una lógica para desplegar una imagen donde el usuario este «tocando» la pantalla, y además muestre las coordenadas y el ID del punto detectado.

Ahora busca cualquier imagen que deseas que no pase los 80×80 pixeles, y descárgala. En este ejemplo se usará la siguiente imagen del planeta marte.

Preparando el Content

Ahora dale clic-derecho sobre el Content del proyecto, y selecciona «agregar->ítem existente» y busca la imagen que deseas agregar. Ahora agrega un nuevo ítem en el Content, pero esta vez tipo «Sprite Font», y nómbralo «SpriteFont1»

Implementando la lógica

Regresa a la clase Game1.cs, en la región de la declaración de los atributos, agrega lo siguiente justo debajo de la línea «SpriteBatch spriteBatch;«:

SpriteFont spriteFont;
TouchCollection touchCollection;
Texture2D planetaTextura;
Vector2 planetaPosicion;
Vector2 textoPosicion;

Usaremos el spriteFont para el formato del string que imprimiremos la información del punto de contacto encontrado. planetaTextura resguarda la textura de la imagen que deseamos desplegar en el punto de contacto. planetaPosicion se utilizará para designar la posición donde queremos desplegar planetaTextura. touchCollection es de tipo TouchCollection, y funciona como una lista que almacena los puntos de contacto detectados en cada instante de tiempo.

Dirígete al método LoadContent para cargar la fuente y la textura que habíamos agregado previamente a nuestro Content del proyecto:

protected override void LoadContent()
{
	spriteBatch = new SpriteBatch(GraphicsDevice);
	planetaTextura = Content.Load<Texture2D>("planet-mars");
	spriteFont = Content.Load("SpriteFont1");
}

Ya con nuestro contenido cargado a nuestra aplicación, proseguimos a realizar el proceso de detección de puntos de contacto por parte del usuario, donde asignaremos la posición del planeta y del texto a desplegar en la pantalla. Esto se realiza en el método Update:

protected override void Update(GameTime gameTime)
{
	if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
		this.Exit();

	touchCollection = TouchPanel.GetState();
	if(touchCollection.Count >= 1){
		planetaPosicion.X = touchCollection[0].Position.X - planetaTextura.Width / 2;
		planetaPosicion.Y = touchCollection[0].Position.Y - planetaTextura.Height / 2;
		textoPosicion.X = touchCollection[0].Position.X + 35;
		textoPosicion.Y = touchCollection[0].Position.Y + 10;
	}
	base.Update(gameTime);
}

Puedes observar que a planetaPosicion le asignamos la posición del punto encontrado, restándole la mitad del ancho y alto para los ejes X e Y. Si no hacemos esto, donde nosotros toquemos la pantalla, la imagen se mostrará pero no centrada en el punto. Esto es porque la posición de  una imagen es con respecto a la esquina izquierda superior. Esto se puede ajustar sencillamente restándole la mitad del ancho y alto de la imagen a la posición del punto de contacto.

Ahora, en cuanto al método Draw, agrega las siguientes líneas de instrucciones:

protected override void Draw(GameTime gameTime)
{
	GraphicsDevice.Clear(Color.CornflowerBlue);
	spriteBatch.Begin();
	foreach (TouchLocation touch in touchCollection)
	{
		spriteBatch.Draw(planetaTextura, planetaPosicion, Color.White);
		spriteBatch.DrawString(spriteFont, 
			"ID: " + touch.Id.ToString() + " (" + (int)touch.Position.X +
			"," + (int)touch.Position.Y + ")", textoPosicion, Color.White);
	}
	spriteBatch.End();
	base.Draw(gameTime);
}

Ahora es momento de compilar y ejecutar tu aplicación. Si todo funciona correctamente, veras el emulador de Windows Phone con tu aplicación ejecutándose, y cuando hagas clic en la pantalla y arrastres el cursor, veras la imagen moviéndose junto a su mouse. A continuación una captura de la aplicación:

Sencillo, no crees? Unas cuantas líneas de código y puedes conseguir los puntos de contacto detectados en la pantalla táctil del Windows Phone. Si tu proyecto presenta errores de compilación, puedes descargarte el ejemplo:

Proyecto TouchXNA

Interacción en XNA para Windows Phone: Reconocimiento de Gestos

XNA posee funcionalidades innatas para reconocer los gestos más comunes con los que interactuamos normalmente con cualquier dispositivo móvil en la actualidad. Simplemente se debe habilitar el reconocimiento de gestos, y así el juego tendrá la capacidad de interpretar cualquier tipo de gesto realizado por parte del usuario. Los gestos más comunes se muestran en el siguiente diagrama.

Un Tap es el gesto cuando le damos un toque rápido en algún punto de la pantalla. Double Tap son dos toques consecutivos en un mismo punto, como hacer un doble clic. El Pinch y Stretch son el típico gesto que conocemos para hacer zoom-in y zoom-out en una foto o una imagen. El gesto Pan ocurre cuando deseamos trasladarnos por un scrollbar, o navegar por un mapa o imagen. Flick es un toque rápido con alguna dirección, lo que causa una especie de inercia a algún elemento que estemos trasladando.

A continuación implementaremos un ejemplo sencillo de reconocimiento de gestos utilizando el Framework XNA para Windows Phone.

Ejemplo de Reconocimiento de Gestos

Crea un proyecto Windows Phone Game (4.0), y nómbralo «GestosXNA», selecciona versión del sistema operativo 7.1. Haz un clic-derecho sobre el Content del proyecto, y agrega un nuevo Ítem de tipo «Sprite Font», y nómbralo «SpriteFont1».

En la clase Game1.cs, después de la declaración del atributo SpriteBatch spriteBatch; agrega los siguientes atributos:

SpriteFont spriteFont;
String message = "Realiza un gesto";
Vector2 messagePos = Vector2.Zero;
Color color = Color.Black;

Ahora, en el método Initialize, y agrega la siguiente instrucción antes de la línea base.Initialize(); y agrega lo siguiente:

TouchPanel.EnabledGestures = GestureType.Tap | GestureType.DoubleTap | 
                        GestureType.Hold | GestureType.HorizontalDrag | 
                        GestureType.VerticalDrag | GestureType.FreeDrag | 
                        GestureType.DragComplete | GestureType.Pinch | 
                        GestureType.PinchComplete | GestureType.Flick;

De esta forma, estamos habilitando cuales gestos deseamos que nuestra aplicación sea capaz de reconocer en tiempo de ejecución. En el método LoadContent, cargaremos la fuente agregada del Content, de esta manera:

protected override void LoadContent()
{
	spriteBatch = new SpriteBatch(GraphicsDevice);
	spriteFont = Content.Load<Texture2D>("SpriteFont1");
}

Ahora, en el método Update es donde en cada ciclo del Game Loop, el juego realizara una captura del estado de la pantalla táctil, registrando gestos realizados por el usuario, y los irá reconociendo en tiempo real. El método completo está implementado de la siguiente forma:

if (TouchPanel.IsGestureAvailable)
{
	GestureSample gesture = TouchPanel.ReadGesture();
	switch (gesture.GestureType)
	{
		case GestureType.Tap:
			message = "Tap";
			color = Color.Red;
			break;
		case GestureType.DoubleTap:
			message = "Doble Tap";
			color = Color.Orange;
			break;
		case GestureType.Hold:
			message = "Hold";
			color = Color.Yellow;
			break;
		case GestureType.HorizontalDrag:
			message = "Arrastre horizontal";
			color = Color.Blue;
			break;
		case GestureType.VerticalDrag:
			message = "Arrastre vertical";
			color = Color.Indigo;
			break;
		case GestureType.FreeDrag:
			message = "Arrastre libre";
			color = Color.Green;
			break;
		case GestureType.DragComplete:
			message = "Gesto arrastre completado";
			color = Color.Gold;
			break;
		case GestureType.Flick:
			message = "Flick";
			color = Color.Violet;
			break;
		case GestureType.Pinch:
			message = "Pinch";
			color = Color.Violet;
			break;
		case GestureType.PinchComplete:
			message = "Gesto pinch completado";
			color = Color.Silver;
			break;
	}
	messagePos = gesture.Position;
}

Primero se verifica si el TouchPanel tiene el reconocimiento de gestos habilitados. Luego TouchPanel.ReadGesture() devuelve un GestureSample en cada ciclo del GameLoop, que es analizado en el switch(gesture), y se detendrá en el caso correspondiente al gesto reconocido, cambiando el valor del string message, informando el gesto detectado, y finalmente, se le asigna la posición del mensaje donde ocurrió el gesto analizado.

En el método Draw, proseguimos a dibujar nuestro string:

protected override void Draw(GameTime gameTime)
{
	GraphicsDevice.Clear(Color.CornflowerBlue);
	spriteBatch.Begin();
	spriteBatch.DrawString(spriteFont, message, messagePos, color);
	spriteBatch.End();
	base.Draw(gameTime);
}

Listo! Ahora compila la solución y si todo esta correctamente codificado, veras la siguiente pantalla:

Ya con la aplicación ejecutándose en el emulador Windows Phone, realiza gestos utilizando tu mouse y verás que son reconocidos por nuestra aplicación, mostrando un mensaje sobre el gesto detectado, y en la posición donde ocurrió.

Desafortunadamente no podrás realizar gestos multitouch como el Pinch; para eso necesitarías hacer deploy del proyecto a un teléfono físico. Sin embargo, puedes realizar cualquier otro gesto habilitado. Experimenta y realiza todos los gestos disponibles.

Si tu proyecto presenta errores de compilación, puedes descargarte el ejemplo:

Proyecto GestosXNA

Ejemplo XNA parte 1 – Creacion del Proyecto XNA

Vamos a crear un juego completo sencillo desde cero.

Dinámica del juego

Haremos un juego 2D, donde el usuario controlará una aeronave que dispara rayos laser para detonar minas que se le presentan en su camino, evitando que colisione contra ellas. El diagrama a seguir será el siguiente:

Se puede ver un tanto complicado, pero verás que armándolo paso a paso será sencillo.  Es siempre una buena practica diagramar el juego que estés diseñando, a modo que tengas una vista general de lo que quieres crear de manera modular y organizada. Puedes ver los diversos estados en el que se encuentra tu aplicación, como Menú Principal, Fase «Juego» y toda la lógica que conlleva esa fase, como el chequeo de input, actualización de posición de los elementos del juego como los enemigos, proyectiles, etc.; hasta la fase de fin de juego, q te llevara de regreso al menú principal.

En este capitulo de construcción del juego, nos enfocaremos en la fase de «Juego», donde manejaremos despliegue de elementos animados (el jugador, enemigos, proyectiles, explosiones), una técnica para el fondo, dando sensación de profundidad, efectos de sonido, puntaje y colisiones. A continuación te muestro un snapshot de como quedara el juego al final.

Sin más preámbulo, prepárate para la implementación de nuestro juego.

Comencemos a implementar nuestro juego

Abre Visual Studio 2010, y crea un proyecto XNA para Windows PC, y nómbralo «Shooter».

Material Requerido

Vamos a necesitar el siguiente contenido gráfico para nuestro content.

Material Shooter

Crea una carpeta «Imágenes», «Fuente» y «Audio» en la sección Content, y agrega el contenido descargado en las carpetas agregadas correspondientes. También descarga la clase Animación (link) para animar los elementos descargados, y agrégalo a tu proyecto.

Agregar el Material al Proyecto

En la sección Content del proyecto, agrega tres carpetas nombradas «Imagenes», «Fuente» y «Sonidos». Ahora prosigue a agregar el material descargado previamente en las carpetas correspondientes. En la sección de código del proyecto, agrega la Clase “Animation”, que la usaremos después. Asegúrate que el Namespace de esa clase sea la misma a como nombraste el proyecto («Shooter»).

Una vez haya agregado todo el contenido necesario para nuestro juego, la estructura del proyecto debe quedar de la siguiente forma:

Ahora prosigue a compilar tu solución y ejecútalo. Si todo funciona bien, te debería desplegar una ventana con un gran panel azul.

Hasta este punto hemos preparado nuestro proyecto con todo el material audiovisual necesario para implementar nuestro juego. Si deseas descargarte la fase final de este tutorial, simplemente da click al proyecto:

Proyecto Shooter Parte 1

Despliegues de Sprites en 2D

Bien, ya visto en articulos anteriores todo el basamento teórico de como funciona el Framework XNA, las versiones que han salido desde su lanzamiento en el 2007, el soporte para las diversas plataformas de Microsoft (Windows PC, Xbox 360 y Windows Phone), el funcionamiento de XNA y por último, la estructura de un proyecto de un Windows Game XNA en Visual Studio, es hora que empecemos a codificar y dibujar elementos.

Paso 1. Crear el proyecto

Debes abrir Visual Studio 2010 con XNA Game Studio 4 previamente instalado, y crear un proyecto Windows Game (4) como se mostró en el artículo anterior.

Paso 2. Agregar una imagen a nuestro Content

Ahora debemos agregar una carpeta en el Content donde colocaremos nuestras imágenes. No es requerido crear un directorio, pero lo recomiendo para mantener nuestro contenido gráfico organizado. Simplemente da un clic-derecho en tu proyecto Content, le das clic a agregar->nueva carpeta, y lo nombraremos «Imagenes».

Para agregar una imagen (que la pueden encontrar aqui para descargar), dale clic-derecho a la carpeta «Imagenes» ya creada, luego clic en agregar->item existente. Te saldrá un explorador de archivos, para que busques el archivo de imagen que deseas agregar a tu proyecto. Selecciona la imagen que descargaste previamente (smiley.png), y le das clic a «Agregar»).

Paso 3. Dibujar el sprite en la Escena

Ya que tenemos nuestra imagen en el Content de nuestro proyecto, debemos cargarla y desplegarla escribiendo código. Lógicamente para desplegar esta imagen, dependemos lógicamente de dos cosas: Posición y Textura. Para eso, agrega las siguientes dos variables dentro de tu clase principal (Game1), debajo de spriteBatch. El código se vería de la siguiente manera:

Vector2 es un tipo de datos que posee dos campos float x,y; a modo de trabajar con coordenadas de dos dimensiones. Ininializa posicion en el método Initialize:

Ahora procedemos a cargar la imagen a nuestro juego. Esto se hace en el método LoadContent. El código quedaría así:

Puedes observar que se instancia la variable spriteBatch (el cual puedes verlo por los momentos como el pincel encargado de pintar todos los elementos en la escena de nuestro juego). También observa como se carga una textura2D con el método Load. Toma en cuenta el string que pasamos como parámetro; es la ruta del elemento que queremos cargar. Por esto, es importante colocar en qué directorio se encuentra si esta organizado de esta manera.

Paso 4. Desplegar nuestro sprite en la escena

Recapitulando, hemos agregado nuestra imagen archivo al contenido de nuestro proyecto; hemos agregado una variable para la posición donde desplegaremos nuestro sprite, y declaramos una variable Texture2D, donde realizamos la carga de nuestra imagen del contenido a la aplicación. Ahora, sin más preámbulos, dibujemos nuestro sprite. Esto se implementa en el método Draw.

Para pintar nuestro sprite, debemos utilizar nuestra variables spriteBatch, ya que este es el encargado de dibujar los elementos en la escena como ya mencione a priori. Todos los elementos que vayamos a dibujar se hacen mediante su método Draw(), y estos deben estar encerrados dentro de los métodos spriteBatch.Begin() y spriteBatch.End(). Muy importante estos dos métodos, porque estamos avisando a nuestra aplicación que vamos a pintar elementos, y cuando terminemos, invocamos el método End(). En nuestro caso, nuestro código se vera así:

Fíjate el método spriteBatch.Draw(). Solo estamos pasando la textura que deseamos desplegar, la posición, y el color que queremos que sea desplegado. Si colocamos Blanco, se mostraran los colores originales de la imagen. Cualquier otro color modificara los colores de nuestro sprite.

Finalmente, al ejecutar nuestra aplicación, tendrás un resultado como este:

Sencillo, no crees? Esta es la manera mas elemental para desplegar un sprite en nuestro juego. El método Draw que utilizamos es el mas básico disponible, ya que este método cuenta con 7 formas distintas de invocar con diversos parámetros, incluyendo efectos, manejo de rectángulos para dibujar ciertas áreas, etc. Para proyectos más complejos, se trabajan con clases donde encapsulan estas propiedades (textura, posición), y se le agregan mas propiedades para ser mas flexibles ante transformaciones y efectos.

Estructura de un proyecto XNA

Para crear un proyecto XNA, debemos abrir Visual Studio 2010 con el XNA Game Studio 4.0 previamente instalado. Da un clic en Archivo, Nuevo Proyecto, y ve a la categoría de plantillas «XNA Game Studio», y selecciona la plantilla Windows Game (4.0). Escribe el nombre de proyecto deseado y le das click en  aceptar.

Una vez creado el proyecto, verás la clase principal del proyecto que por defecto se llama Game1. En el Solution Explorer, veras la siguiente estructura de carpetas.

Proyecto WindowsGame1

En esta sección de la solución es donde se desarrolla toda la lógica del juego. La clase principal es la llamada Class1, donde se encuentra bien definidos los métodos principales a implementar acorde al funcionamiento del framework XNA. Existe otra clase estática llamada Program.cs, donde aquí en realidad es el que invoca la Clase1 para ejecutarla; sin embargo, tu labor es implementar tu juego es en la clase Class1.

También veras un archivo llamado «Game.ico», donde este es un pequeño icono de 32×32 pixeles que se coloca en la esquina superior izquierda de la ventana de nuestro juego al momento de ejecutar nuestra aplicación. Este icono también se mostrara si lo anclas a la barra de inicio.

Entre otros elementos dentro de este proyecto, se encuentra el directorio “Properties”, donde se encuentra el archivo “AssemblyInfo.cs”, que es el archivo configuración de ensamblado de nuestro proyecto. Al abrirlo, veras que contiene toda la información acerca de la versión de la aplicación, el Titulo del juego, producto, descripción, año, etc. También se encuentra el directorio «References», donde en esta se encuentra referencias a las librerías fundamentales requeridas para el funcionamiento de este proyecto. Si deseas trabajar con librerías externas encontradas en la web (Como trabajar con el Kinect, o librerias de físicas, etc.), con descargarlas y hacerles referencia, ya se encuentran disponibles para utilizarlas en tu juego.

En este punto, te sugiero que trabajes con directorios de clases, a modo de trabajar un proyecto de manera organizada por grandes módulos esenciales, como física, sonido, gráficos, interacción entrada/salida, etc.

Proyecto WindowsGame1Content

Para este proyecto de tipo Windows Game Library (4.0) que se genera automáticamente en la solución al momento que se crea un Windows Game (4.0), es donde se coloca todo el contenido gráfico audiovisual del juego. Se recomienda que organices el contenido en directorios, para imágenes, archivos de configuración, sonidos, videos, música de fondo, etc. Esta sección ya se encuentra referenciada por el proyecto principal (que se puede ver dentro del directorio «Content References»).

Diseña un sitio como este con WordPress.com
Comenzar