A highly recommendable Windows Phone 7 game development book…

If you want to start, or become an expert on Windows Phone 7 game development using XNA, I´d highly recommend you to buy a.s.a.p the following book:

http://www.amazon.com/Professional-Windows-Phone-Game-Development/dp/0470922443

It´s written by two masters of XNA and fellow MVPs Chris Williams and George Clingerman, and they did a really really good job.

What are you waiting for? Go get it !!

Desarrollo de videojuegos para Windows Phone 7. Conferencia en Zaragoza

Este próximo miércoles día 30, estaré en Zaragoza dando una charla sobre Desarrollo de Videojuegos para Windows Phone 7. Podéis encontrar más detalles del evento aqui:

http://www.cpilosenlaces.com/site/pages/jornadas-tE9cnicas.php

Y descargar el PDF del mismo aqui: jornadas_tecnicas.pdf

Saludos!

Gravitards for Windows Phone 7

Today, Gravitards has been finally released for Windows Phone 7.

“Gravitards is a skill-based game with amazing graphics and real physics, where you have to drive a ball through many different levels, reaching the end zone (or “gravitard”), without dropping it, while collecting rings distributed all around. You´ll find obstacles, moving parts, force fields, guillotines, ramps, jumps, and even a pinball table to play with. Test yourself by controlling the ball with your device’s accelerometer, with on-screen buttons, or with the keyboard, and get the needed practice to complete all the levels.”

You can download Gravitards directly to your Windows Phone 7 using the following Zune link.

Some other videos and pictures:

 

 

Captura36

Captura38

Captura3

Hope you all like it!!!

3D-O-Matic. Is it feasible to make our favorite shows in 3D?

There has been several attempts to make cartoon TV shows in 3D, or look realistic. For instance, Simpsons’ first attempt looked something like this:

It was really fun, but didn’t actually capture the essence of Homer, which for me is nothing more than this:

Many artists have tried to do so since then, but honestly, they scared me more than make me laugh. Some amazing examples:

Pretty awesome, but they are stills mostly. Hard to animate that. Recently though, I have discovered other examples that seem more feasible to me, as they are just plain 3D models, not so post-processed, and in my opinion they capture pretty well the essence of the characters (from Futurama, in this case):

unti3tled

untitl6ed

un8titled

COOL !

For those of you who always asked themselves how are The Simpsons done, you can check this video (sorry it´s in Spanish only, from Chile TV apparently):

I always thought they had some kind of software to manage camera angles automatically. I even thought sometimes (specially for the most recent seasons) that backgrounds or characters where initially animated in 3D, and then rendered as 2D, but it seems they are animated traditionally.

The video is pretty old though, so things probably changed in the last years.

Some other hilarious examples:

 

untitled

 

un44titled

And some other pics as a present. Not in 3D, but really fun !!, and very appropriate for T-Shirts… ja jaaa:

untitl7ed

 

untitle22d

 

4untitled

All of them come from here.

Cheers!

Simax Forklift Simulator

We are about to release the next Simax simulator. It´s the new Forklift Simulator, a full-featured, next-gen training simulator to learn all the concepts needed to drive and work with a forklift, including basic management of the device´s features, load handling and distribution, driving in every possible situation, dangerous or emergency situations, usual load and unload works, etc. All of our virtual machines are exact replica of their real counterparts: with real motorized joints, mass distribution, and exact layout of controls like levers, joysticks, pedals, etc.

The Simax Forklift Simulator is still a beta release, but will be in the market very soon. You can find more info at: www.simaxvirt.com or at info@simax.es.

 

 

 

 

Using DirectoryInfo.GetFiles returns more files than expected (or how to get exactly what you need, with an exact extension match lookup)

Introduction

I didn’t noticed this behavior of the GetFiles() method until now, I must admit. It’s something not frequent to see, but might happen. And it’s dangerous.
As this post, and the MSDN library itself state, when you use the GetFiles() method with a search wildcard that includes the asterisk symbol, and you include a 3 characters long extension (like *.xml, or *.jpg), the GetFiles() method will return any file whose extension STARTS with the one you provided. That means that a search for *.jpg will return anything with extensions like: *.jpg, *.jpg2, *.jpegfileformat, etc.
This is a quite weird behavior (and not too elegant, I should say), introduced to support the 8.3 file name format. As stated in the above mentioned blog:
“A file with the name “alongfilename.longextension” has an equivalent 8.3 filename of “along~1.lon”. If we filter the extensions “.lon”, then the above 8.3 filename will be a match.”
That’s the reason to make the GetFiles() method behave that way. The official MSDN explanation:
Note
When using the asterisk wildcard character in a searchPattern (for example, "*.txt"), the matching behavior varies depending on the length of the specified file extension. A searchPattern with a file extension of exactly three characters returns files with an extension of three or more characters, where the first three characters match the file extension specified in the searchPattern. A searchPattern with a file extension of one, two, or more than three characters returns only files with extensions of exactly that length that match the file extension specified in the searchPattern. When using the question mark wildcard character, this method returns only files that match the specified file extension. For example, given two files in a directory, "file1.txt" and "file1.txtother", a search pattern of "file?.txt" returns only the first file, while a search pattern of "file*.txt" returns both files.
In my case, I had a bug in my software because I temporally renamed an XML file to xxx.XML2222, just to wipe it out of the application. The program was still reading it, what made it had a wrong behavior.

A workaround for this issue

If you want to prevent this behavior, you will need to do a manual check for the returned array of FileInfo classes, to remove those not matching your pattern. An elegant way to do so, is to write a MethodExtender to the DirectoryInfo class, like the following one:
/// <summary>
/// Returns array of files that matches the search wildcard, but with an exact match for the extension.
/// </summary>
/// <param name="pSearchWildcard">Search wildcard, in the format: *.xml or file?.dat</param>
/// <returns>Array of FileInfo classes</returns>
public static FileInfo[] GetFilesByExactMatchExtension(this DirectoryInfo dinfo, string pSearchWildcard)
{
         FileInfo[] files = dinfo.GetFiles(pSearchWildcard);
         if (files.Length == 0)
             return files;
 
         string extensionSearch = Path.GetExtension(pSearchWildcard).ToLowerInvariant();
         List<FileInfo> filtered = new List<FileInfo>();
         foreach (FileInfo finfo in files)
         {
             if (finfo.Extension.ToLowerInvariant() != extensionSearch)
                 continue;
             filtered.Add(finfo);
         }
         return filtered.ToArray();
}
This way, just by the regular GetFiles() method of the DirectoryInfo class, you will find now the brand new GetFilesByExactMatchExtension(), which will have the desired behavior.
Note: In order to be able to use this method in a class, just like any other MethodExtender, you will need to include a “Using” statement to the extension method’s namespace.
Hope it helps !

Enabling/Disabling properties at runtime in the PropertyGrid

Many people knows about the benefits of using PropertyGrids in user interfaces.
You probably know about the System.ComponentModel namespace, and how it can help you customizing the behavior of classes and their properties when edited through controls like the PropertyGrid. One of the attributes you can find in that namespace is the ReadOnly, which will make a property to be read only and appear in gray (even if it has the Set accessor).
The problem with this attribute is that it must be defined at build-time. Sometimes, it is very useful (and improves the User Experience quite a bit), to enable or disable properties at runtime.
Imagine the following example, where we have a “UserData” class:
public class UserData
{
...
 
        public string Country
        {
            get { return mCountry; }
            set { mCountry = value; }
        }
        public string State
        {
            get { return mState; }
            set { mState = value; }
        }
}
Now, imagine you want the user to fill the “State” field only in the case he selected U.S. as his Country. In such a case, you need to make this change at Runtime.
There are several solutions for this, but I find the following one to be the most elegant, as it´s coded in the “UserData” class itself. The final code looks like:
[RefreshProperties(System.ComponentModel.RefreshProperties.All)]
[ReadOnly(false)]
public string Country
{
  get { return mCountry; }
  set
      {
      mCountry = value;
      PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this.GetType())["State"];
      ReadOnlyAttribute attribute = (ReadOnlyAttribute)
                                    descriptor.Attributes[typeof(ReadOnlyAttribute)];
      FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly",
                                       System.Reflection.BindingFlags.NonPublic |
                                       System.Reflection.BindingFlags.Instance);                   fieldToChange.SetValue(attribute, mCountry != "U.S.");
      }
}
[ReadOnly(true)]
public string State
{
   get { return mState; }
   set { mState = value; }
}

Some Tips

1.- We obviously change the “ReadOnly” attribute of the “State” property in the setter accessor of the property “Country”. That´s the exact point where we know if State should be enabled or disabled.
2.- It is important to add the “RefreshProperties” attribute to the “Country” property. That will force the PropertyGrid control to refresh all it’s properties every time the value of “Country” changes, reflecting the changes we made to the attributes of “State”
3.- In order to work properly all of this, it is important to statically define the “ReadOnly” attribute of every property of the class, to whatever value you want. If not, changing the attribute at runtime that way, will wrongly modify the attributes of every property of the class.
Hope it helps!

More Info

At The Code Project
At C-Sharp Corner
Cheers!

Como agregar tus contactos de Outlook a Windows Phone 7, sin Exchange, sin aplicaciones ni cuentas de correo adicionales

Como ya sabréis, por el momento Windows Phone 7 no se sincroniza localmente con OutLook. Si no tenéis un servidor de correo compatible con Exchange (ese es el modo recomendado de sincronización para WP7), podéis realizar la sincronización con el dispositivo de varias formas, descritas en detalle aqui.

Companion Link ha sacado una aplicación que supuestamente realiza la sincronización, pero me parece un pufo, ya que necesita de una cuenta de correo de Google para funcionar. O sea, más de lo mismo, y encima te cobran 39 $ por la broma. Podéis descargar la versión trial aqui.

En fin, que a falta de que salga algo mejor, por ahora la mejor manera de añadir (que no sincronizar), tus contactos (solo tus contactos, ni tus citas, ni ná) a tu WP7 es utilizando uno de los métodos sugeridos en el enlace de arriba: a través de un fichero CSV.

Requiere tener un Windows Live ID (que no una cuenta de HotMail), pero mucha gente ya tiene uno, aunque solo sea para jugar a la XBox, así que no es una solución tan mala. Lo que haremos es subir nuestros contactos a la cuenta de Windows Live, con la que el Windows Phone sí se sincroniza.

1.- Preparar tus contactos

Como descubrirás más abajo, el proceso de importación de contactos de Windows Live es bastante puñetero. Falla por un montón de motivos, y algunas veces simplemente ni te dice por qué.

Por mi propia experiencia, para evitar que el proceso falle, revista en OutLook tus contactos, sobre todo los números de teléfono almacenados, ya que al parecer no pueden contener caracteres distintos de a-z A-Z y 0-9.

Así que elimina cualquier aparición de cosas como:

  • Espacios
  • Prefijos de países con formato +34 y similares. Substitúyelos por “0034”.

2.- Exportando tus contactos a un fichero CSV

Si tiene Outlook 2010

  1. Empiece por abrir Microsoft Outlook 2010 en el equipo.
  2. Haga clic en Archivo y, a continuación, en Opciones. Haga clic en Avanzadas y, en la sección Exportación, en Exportar.
  3. En el Asistente para importar y exportar, seleccione Exportar a un archivo y haga clic en Siguiente.
  4. Seleccione Valores separados por comas (Windows) y haga clic en Siguiente.
  5. Seleccione Contactos como la carpeta de origen de la exportación y haga clic en Siguiente.
  6. Elija una ubicación de archivo y un nombre de archivo, y haga clic en Siguiente.
  7. Haga clic en Finalizar. Los contactos deben haberse exportado como archivo CSV.
  8. Siga las instrucciones indicadas a continuación en Importar el archivo CSV de Outlook a Windows Live.

Si tiene Outlook 2007
  1. Abra Microsoft Outlook 2007 en el equipo.
  2. Haga clic en Archivo y, a continuación, en Importar y exportar.
  3. En el Asistente para importar y exportar, seleccione Exportar a un archivo y haga clic en Siguiente.
  4. Seleccione Valores separados por comas (Windows) y haga clic en Siguiente.
  5. Seleccione Contactos como la carpeta de origen de la exportación y haga clic en Siguiente.
  6. Elija una ubicación de archivo y un nombre de archivo, y haga clic en Siguiente.
  7. Haga clic en Finalizar. Los contactos deben haberse exportado como archivo CSV.
  8. Siga las instrucciones indicadas a continuación en Importar el archivo CSV de Outlook a Windows Live.

3.- Importando tus contactos en tu Windows Live

  • Importar el archivo CSV de Outlook a Windows Live
    1. Abra un explorador web, vaya a http://contacts.live.com (http://contacts.live.com) e inicie sesión en su cuenta de Windows Live.
    2. Haga clic en Administrar y, a continuación, en Importar.
    3. En la página "Agregar personas", haga clic en Outlook.
    4. Seleccione el botón de radio "Microsoft Outlook (usando CSV)".
    5. Vaya al archivo CSV que exportó a su equipo [pasos 1-7]. 
    6. Haga clic en Importar contactos. Si ya ha agregado la cuenta de Windows Live Hotmail al teléfono, ha terminado. Los contactos se sincronizarán automáticamente con el teléfono cuando inicie sesión en Windows Live desde el teléfono.
      Nota Windows Live tiene un límite de tamaño para carga de archivos CSV de 500 KB. Si su archivo CSV supera los 500 KB, no se cargará y se mostrará el siguiente error: 

      El archivo que deseas importar es demasiado grande. Elimina algunos contactos e intenta importarlo de nuevo.

      Para solucionar este problema, abra el archivo CSV en Excel y divídalo en varios archivos. De esta forma podrá cargar los archivos en Windows Live siempre que el tamaño total de cada archivo no supere el límite de 500 KB.
      Nota Windows Live tiene un límite de almacenamiento de 6500 contactos por usuario.

  • Si no ha agregado la cuenta de Windows Live Hotmail al teléfono, siga estos pasos:
    1. En Inicio, vaya a la izquierda en la lista Aplicación, puntee Configuración y, a continuación, Correo electrónico y cuentas.
    2. Puntee Agregar una cuenta y, a continuación, Windows Live.
    3. Escriba la dirección de correo electrónico y la contraseña, y puntee Iniciar sesión.
    4. Una vez iniciada la sesión, los contactos de Windows Live Hotmail se sincronizarán con el teléfono.

Ultimo consejo

Es muy probable que a pesar de las precauciones del punto 1, el proceso te falle en algún punto. Que sepas que Windows Live habrá importado todos los contactos que haya podido hasta que se haya producido el fallo, así que te recomiendo ir a revisar tus contactos, y mirar cual es el último que se añadió.

Una vez sepas cual es, abre el fichero CSV. Te recomiendo hacerlo con WordPad –desactivando el ajuste de línea-, ya que si lo salvas con Excel le cambiará el formato o la distribución de caracteres y no podrás volver a utilizarlo para importar (simplemente te dirá que el fichero está vacío).

Una vez lo tengas en WordPad, borra todas las líneas de los contactos ya agregados, y ve al contacto siguiente al último que se agregó. En él, busca algún carácter extraño que pudiera haber producido el error (si no encuentras nada raro, simplemente borra la línea de ese contacto). Salva el fichero, y vuelve a repetir el proceso.

Así sucesivamente hasta que completes la importación.

Es un rollo, lo sé, pero al menos te permitirá tener todos tus contactos en el móvil.

Simax + Martan –La simulación aplicada a la formación-

Hace pocos días, Martan fue galardonada con el Premio Cluster TIC al mejor Proyecto Tecnológico, por la incorporación de nuestros simuladores Simax dentro de sus procesos formativos. Aquí podéis encontrar un vídeo presentando el proyecto:

Martan from 601 Producciones Audiovisuales on Vimeo.

Fixing the MSB3247 Warning when compiling .Net Applications

If you are receiving a warning like: “Found conflicts between different versions of the same dependent assembly” when compiling your application, it’s because you are referencing different versions of an assembly in two different project of your solution.

In my case, it was a System.Drawing reference, which was not properly updated when switched to .Net Framework 4.0, and still was pointing to the 2.0 version of the System.Drawing DLL.

Visual Studio won´t tell you which reference is causing the issue (it’s admitted by Microsoft dev. team that they will probably include that feature in the future), so you have to search for it manually. It will tell you anyway in which project the wrong reference is, so you only have to look there.

Cheers!

Ofuscación de código y activación de informes en aplicaciones Windows Phone 7

Nota: Este post es una traducción personal (reconvertida en tutorial) de las explicaciones dadas por Bill Leach (CTO de Preemptive Solutions), en este vídeo grabado para Channel 9.

Introducción

En este artículo se describen los pasos necesarios para proteger el código fuente de aplicaciones Windows Phone (tanto XNA como Silverlight), e incluir en ellas la generación de informes sobre su utilización.

Para ello, se utilizará la herramienta Dotfuscator Windows Phone Edition en su versión 4.9, recientemente lanzada por Preemptive Solutions en colaboración con Microsoft.

En primer lugar, es necesario registrarse y descargar la herramienta desde esta página web. Una vez se recibe por email el número de serie necesario para activar el programa, solo resta lanzar la aplicación: Inicio –> Programas –> Preemptive Solutions –> Dotfuscator.

Interfaz de usuario

Aunque Dotfuscator Professional puede integrarse dentro de Visual Studio 2010, como un tipo de proyecto más, Dotfuscator Windows Phone Edition es una aplicación independiente, con su propio interfaz de usuario:

image

Como puede apreciarse en la imagen, el funcionamiento es sencillo. Consta de:

  • Menú principal y barra de herramientas con las opciones típicas para cargar y salvar un proyecto de ofuscación
  • Botón con el símbolo de Play en verde, en la barra de herramientas, el cual comienza la ofuscación del código que se haya seleccionado y genera las versiones protegidas de los ensamblados o programas.
  • Pestañas de configuración:
      • Settings: Configuración general de la aplicación
      • Input: Selección de qué ensamblados o ejecutables queremos proteger en el proyecto.
      • El resto: propiedades de configuración para cada una de las funcionalidades que ofrece Dotfuscator

Añadiendo ensamblados o ejecutables

Para empezar a trabajar, lo primero es indicar a Dotfuscator qué ensamblados o ejecutables debe proteger. Para ello, solo hay que ir a la pestaña Input y pulsar sobre el icono de abrir carpeta. Aparecerá el clásico cuadro de diálogo de selección de archivos, donde es posible seleccionar:

      • Ensamblados (librerías) de tipo .DLL
      • Ejecutables (aplicaciones) de tipo .EXE
      • Paquetes de despliegue de Windows Phone (contienen librerias DLL, contenidos, etc), de tipo .XAP. Esta será la opción que se utilizará en el ejemplo que nos ocupa.

Nota: Si, como es el caso, estamos trabajando con proyecto Windows Phone (y archivos XAP), Dotfuscator solo trabajará con los ensamblado que encuentre en dichos archivos. Los contenidos no serán protegidos ni modificados en absoluto.

Una vez se selecciona el paquete XAP a proteger, aparecerán sus contenidos en la ventana inferior, en forma de árbol desplegable:

image

Si se despliega cualquiera de las DLLs del paquete, aparecerán algunas propiedades de ofuscación activadas, en forma de CheckBoxes. Una de las más relevantes, según los objetivos que persigue este artículo, es la llamada Library:

image

Manteniendo esta opción marcada (viene marcada por defecto), Dotfuscator deja todos los nombres de los tipos y métodos públicos sin renombrar (sin ofuscar). Los tipos privados sí se renombrarán, y todo el contenido de los métodos se ofuscará, pero los nombres que sean visibles desde fuera permanecerán inalterados.

Esto es necesario cuando una librería, a pesar de estar ofuscada, va a ser utilizada por cualquier otro software después. Si se cambiaran los nombres de los tipos públicos, el interfaz de la librería sería distinto, por lo que dejaría de ser utilizable desde fuera.

Output de la aplicación

Dotfuscator genera versiones protegidas de lo que se selecciona en la pestaña Input:

  • Para ensamblados (DLL), genera DLLs protegidas
  • Para ejecutables (EXE), genera EXEs protegidos
  • Para paquetes Windows Phone (XAP), genera paquetes XAP protegidos

Por defecto, el directorio de salida es el mismo donde se encuentra el ensamblado de entrada, más una sub-carpeta creada por el programa con el nombre Dotfuscated. No obstante, este comportamiento se puede cambiar en la pestaña Settings -> Project Properties -> ConfigDir.

Aplicando una protección básica

Una vez se han seleccionado los Inputs del proyecto, es necesario seleccionar qué tipo de protección ha de aplicarse.

Aunque cada tipo de protección puede ser configurada en profundidad (en sus respectivas pestañas), pudiendo incluso aplicar comportamientos distintos para cada método o propiedad, primero se aplicará una configuración genérica en la pestaña Settings.

Por defecto, todas las protecciones están deshabilitadas, apareciendo de la siguiente forma:

  • Disable Control Flow: Yes
  • Disable Linking: Yes
  • Disable PreMark: Yes
  • Disable Removal: Yes
  • Disable Renaming: Yes
  • Disable String Encryption: Yes

image

Para una protección básica, lo indispensable es activar la ofuscación de Control Flow y el Renaming. En algunos casos, también puede ser interesante activar el String Encryption, sobre todo si la aplicación a proteger contiene strings con contenido sensible.

Para activar cada funcionalidad, debemos indicar a Dotfuscator que NO las deshabilite, es decir, poner valores como: Disable Control Flow: No y Disable Renaming: No.

Control Flow

La ofuscación del flujo de control se encarga de hacer más difícil la comprensión del código, mediante cambios en el flujo del programa. Aunque el resultado final siga siendo equivalente, a nivel funcional, hace cambios para que no sea nada obvio interpretar por donde va a transcurrir la ejecución, y así dificultar las tareas de ingeniería inversa.

Renombrado

El renombrado se encarga de cambiar el nombre a todos los tipos privados, cambiando los descriptivos nombres originales por valores como: “a”, “b”, “c”, etc. En la pestaña Renaming se pueden excluir a mano, uno por uno, métodos o propiedades que explícitamente se quieran dejar fuera del renombrado. No obstante, para un uso básico, esto normalmente no es necesario.

Con estas funcionalidades activadas, ya se cuenta con una protección básica del código fuente. Ahora se describirá como incluir informes en aplicaciones Windows Phone.

Añadir instrumentación, o Code Analytics

Además de protección y ofuscación, Dotfuscator puede añadir Instrumentación a los programas.

Ambas funcionalidades son independientes. Es decir, se pueden aplicar las dos a la vez, se puede aplicar protección pero no instrumentación, y vice-versa.

La instrumentación utiliza una plataforma de Preemptive Solutions denominada como: Runtime Intelligence. Lo que hace es inyectar en el programa que procesa ciertas líneas de código cuya misión es generar informes de uso del mismo cada vez que este se ejecuta, y subirlos al portal de Runtime Intelligence (u otro), al que cada desarrollador registrado tiene acceso protegido por nombre y contraseña.

Se trata de un comportamiento muy similar al que ofrecen otras plataformas de análisis en otros sectores, como Google Analytics para WebSites, blogs, etc.

La instrumentación se activa/desactiva desde la pestaña Settings, apartado Instrumentation (debemos dejar todas las opciones activadas –Yes-)

Identificando la empresa y la aplicación en los informes

Obviamente, el generador de informes debe saber para qué aplicación está reportando, y para que empresa. Ambas cosas se identifican en la pestaña Instrumentation.

En ella, es necesario expandir el nodo de la DLL que contenga la clase principal de la aplicación:

  • Para una aplicación XNA, será aquella DLL que contenga la clase de tipo Game
  • Para una aplicación Silverlight, será aquella DLL que contenga la clase App

Una vez desplegado dicho nodo, aparecerá una lista de atributos por defecto, como los de la siguiente imagen (para un ejemplo en XNA).

image

Para que la instrumentación funcione, es necesario añadirle dos más, pulsando con el botón derecho sobre el nombre de la DLL y seleccionando la opción: Add Attribute. Una vez hecho esto, se abrirá una ventana que pregunta el tipo de atributo a añadir, con una serie de valores predefinidos:

image

Los dos que hay que añadir son:

BusinessAttribute

Este atributo identificará a la empresa desarrolladora del software, mediante un Company Key único, proporcionado vía email por Preemptive Solutions cuando se efectuó el registro en el portal de Runtime Intelligence. También se puede encontrar en el Dashboard del portal una vez hecho login.

Resulta recomendable incluir además un nombre de empresa.

ApplicationAttribute

Para identificar la aplicación, es necesario proporcionar la siguiente información:

  • Application Type: Tipo de aplicación (se puede dejar en blanco)
  • Guid: Identificador del ensamblado principal de la aplicación. Debe ser único, ya que será utilizado en el portal para identificar a esta aplicación. En este campo se puede utilizar el Guid del proyecto, disponible en su Assembly Info (accesible en Visual Studio desde el Solution Explorer o desde la ventana de propiedades del proyecto –> Assembly Info).
  • Name: Nombre de la aplicación (se puede dejar en blanco, aunque no es muy recomendable)
  • Version: Versión de la aplicación (si se deja en blanco, el Reporter tratará de extraerla de los meta-datos del ensamblado).

Indicando dónde se debe inyectar el código

Para indicar a Dotfuscator dónde inyectar el código que genera los informes, solo hay que navegar (sin salir de la pestaña Instrumentation) un poquito hacia abajo, y expandir el contenido aún más la DLL de la parte inferior (en el siguiente ejemplo, la DLL Silverlight: WindowsPhoneApplication1.dll):

image

Expandiendo uno tras otro los sucesivos nodos, solo resta navegar hasta la clase principal de la aplicación.

  • En el caso de un juego XNA, ésta será la clase Game del juego
  • En caso de ser una aplicación Silverlight, ésta será la clase App
Informe de comienzo de ejecución

Para informar sobre el comienzo de una ejecución, se busca un método que se ejecute UNA SOLA VEZ en el proceso de inicialización.

En el caso de aplicaciones SilverLight, un candidato perfecto es el evento Application_Launching de la clase App. En caso de una aplicación XNA, una buena opción puede ser el método Initializing de la clase Game.

Una vez seleccionado el método, se pincha con el botón derecho sobre su nombre, y se selecciona la opción Add Attribute. De nuevo, se solicitará el tipo de atributo a añadir, aunque esta vez la lista de opciones es distinta:

image

El atributo a elegir esta vez es SetupAttribute, el cual tiene bastantes parámetros que se pueden dejar con sus valores por defecto. Aun así, cabe remarcar estos dos:

  • Custom Endpoint: En lugar de enviar los informes al EndPoint por defecto (el del portal de Runtime Intelligence), aquí se puede especificar otro EndPoint personalizado
  • Use SSL: Activa protección SSL para las comunicaciones
Generar los informes de comienzo en un thread aparte

Si la aplicación que estamos desarrollando tarda cierto tiempo en cargar (algo típico en juegos XNA), lo normal (o más bien lo recomendado) es tener la carga inicial de contenidos separada en un Thread aparte, para que mientras dicha carga se produce, se pueda mostrar un icono animado de tipo Loading…

En estos casos, es recomendable incluir la inyección del código de informes en dicho thread, por si la generación del report se demora un poquito por motivos de red, o cualquier otro (aunque no debería). De esta forma la experiencia de usuario no se verá entorpecida.

Si se observa el siguiente ejemplo, en el que se está protegiendo un juego XNA, dicho punto ejecutado en un thread aparte es el método denominado CreateAssets:

Informe de fin de ejecución

Si también se desea que los informes indiquen cuando se dejó de utilizar la aplicación, habrá que seguir un procedimiento muy similar, añadiendo un atributo a un método que se ejecute cuando la aplicación está terminando.

  • En el caso de juegos XNA, el método perfecto para esto es OnExiting, de la clase Game.
  • Para aplicaciones SilverLight, una buena opción es el evento Application_Closing, de la clase App

En este caso, el tipo de atributo a añadir es TearDownAttribute, el cual se puede dejar con sus parámetros por defecto.

Y con esto y un bizcocho, code-analytics a las ocho Guiño

New version of Windows Blocks (1.2) uploaded to Windows Phone MarketPlace

Captura5I have just uploaded the 1.2 version of Windows Blocks. It’s waiting for validation, and will be available soon (probably tomorrow). It fixes several bugs found in the game, especially related to slow response of the main menu.

Hope you all like it!

 

Cheers.

Gran Turismo 5 – The real driving simulator - jaaaaaaa ja ja jaaa….

Gran Turismo 5 is a good game. Nobody doubts that. But I´m pretty disappointed by it. Kazunori Yamauchi (a game development genius, creator of the game and CEO of Polyphony Digital) always said that it would be a REAL simulator, with a real physics system. Today, AutoBlog published this GT5 video:

If a Lamborghini Gallardo can drive at 150 Km/h with a Nissan GTR on its roof… that probably means something… ;)

Cheers!!