lunes, 15 de noviembre de 2010

[eMeS] Website de Iredia

Ya está lista la página web de Iredia!

image

A través de esa página podrás obtener información general del juego y descargarlo para PC. Recuerdo que la versión para PC es totalmente gratis.

Cualquier comentario sobre el juego/feedback será bien recibido y me encargaré de escalarlo a las personas correspondientes. Espero que disfrutéis del juego y paséis un buen rato!

La dirección de la página es www.iredia.es . No olvidéis hacer una visita al sitio!

[eMeS] Iredia: Atram’s Secret ya a la venta!

Por fin, después de casi 9 meses de desarrollo ya está disponible en el bazar de XBOX360 el juego Iredia: Atram’s Secret. De este juego ya he hablado en algunos artículos de mi blog, pero por resumir se trata de lo siguiente:

  • Es el primero proyecto en el que participo que sale a la venta en una consola. Por lo cual estoy muy orgulloso Sonrisa
  • Es un juego educativo destinado a concienciar a los niños de entre 9 y 12 años sobre la sordera. A través de una historia sencilla, el jugador se introduce en un mundo imaginario en el que comprenderá las causas de la sordera y qué herramientas existen para favorecer la integración de las personas con sordera.
  • El guión del juego así como el propio juego ha recibido el premio honorífico FIVED’09 por “acercar los videojuegos a las personas por mejorar su calidad de vida”.
  • Recibimos un premio de Microsoft por ser los únicos concursantes de la ronda final de la Imagine Cup 2010 en la categoría de Game Design.

screen2

  • El juego forma parte de la iniciativa “El Mundo En Silencio”, impulsada por la Universidad Francisco de Vitoria a través del Centro de Innovación y Experimentación del Conocimiento (CEIEC).

El juego cuesta 80 Microsoft Points en el bazar de XBOX Live. La versión de PC, que saldrá próximamente, se podrá descargar gratis. Además el código fuente se liberará, de la misma manera que recuerdo que el juego está soportado por el motor Tomahawk Engine, el único engine en XNA libre y gratuito que además está desarrollado por españoles.

El equipo de eMeS estamos muy orgullosos de haber logrado el éxito del proyecto. Ahora, ellos seguirán trabajando en nuevos e interesantes proyectos que comentaré por estas páginas cuando llegue el momento.

Por último sólo me queda animaros a que os descarguéis el juego y lo disfrutéis, en especial aquellos que tenéis familiares pequeños o sois próximos a personas con sordera.

A todos, gracias.

miércoles, 10 de noviembre de 2010

[TEE10] TechED

Actualmente estoy pasando esta semana en Berlín, asistiendo al TechED. Para quien no lo sepa, el TechED es una conferencia que organiza Microsoft junto con sus partners para el sector profesional. Además, puedes conocer y conversar directamente con los speakers de las conferencias y comentarle todas tus opiniones sobre cualquier tema. Pronto colgaré algunas fotos y haré algún comentario sobre los temas que más me he interesado. Si alguien lee esto y está en el TechED, me puede encontrar en el Student Partner Lounge.

miércoles, 3 de noviembre de 2010

[.NET] Visual Studio Async CTP

En el último PDC hubo alguna agradable sorpresa en la presentación de las nuevas versiones del framework. Actualmente la industria se está especializando en trabajar para múltiples procesos y procesadores. Desde las consolas (XBOX, PS3, quién sabe si las nuevas portátiles…), PC’s, Tablets (cada vez es más reciente escuchar procesadores de doble núcleo para móviles…) y cualquier dispositivo. La programación paralela se convertirá en lo estándar en un tiempo, así que en la PDC se presento el framework Async que responde a estas necesidades.

Este framework supone una evolución frente al anterior e incluye las características de los servicios de Windows Communication Foundation (WCF) de un modo más extendido. Como se mostró en este artículo, una de las ventajas de usar servicios basados en WCF es que son totalmente asíncronos. Simplemente creo un manejador para el evento de finalizar el servicio y ya está. Cuando invoco al servicio, el hilo realiza la llamada pero no se dedica a ejecutar el código del servicio. Cuando el servicio termina de ejecutarse, se lanza el evento que es recogido por el manejador. De este modo liberamos el hilo principal de la aplicación de esta tarea, permitiendo que realice otras operaciones. ¿Interesante, verdad?

Pues esta funcionalidad hasta ahora concreta de WCF la extenderán a la futura versión de todo el framework. Antes para realizar este tipo de tareas había que crear el hilo, controlarlo y “matarlo”. O si queremos realizar alguna operación más compleja, hay que crear sistemas de control de la concurrencia como los semáforos.

Lo primero que han añadido es crear dos nuevas palabras reservadas:

   1: await,async;

Y la idea es invocar un método asíncrono con la palabra async, que devolverá una Tarea (Task, de .NET Framework 4.0). Y esta tarea nos devolverá el valor de retorno de la invocación. Veamos un ejemplo. Supongamos que disponemos del siguiente código:

   1: Gallery gallery = GalleryManager.LoadGallery("testGallery");

En este caso se invocaría el gestor de galerías y hasta que no estuviese cargado, el hilo se quedaría bloqueado hasta terminar la ejecución de dicha llamada. Esto podemos paralelizarlo del siguiente modo:

   1: Task<Gallery> taskGallery = GalleryManager.LoadGalleryAsync("testGallery");

Con la línea de arriba estamos indicando que vamos a esperar a que el método termine de forma asíncrona. Nótese que por convenio, los métodos asíncronos deben terminar con el sufijo “Async”. Para que esto funcione, debemos especificar los siguientes cambios en la declaración de la función:

   1: //Metodo antiguo
   2: Gallery LoadGallery(string galleryName)
   3: {
   4: ...
   5: }
   6:  
   7: //Nueva version asincrona
   8: async Task<Gallery> LoadGallery(string galleryName)
   9: {
  10:  
  11: }

Y luego aplicamos una conversión para transformar el resultado de la invocación anterior del método en el objeto en cuestión:

   1: Gallery gallery = await taskGallery;

O bien podemos usar los tipos anónimos para evitar esta conversión:

   1: var gallery = await GalleryManager.LoadGallery("testGallery");

Sencillo e intuitivo. Esto tiene mucho potencial.

martes, 2 de noviembre de 2010

[.NET] Isolated Storage

Tanto en aplicaciones SilverLight como en XNA 4.0 para Windows Phone 7, no se puede usar el espacio de nombres System.File.IO. La pregunta es simple: ¿cómo podemos acceder entonces a un fichero a través de estos sistemas? Pues a través de Isolated Storage.

El motivo es bien sencillo. Una aplicación SilverLight se ejecuta a través del cliente, por lo que por motivos de seguridad sería mejor impedirle cualquier tipo de acceso al sistema externo. En el caso de WP7 es bien distinto, ya que por la política de Microsoft se impide el acceso a la jerarquía de archivos del sistema. Las ventajas de usar un sistema como este son obvias por los siguientes aspectos:

  • Control del código descargado como complementos y la seguridad de que no escribirá en nuestro disco. Sólo se escribirá en el ámbito de la aplicación correspondiente.
  • Almacenamiento de componentes compartidos: Aquellos componentes que se comparten entre aplicaciones se pueden usar en Isolated Storage para garantizar el control de acceso a los datos.
  • Servidor de almacenamiento: Como el acceso a los recursos de Isolated se distribuye en función de los usuarios (más adelante lo explico) el servidor puede distinguir fácilmente entre los datos de los diferentes usuarios.
  • Almacenamiento móvil: Podemos almacenar información móvil del usuario fácilmente.

Evidentemente hay algunos casos donde NO se recomienda usar Isolated Storage:

  • No se debe usar para almacenar claves no encriptadas, valores secretos o contraseñas, ya que el sistema no está protegido contra código mal intencionado u otros usuarios del sistema.
  • Evidentemente,no lo uses para almacenar código!
  • Y tampoco lo uses para almacenar la configuración de la aplicación! Para ello ya dispones de los ConfigurationSettings.

En resumen, ¿qué es Isolated Storage? Pues es un sistema permite trabajar con un sistema virtual de ficheros. Sobre esta encapsulación, ya podemos trabajar con un flujo de datos como si estuviéramos en frente a un sistema real de ficheros. Veamos cómo se puede usar:

En primer lugar debemos incluir el espacio de nombres adecuado para emplear Isolated Storage:

   1: using System.IO;
   2: using System.IO.IsolatedStorage;

Luego vamos a instanciar una referencia al directorio de la aplicación que estamos usando:

   1: IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();

Podemos establecer referencias en función no sólo del ámbito de la aplicación, sino también a partir del usuario, del ensamblado. En este caso deseamos obtenerlo del ámbito de la aplicación, puesto que todo lo que hagamos irá en referencia exclusiva a ella.

Con la referencia podemos manejar Isolated Storage como un sistema de ficheros al uso. Supongamos que queremos comprobar si existe un directorio llamado “SavedGames” y si no existe, lo creamos:

   1: if ( !isf.DirectoryExists("SavedGames") )
   2: {
   3:     isf.CreateDirectory("SavedGames");
   4: }

Con esto se puede crear todo el árbol de directorios. El puntero a la referencia del sistema de ficheros incluye métodos para comprobar ficheros, directorios (como el ejemplo anterior), crear ficheros, crear directorios, borrar y abrir ficheros. Ahora, una vez que seguro tenemos nuestro directorio creado, vamos a almacenar la partida. Para ello primero creamos el fichero para almacenarlo en Isolated Storage y creamos un flujo de datos, como si de un “fichero físico” se tratase:

   1: IsolatedStorageFileStream isfs = new IsolatedStorageFileStream("game.txt",FileMode.Create, isf);
   2: using (StreamWriter writer = new StreamWriter(isfs))
   3: {
   4: ...
   5: }
   6: isfs.Close();

Esto se puede extrapolar a cualquier tipo de fichero que queramos. Además, las operaciones de cargar datos o tratamiento de ficheros son exactamente iguales que en el caso normal.