martes, 30 de marzo de 2010

Desarrollo de un cuego 2D con XNA III - Proyecto en blanco

Ok, estimados luego de una pausa debida a contratiempos con terremotos y otras tragedias de por medio(como entrar a clases y tener que trabajar) he vuelto.

En este post veremos el esqueleto que nos entrega Visual Studio cuando creamos un proyecto de tipo "Windows Game (3.1)".

Primero, veremos que carpetas y archivos crea:

Bien pues, aquí tenemos, sin haber escrito una sola línea de código, solo indicando el tipo de proyecto que deseamos crear, esta estructura.

Tenemos en References, entre otras, las referencias a las dlls de XNA

Microsoft.Xna.Framework Microsoft.Xna.Framework.Game
Son los espacios de nombre esenciales de XNA, déjenlas tal cual por ahora.

Luego tenemos la carpeta content donde tenemos las dlls que refieren a los Pipelines, que estudiaremos mas adelante pero por lo pronto podemos decir que son los que nos permiten manejar distintos tipos de contenido que podremos agregar a esta carpeta.

Como podrán suponer por los nombres de las dlls, algunos de estos pipelines nos permitirán operar con audio, video, texturas, etc.

Luego tenemos el Game.Ico que es el ícono de nuestro programa.

Y luego tenemos 2 clases que son la médula de nuestro humilde primer proyecto en blanco:

Program.cs
Game1.cs

Program.cs es nuestra clase de entrada al juego, lo primero en ejecutarse.

En su código que incluyo aquí verán en el método Main() que lo único que hace es instanciar la clase Game1 y luego ejecuta el método Run() de la clase Game1.



   1:  using System;
   2:   
   3:  namespace JuegoXNADemo1
   4:  {
   5:      static class Program
   6:      {
   7:          /// <summary>
   8:          /// The main entry point for the application.
   9:          /// </summary>
  10:          static void Main(string[] args)
  11:          {
  12:              using (Game1 game = new Game1())
  13:              {
  14:                  game.Run();
  15:              }
  16:          }
  17:      }
  18:  }
  19:   


A continuación el contenido de la clase Game1



   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using Microsoft.Xna.Framework;
   5:  using Microsoft.Xna.Framework.Audio;
   6:  using Microsoft.Xna.Framework.Content;
   7:  using Microsoft.Xna.Framework.GamerServices;
   8:  using Microsoft.Xna.Framework.Graphics;
   9:  using Microsoft.Xna.Framework.Input;
  10:  using Microsoft.Xna.Framework.Media;
  11:  using Microsoft.Xna.Framework.Net;
  12:  using Microsoft.Xna.Framework.Storage;
  13:   
  14:  namespace JuegoXNADemo1
  15:  {
  16:   
  17:      public class Game1 : Microsoft.Xna.Framework.Game
  18:      {
  19:          GraphicsDeviceManager graphics;
  20:          SpriteBatch spriteBatch;
  21:   
  22:          public Game1()
  23:          {
  24:              graphics = new GraphicsDeviceManager(this);
  25:              Content.RootDirectory = "Content";
  26:          }
  27:   
  28:          /// <summary>
  29:          /// Allows the game to perform any initialization it needs to before starting to run.
  30:          /// This is where it can query for any required services and load any non-graphic
  31:          /// related content.  Calling base.Initialize will enumerate through any components
  32:          /// and initialize them as well.
  33:          /// </summary>
  34:          protected override void Initialize()
  35:          {
  36:              // TODO: Add your initialization logic here
  37:   
  38:              base.Initialize();
  39:          }
  40:   
  41:          /// <summary>
  42:          /// LoadContent will be called once per game and is the place to load
  43:          /// all of your content.
  44:          /// </summary>
  45:          protected override void LoadContent()
  46:          {
  47:              // Create a new SpriteBatch, which can be used to draw textures.
  48:              spriteBatch = new SpriteBatch(GraphicsDevice);
  49:   
  50:              // TODO: use this.Content to load your game content here
  51:          }
  52:   
  53:          /// <summary>
  54:          /// UnloadContent will be called once per game and is the place to unload
  55:          /// all content.
  56:          /// </summary>
  57:          protected override void UnloadContent()
  58:          {
  59:              // TODO: Unload any non ContentManager content here
  60:          }
  61:   
  62:          /// <summary>
  63:          /// Allows the game to run logic such as updating the world,
  64:          /// checking for collisions, gathering input, and playing audio.
  65:          /// </summary>
  66:          /// <param name="gameTime">Provides a snapshot of timing values.</param>
  67:          protected override void Update(GameTime gameTime)
  68:          {
  69:              // Allows the game to exit
  70:              if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
  71:                  this.Exit();
  72:              
  73:              // TODO: Add your update logic here
  74:   
  75:              base.Update(gameTime);
  76:          }
  77:   
  78:          /// <summary>
  79:          /// This is called when the game should draw itself.
  80:          /// </summary>
  81:          /// <param name="gameTime">Provides a snapshot of timing values.</param>
  82:          protected override void Draw(GameTime gameTime)
  83:          {
  84:              GraphicsDevice.Clear(Color.CornflowerBlue);
  85:   
  86:              // TODO: Add your drawing code here
  87:   
  88:              base.Draw(gameTime);
  89:          }
  90:      }
  91:  }


El contenido de la clase Game1, como puede apreciarse, no es tan escueto como el de la clase Program.

Si nos abstraemos de detalles podemos ver la clase Game1 como lo siguiente:


  1. Primero, Game1 es una clase que hereda del espacio de nombres Microsoft.Xna.Framework.Game(El que está en nuestra carpeta de referencias del proyecto).
  2. Game1 (Y todo juego Xna que desarrollemos) tiene, cuando menos, los métodos
  • Initialize()
  • LoadContent()
  • UnloadContent()
  • Update(GameTime gameTime)
  • Draw(GameTime gameTime)
Estos métodos incluidos en Game1 nos dan una idea del ciclo de vida de esta aplicación.

  • El primer método en ejecutarse es Initialize(), en este debiésemos inicializar nuestros dispositivos y configuraciones.
  • LoadContent() Vuelca el contenido que necesitemos(gráficos, audio, etc) sobre nuestros dispositivos dejándolos disponibles para suutilización en el loop del juego.
  • El "loop del juego" está compuesto por 2 loops asíncronos que son los llevados a cabo por los métodos Update(GameTime gameTime) y Draw(GameTime gameTime).
  • En el método Update(GameTime gameTime) debemos incorporar la lógica de nuestro juego, por ejemplo: controlar si un proyectil alcanza a un personaje, calcular la trayectoria y posición de un proyectil, analizar el nivel de vida, calcular puntajes, etc.
  • En el método Draw(GameTime gameTime), en función de la data calculada en el método Update(GameTime gameTime) debiésemos "dibujar" el estado actual del juego.
  • Finalmente, una vez terminado el loop del juego, ya sea por muerte del personaje o cualquier otra condición que determine este punto de término han de descargarse los contenidos en el método UnloadContent()
Este pequeño código entregado por el proyecto en blanco ya inicia el dispositivo gráfico y establece un fondo de pantalla de color azul(CornFlowerBlue para ser mas exacto).

Si les apetece, pueden ejecutar este proyecto y verán esta ventana.



Estamos de acuerdo, no es nada muy excitante, ni nos consume el vértigo, pero créalo o no, este es su primer juego en Xna.

Bueno, eso por hoy, ya estaremos de vuelta analizando mas a fondo los métodos de la clase game

Desde la terremoteada pero aperrada tierra de Chile les saluda.

Manuel Gatica Holtmann
.

PD: No puedo terminar el post sin agradecer a quien hizo http://www.manoli.net/csharpformat/ un excelente sitio para taggear codigo para incluir en blogspot y que es el sitio que utilicé en esta ocasión para poder mostrar el código de manera decente.

viernes, 19 de febrero de 2010

Programación de un juego 2D con XNA II

OK. en la entrega anterior les contaba de aquel juego un juego que desarrollé con Pascal en una 8086 hace como mil años.

Pues bien, para desarrollar aquel juego necesitaba que el bendito helicóptero se moviese por la pantalla.

mmmhhh...

Al final descubrí que tanto como "mover" un helicoptero por la pantalla no era posible. Al menos no con las herramientas que disponía(turbo 5 y ascii art). No obstante, era posible conseguir que el usuario se convenciera de estar viendo un helicóptero que se mueve. El truco es el mismo que se usaba en el cine: Superponer imágenes y aprovechar el retardo que tiene el cerebro para procesar las imágenes y dar al final la sensación de movimiento.

Entonces esto se reducía a:

  1. Limpiar pantalla
  2. Imprimir imagen 1
  3. Dar un retardo en milisegundos
  4. Limpiar pantalla
  5. Imprimir imagen 2
  6. Dar un retardo en milisegundos
  7. Limpiar pantalla
  8. Imprimir imagen 3
  9. Dar un retardo en milisegundos

Así sucesivamente.

Gracias hermanos Lumiere.

Para efectos de ejemplo, he escrito en C# una pequeña aplicación de consola que muestra un caracter moviendose de izquierda a derecha y viceversa.

El código es el siguiente:

Ejecutándolo, el resultado es el siguiente:



OK, estamos de acuerdo, hasta aquí, parece que de XNA no hemos visto cosa alguna, pero lo cierto es que hay elementos comunes.

En un juego 2D en XNA no moveremos un caracter, sino un objeto, por ejemplo: una imagen de un helicóptero. A estos objetos los llamaremos Sprites.

Para mover estos sprites tendremos que establecer su posición dentro de un plano.

Supongo que recordarán de sus ramos matemáticos el concepto:"Plano Cartesiano".

Para los que no, un plano cartesiano es un espacio de dos dimensiones donde es posible ubicar un punto con su coordenada en el eje vertical y el eje horizontal(X,Y o columna, fila).

Entonces, la posición de cada punto está definido por un par de números(par ordenado) .

A modo de ejmplo, aquí pongo un plano cartesiano:
Bien, según el plano del ejemplo, el punto A estaría en la posición (2,2), el B en la (5,5) y el C en la (4,-4).

Para ubicar ya sea un caracter o de aquí en adelante un sprite, usaremos tambien un sistema de coordenadas, solo que no estará basado en el centro de nuestra pantalla, sino que nuestro punto (0,0) estará en la esquina superior izquierda de nuestra pantalla. Entonces, mientras mas a la derecha queramos ubicar nuestro Sprite nuestro X del par ordenado debiese incrementarse y mientras mas abajo quisiésemos ubicarlo respecto de la esquina superior izquierda, mas debiésemos incrementar nuestro Y.

Entonces, si tuviésemos los siguientes puntos.

A=(0,0)
B=(10,1)
C=(10,5)

podríamos decir que el punto A está en la esquina superior izquierda, el punto B está 10 posiciones(píxeles en el caso de un sprite, caracteres en el caso de la aplicación de consola) mas a la derecha que el punto A y que el punto C está 4 posiciones mas abajo que el punto B.

Nuestro tope tanto hacia la derecha como hacia abajo estará determinado por la resolución de pantalla con la que estemos trabajando. Por ejemplo, cuando trabajaba con caracteres en Pascal, tenía un tope de 80 columnas contra 24 filas, pero con XNA podríamos estar trabajando con resoluciones de 320 pixeles en horizontal y 240 pixeles en vertical, o 640*480(640 pixeles horizontal, 480 vertical), 800*600 o los que estimen y sean soportados por la tarjeta de video y monitor.

Para establecer estas posiciones en XNA usaremos la clase Vector2.

Así como usé el Thread.Sleep para definir los milisegundos de espera antes de limpiar la pantalla y volver a imprimir, en XNa deberemos definir la cantidad de FPS(Frames Per Second) que indicarán cuantas veces por segundo ha de refescarse el contenido de la pantalla. A mayor FPS podríamos llegar a tener movimientos mas fluidos y detallados, pero esto podría ir en desmedro del desempeño por lo que habrá que ser cuidadoso en la definición de este parámetro.

Pero bueno, por hoy ya ha sido bastante.

Como siempre, saludos y espero que les haya sido útil.

Manuel Gatica Holtmann.

miércoles, 17 de febrero de 2010

Programación de un juego 2D con XNA I

Estando en 2º de enseñanza media, allá por el año 95(UF!) programé un par de juegos en Pascal. Nada muy complejo la verdad, consideremos que la programación de videojuegos no era algo que se enseñara en el colegio, no señor, eran solo aventuras personales en las que un par de amigos tan faltos de vida social y atractivo para el sexo opuesto como yo se embarcaba.

Ahí nos conseguíamos un IBM 25(el de la foto) y nos quedábamos despues de clase en el liceo con alguna fotocopia que hubiesemos conseguido sobre como crear TPU's con pascal o cosas similares, nuestros borradores de lo que habiamos avanzado en nuestros programas(porque primero programabamos a lapiz pues no habia un pc casa por medio) y nuestros disquetes de 3 y media pulgadas ojalá sin virus.

Aprovecho para mandarle un par de chuchadas al malnacido que hizo ese virus que colocaba la frase "You are here CPW!"(Info del virus) que me hizo perder tantas horas de pega y disquetes en aquel entonces. Aunque debo admitir que tambien tenía montón de ganas de hacer un virus(El que esté libre de pecado que tire la primera piedra).

Bueno, el punto es que entre los juegos que programé, uno de los mas divertidos era un shooter de un helicoptero que tenía que exterminar a la horda de extraterrestres(los trulululus... si, ya sé que el nombre era harto penca) que invadía la tierra.

La estructura del programa era algo así

Inicio del Juego
Inicialización de variables
Repetir
Determinar posiciones
Determinar posicion de helicoptero
Determinar posicion de naves enemigas
Determinar posicion de misiles del helicoptero
Determinar posición de misiles enemigos
Determinar Colisiones
Determinar si helicoptero choca con nave enemiga
Determinar si helicoptero es alcanzado por misil
Determinar si nave enemiga es alcanzada por misil
Dibujar
Dibujar Fondo
Dibujar Helicoptero
Dibujar Naves enemigas
Dibujar misiles
Lectura de dispositivos
Determinar si el usuario presionaba:
una flecha del teclado
la tecla de disparo
la tecla de abandono de juego
Determinar nuevas posiciones
de Helicoptero
de naves enemigas
de misiles
del fondo
Hasta que Helicoptero es destruido o usuario presiona tecla de salida


Bueno, lo anterior bien a grandes rasgos. Todo esto muy procedural, con Turbo pascal 5 y nada de orientación a objetos que no la enseñaban(menos mal, despues de todo es una materia un tanto abstracta para chicos de 15 años antes de internet).

Recuerdo que llegar a esa estructura me habrá tomado al menos unas 2 semanas de cabeceo.

Afortunadamente la cosa ahora va algo mas simple. Si abres ahora tu XNA studio y creas un nuevo proyecto del tipo Windows Game verás que este tiene una algunas estructuras en común con la que acabo de describir. A saber, cuando creas un proyecto de este tipo XNA crea automáticamente parte del código y en este la siguiente estructura:

Tenemos una clase principal que es Game1(), nuestro juego con todo lo que contiene y en este algunos métodos que se irán ejecutando en el transcurso del juego.

Tenemos, por ejemplo el Initialize() que es donde debiécemos establecer nuestros parámetros iniciales, el Update() que es donde debiesemos actualizar los valores de nuestras variables y status, asçi com tambien tenemos el método Draw() que es donde debiésemos "dibujar" lo que el usuario verá en este momento.

A propósito de dibujar. En aquel entonces los computadores a los que tenía acceso no tenían ni la velocidad de procesador que tenemos hoy,(recuerdo que el año 96 en una softel vi el primer computador de 100 MHZ y era caro como una casa... casi me oriné cuando corrieron un DIR de DOS y se demoró menos de un segundo en desplegar la información) ni tarjetas de video especializadas para videojuegos ni nada por el estilo por lo que el proceso de dibujar podía hacerse realmente lento. En mis primeros intentos usé la graph.tpu(una librería de pascal con herramientas para dibujar contenido en pantalla) y resultó asquerosamente lento por lo que finalmente opté por usar ascii art. Así teniamos un helicoptero mas o menos así:

----+---
+----/ \
=====

Sí, ríanse nomas. Era mejor dibujado, pero ya no me acuerdo de todos los caracteres ascii que usaba(había que aprenderse la tabla ascii de memoria o usar programas que ayudasen, como sidekick... que gran programa aquel). Aún así, esto iba mas allá, en cada ciclo de juego el helicoptero cambiaba con lo que daba la idea de algún grado de animación.

Ejemplo:
----+----
+----/ \
=====

--+--
x----/ \
=====

---+---
+----/ \
=====

Ja, ahora sí que han de estar riéndose a mandíbula batiente.

Créase o no, resultaba bastante efectivo.

Afortunadamente, en XNA no haremos esa bestialidad sino que usaremos otras características que nos permitirán mostrar figuras complejas con una gran facilidad y excelente desempeño.

Pero eso ya lo veremos en la próxima entrega.

Como siempre, saludos.

Manuel Gatica Holtmann

jueves, 14 de enero de 2010

Viva .NEXT

Algo de lo que se jacta la gente que gusta de las aplicaciones Open Source, GNU y gratuitas en general es, precisamente, de esa cualidad de gratuidad.

Siempre se asocia a Microsoft esa bestia capitalista que destruye el software y blah blah blah blah.

Sinceramente y pese a que con esto quizás pierda crédito ante todos ess "puristas informáticos" que hablan mal de microsoft(como si dejara de dormir porque un linuxero o un javero no me de pelota), debo decir que las aplicaciones microsoft me gustan. Y no es por una cosa a priori, porque la haya visto en un documental en history channel o algo así, sino que mi cariño por microsoft viene de la empiria.

Llevo alrededor de 10 años ganando dinero por saber usar herramientas microsoft(Desde instalar Windows, levantar un Active Directory, al desarrollo de aplicaciones de uso gubernamental sobre .NET). Ni Dios me ha provisto de comida como indirectamente lo ha hecho Bill Gates XD.

Llevo alrededor de 10 años consumiendo los canales de capacitación e información que Microsoft provee. Léase Technet, MSDN, Desarrollador 5 Estrellas, Microsoft Academy, etc. de forma gratuita.

En estos 10 años he aprendido lo bien que Microsoft hace las cosas. Esto, claro está es un juicio subjetivo, pero nace de la siguiente situación:

¿Alguien ha tenido alguna vez que configurar Eclipse para usar java, Ejb, Hibernate, MySQL para levantar un sitio con acceso a bases de datos sobre una arquitectura SOA?
¿Alguien ha tenido que instalar Visual Studio y Sql Server para levantar un sitio con acceso a bese de datos sobre una arquitectura SOA?
Si han visto ambas situaciones:¿Cual de los dos tipos pudo estar trabajando antes de mediodia?

En Microsoft, con un par de Next Next Next... y por si tienes dudas una vueltecita a MSDN, ya estás listo.

En Java, te descargas un componente, luego el otro...ah! depende de la versión...ah! documentación... claro, podemos ver javahispano o luego podemos ver(por si no está actualizado) el sitio del desarrollador del framework java que usemos(Struts, JBOSS, Hibernate.... etc)... algo falló... chucha... otro dia perdido.

Debo decir que me gusta la simpleza que Microsoft provee en ese sentido pues me deja el tiempo libre para:PROGRAMAR.

y si además de esa productividad añadimos que no debo pagar un peso por las herramientas, o por la actualizadísima y centralizada información, pues ¿Qué mejor?.

Pues bueno, en el escenario del desarrollo de juegos puedo desarrollar, con un entorno de desarrollo legalmente licenciado sin pagar un solo peso. BUENO Y GRATIS, COMO EL AIRE.

Para empezar a desarrollar un juego con las herramientas que microsoft provee, claro está, primero debo cumplir con algunos requisitos de hardware y sistema operativo, los que detallo a continuación:

Hardware

Cualquier pc actual sirve(PIV o superior) siempre y cuando tenga una tarjeta de video con Shadder 2.0 o superior, si no tienes, en el mercado se consguen por 35 USD aprox, mas o menos 15 lucas chilenas y ya estás listo.

sistemas Operativos Soportados

• Windows XP Home Edition
• Windows XP Professional Edition
• Windows XP Media Center Edition
• Windows XP Tablet Edition
• Windows Vista Home Basic Edition
• Windows Vista Home Premium Edition
• Windows Vista Business Edition
• Windows Vista Enterprise Edition

XP, con Service Pack 2 o superior

Entorno de desarrollo
  1. Visual C# Express GRATUITO
  2. XNA Game Studio Express GRATUITO
  3. DirectX 9 GRATUITO
Las herramientas de desarrollo necesarias son, como ya indiquñe: gratuitas y están disponibles para su descarga en la sección de downloads de Microsoft...Sí, chúpense esa javeros, todito en un solo sitio.

Hay que dejar en claro, eso si, que esto es gratuito para fines no comerciales. Si quieres, por ejemplo, explotar tu juego con fines de lucro debes pagar una suscripción al club de creadores.
En el FAQ del XNA Creators club posdemos encontrar lo siguiente:

¿Tengo que ser un miembro de XNA Creators Club para publicar mis juegos de Xbox LIVE Community Games? Sí. Deberá disponer de una suscripción a Creators Club para poder crear y publicar juegos para Xbox 360. Puede adquirir una suscripción especial a XNA Creators Club para Xbox 360 mediante el Bazar Xbox LIVE por 99 USD al año (o 49 USD para cuatro meses).

Bueno, mientras estamos desarrollando, en esta etapa inicial no hay que ponerse con nada mas que con las ganas así que aquí van los links para preparar nuestro entorno de desarrollo y par tener alguna noción de que haremos en nuestro próximo post:

Recursos en general del sitio XNA Creators Club

XNA Game Studio Express

Documentación MSDN sobre XNA

Visual C# Express Edition

DirectX 9 Runtime Web Installer

Introducción a desarrollador Novato Webcast en inglés

Eso por ahora, descarguen, den una ojeada al starter y nos estamos leyendo luego.

Saludos

MAGH

miércoles, 13 de enero de 2010

kick off


Nunca fuí muy bueno para el Kick Off.

A mis primos les duraban mucho mas sus 30 pesos en fichas que a mi jugando este bendito juego de futbol.

No obstante lo anterior, de pequeño, no siendo muy hábil pa la pelota, el volantín, el trompo y un largo etcétera de juegos que todo niño debiera manejar, la aparición de los juegos de video en mi barrio a principios de los años 80 fue un hecho de importancia casi vital.

Recuerdo, con apenas 6 años haber estado encaramado en un cajón de bebidas para ver la pantalla del space invaders y luego tratar ser diestro en gálaga y así todos los juegos con los que el bendito dueño del bazar llenaba de niños y jovenes el patio donde tenía puestas las tan novedosas y fantásticamente futuristas máquinas de video.

Este cariño y gusto por los videojuegos así como los mismos videojuegos, fué evolucionando. al punto que cuando tuve 12 años pedí de regalo un Atari 2600. Para mi sorpresa me llegó de regalo un computador Atari XE Game System, con su casetera y su pantallita azul, con su basic y ese sonido glorioseo de cuando uno digita en ese teclado.

Tanto me gustó el asunto que a los 13 años estaba metido en un politécnico estudiando una carrera relacionada con computación y a los 15 hice mi primer humilde y simple jueguito en pascal a punta de ingenio y ascii art.

Es curioso cuanto puede uno patear sus sueños, así como es curioso que los sueños nunca lo abandonan a uno.

Hoy, con treinta años, me encuentro terminando mi ingeniería en informática y empezando a preparar mi trabajo proyecto de título que he de presentar a fines del 2010. Este trabajo, no podía ser sino el pelear contra mi molino de viento: Desarrollar un juego como dios manda.

Y bueno, llevo algunos meses investigando que herramientas hay en el mercado para llevar a cabo esta quijotesca tarea y la verdad es que de todo lo que he visto, XNA, un framework provisto por Microsoft de forma gratuita para el desarrollo de juegos para plataforma PC y XBOX, es lo que mas me ha gustado.

En este blog y con este Post puntal, doy hoy el Kick Off a mi proyecto de desarrollo de juegos. Espero:
1 - Hacer un juego que me guste
2 - Hacer un juego que a mi hijo le guste
3 - Hacer un juego que a mis amigos le guste
4 - ah... si, tambien hay un fin práctico, dar un examen de título la raja.

Espero, de aqui a diciembre ir posteando los devenires de este desarrollo, las técnicas, los trucos, los materiales... en fin, todo cuanto pueda servir para que ustedes aprendan junto conmigo.

Bueno, eso por ahora.

Estoy con el pecho hinchado mientras estoy descargando el XNA Game Studio 3.1 desde esta
URL

Xna Game Studio 3.1

Otras herramientas están disponibles en el Sector de descargas del sitio de creadores de XNA

Por ahora saludos, ya estaremos en contacto.

-__-