127.0.0.1: Hogar dulce hogar
Mostrando entradas con la etiqueta wp7. Mostrar todas las entradas
Mostrando entradas con la etiqueta wp7. Mostrar todas las entradas

viernes, 3 de junio de 2011

[EVENTO] Desarrollo de videojuegos para Windows Phone 7

Este verano participaré junto con Fernando Llopis y Rodrigo Díaz en un curso destinado a explicar las bases de la programación de videojuegos enfocadas en la plataforma Windows Phone 7. Será del 25 al 28 de Julio en la Seu Universitària de La Nucìa, en Alicante.

 

SEU Universitaria y Plaza / Crystalzoo © Guillermo Luijk

En el cursillo veremos desde una introducción a C#, hasta cómo programar en 2D y 3D para Windows Phone 7 y el sistema de publicación. De este modo tendremos una visión global de lo que significa hacer el desarrollo de un videojuego, desde la idea inicial hasta la publicación en un Marketplace.

Aquí tenéis la página del curso para que quien quiera, pueda asistir.

domingo, 13 de marzo de 2011

[WP7] An update to Visual Studio is required to open Silverlight for Windows Phone

 

Este error me ha surgido al abrir mis antiguos proyectos para Windows Phone 7, incluso después de instalar todas las últimas actualizaciones de las Windows Phone Tools y reiniciar contínuamente. ¿La solución? Pues la encontré en el foro de desarrolladores.

Lo único que hay que hacer es volver a enlazar la dll de Design.Platform de nuevo a Visual Studio, para ello:

  1. Abrir la consola de comandos en modo administrador
  2. Ir hasta c:\ProgramFiles\Microsoft SDKs\Windows\v7.0A\bin\NETFX4.0. Si estás con Windows de 64 bits, entonces tienes que ir hasta ProgramFiles(x86).
  3. Ejecutar el siguiente comando: - gacutil /i "%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\Microsoft.Windows.Design.Platform.dll" /f. Del mismo modo que antes, si estamos con 64 bits debemos especificar la carpeta ProgramFiles(x86)
  4. Verificar que al ejecutar el comando, pone: "Assembly successfully added to the cache”.

Aquí dejo una captura de pantalla:

image

miércoles, 5 de enero de 2011

[WP7] My Borrowed List

¿Has prestado tus apuntes a alguien y no recuerdas a quién? ¿Ni cuando? ¿Quién tiene tu libro favorito?¿Cuándo le dejaste a tu primo tu último videojuego? Pues para gestionar esto tengo el placer de presentar otra aplicación mía que recientemente ha aparecido en el Windows Phone Marketplace: My Borrowed List.

 

List

A través de esta sencilla aplicación puedes gestionar qué has prestado, a quién se lo has prestado, cuándo se lo has prestado y el valor del objeto que prestas.

Como siempre, estaré encantado de recibir feedback de la aplicación. Si la quieres probar, puedes descargarla a través de aquí. Por cierto, la aplicación es gratis!

viernes, 31 de diciembre de 2010

[WP7] My Calculator

Recientemente he subido una nueva aplicación en el Marketplace de WP7. Es una calculadora científica, pensada para ingenieros informáticos. Como tal siempre he deseado tener en el móvil una calculadora en la que pudiera convertir (entre otras cosas) números de diferente base sin necesidad de usar la calculadora de Windows o el papel en su defecto. Con My Calculator puedes trabajar con el sistema decimal, radián, binario, hexadecimal y octal. Seguiré trabajando para añadirle features en el futuro. Como siempre, cualquier sugerencia será bien recibida, de igual manera si se encuentra algún bug intentaré ser lo más rápido posible en solventarlo.

calculator

La aplicación la puedes descargar aquí, por 0,99€

lunes, 27 de diciembre de 2010

[Silverlight] Convirtiendo tipos para DataTemplates

Una de las armas más poderosas de WPF y Silverlight son los DataTemplates, que te permiten especificar un template y después mediante el DataBinding puedes desplegar todos los datos de forma automática sin necesidad de rellenarlos a “pelo” insertando fila por fila.

Pero en algunas ocasiones se necesitará contemplar elementos que deben aparecer o no en función de algunos valores de lógica. Por ejemplo, en mi lógica dispongo de una clase Item que tiene una propiedad booleana llamada Borrowed. Cuando esta propiedad está a true, debe aparecer un botón, y cuando no lo está, no debe aparecer nada. En Silverlight la propiedad Visibility permite especificar la visibilidad de un elemento cualquiera, pero esta propiedad se ajusta a través de un enumerado que indica si es visible ( Visible ) o no (Collapsed). Como medida sucia podría incluir dentro de mi lógica una propiedad que tuviera ese valor, pero entonces estaría causando una dependencia entre la lógica y la interfaz de la aplicación y como todos sabemos, eso nunca es bueno. Para solventar este tipo de cosas usaremos un Converter junto con el Binding. Vayamos por partes.

Usaremos el converter para transformar el valor de una propiedad en otro. En nuestro caso, transformaremos el valor booleano de Borrowed por el valor Visible de la interfaz. Para ello crearemos una clase que implemente la interfaz IValueConverter. Esta interfaz consta de dos métodos, Convert y ConvertBack. En nuestro caso vamos a implementar únicamente el Convert, ya que el ConverBack se usará en sentido inverso (de interfaz a lógica).

   1: public class BorrowedToVisibilityConverter : System.Windows.Data.IValueConverter
   2:     {
   3:         #region IValueConverter Members
   4:  
   5:         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   6:         {
   7:             Visibility isVisible = Visibility.Collapsed;
   8:             if ((value == null))
   9:                 return isVisible;
  10:             if (((bool)value))
  11:             {
  12:                 isVisible = Visibility.Visible;
  13:             }
  14:             return isVisible;
  15:         }
  16:  
  17:         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  18:         {
  19:             throw new NotImplementedException();
  20:         }
  21:  
  22:         #endregion


Dentro de Convert interesa el parámetro value (lo que vamos a usar para convertir). El resto de parámetros no interesa en este caso, pero no es necesario explicarlos. Como se puede apreciar el código es sencillo, si el valor es positivo se devuelve Visibility.Visible y en cualquier otro caso se devuelve Visibiliy.Collapsed. Ahora teniendo esto ya implementado, tenemos que asociarlo a nuestro binding y por ello, a partir de este momento nos dedicamos ya con el fichero XAML correspondiente.

Ante de asociarlo, tenemos que mapear este conversor como un recurso. Para ello simplemente le asignamos una clave de referencia y especificamos el nombre del conversor:

   1: <UserControl.Resources>
   2:          <converter:BorrowedToVisibilityConverter x:Key="BorrowedToVisibility" />
   3: </UserControl.Resources>

Y por último lo asociamos a nuestro binding. En este caso irá en un botón en el su propiedad Visibility dependerá del valor de la propiedad Borrowed del binding asociado al template. Es aquí cuando ya debemos especificar el conversor de forma explícita:

   1: <Button Content="Ok!" Height="72" Width="160"  Visibility="{Binding Borrowed, Converter={StaticResource BorrowedToVisibility} }" HorizontalAlignment="Right" Click="Button_Click" Tag="{Binding Id}" Background="White" BorderBrush="Black" Foreground="Black" />

Y más en detalle:

   1: Visibility="{Binding Borrowed, Converter={StaticResource BorrowedToVisibility} }" 

Asociamos la propiedad del objeto y le indicamos que tenemos un conversor, incluido como recurso estático y su clave de referencia.

jueves, 16 de diciembre de 2010

[Ebooks] Libro GRATIS Windows Phone programming in C#

A través de Rob Miles nos cuenta que han publicado su curso de programación para Windows Phone 7 en Microsoft Faculty Center.

Windows Phone 7 Blue Book

Este libro es una introducción para Windows Phone 7 para cualquier persona que tenga fundamentos muy básicos de programación. Cuenta con ocho capítulos (WP7, Introducción a Silverlight,Introducción a Visual Studio 2010, Interfaces con Silverlight, Consumo de servicios, XNA, Creando aplicaciones para WP7 y Windows Phone Marketplace).

Descárgalo a través de este enlace. ¡Que aproveche!

[XNA/WP7] Consideraciones sobre el TouchPanel

El uso del TouchPanel es una de las características que siempre se nombran en Windows Phone 7. Y teniendo en cuenta que disponemos únicamente de tres botones físicos en el teléfono, más nos vale usar la pantalla para interactuar con el usuario. Aquí entra el TouchPanel, la pantalla táctil de los terminales del tipo Windows Phone 7.

Para usarlo es sencillo. Simplemente debemos capturar el estado del panel en el momento apropiado. Algo como lo siguiente:

   1: TouchCollection touchCollection = TouchPanel.GetState();
   2: foreach (TouchLocation tl in touchCollection)
   3: {
   4: //Aquí evaluamos cada punto...
   5: }

Capturamos el estado y mediante un bucle, recorremos todos los puntos con los que hemos hecho contacto. A ese punto se le llama un TouchLocation y el estado del TouchPanel no es más que una colección de TouchLocation. Cada TouchLocation tiene un identificador (entero), posición (Point indicando la posición de contacto) y State (para ver si está pulsado o no). Por lo tanto yo podría tener algo así:

   1: TouchCollection touchCollection = TouchPanel.GetState();
   2: foreach (TouchLocation tl in touchCollection)
   3: {
   4:     if (this.intersectsWithPlayer(tl.Position))
   5:     {
   6:         //...
   7:     }
   8: }

La función intersectsWithPlayer(Point p) comprueba si en el punto p hay una intersección con el jugador. La pregunta es, ¿es este planteamiento correcto?

No. No lo es. Y es un fallo simple y común. ¿Dónde está el fallo? El fallo es que no verifico en qué estado está el TouchLocation a analizar. Cada TouchLocation tiene varios estados (enumeración TouchLocationState): Inválido, movido, pulsado, levantado. Debemos comprobar antes de interactuar con los puntos en qué estado se encuentra, porque en ese caso el funcionamiento de la interacción no será el que deseamos. Por ejemplo, partiendo del ejemplo anterior, supongamos que ese código está dentro del Update propio y que el usuario tiene el dedo en la pantalla. En la primera iteración de Update, efectivamente el panel capturaría el estado y reconocería el punto de contacto. A continuación, sigue el ciclo de ejecución y el usuario levanta el dedo de la pantalla. ¿Qué ocurrirá en la iteración posterior de Update a ese evento? Pues volverá a capturar el punto (pero si el usuario no tiene ningún dedo puesto!!) y lo evaluará. ¿Cómo es posible que si no tenemos un punto con la pantalla el sistema diga que tiene uno? Porque evidentemente, lo tiene. Y ese punto es el punto anterior, donde antes estaba pulsado, pero con el estado “Released”. A la siguiente iteración ya no estará el punto capturado, pero previamente lo estaba por la transición de sus estados. Así que por lo tanto para solventar nuestro problemilla la solución es esta:

   1: foreach (TouchLocation tl in touchCollection)
   2: {
   3:     if ((tl.State == TouchLocationState.Pressed)
   4:     {
   5:         if ( this.intersectsWithPlayer(tl.Position))
   6:         {
   7:             //...
   8:         }
   9:     }
  10: }

Lo mismo ocurre con el resto de estados. Es un fallo que ya lo hemos sufrido varios y depurarlo es muy complicado si no tienes en cuenta esas peculiaridades de TouchLocationState.

miércoles, 1 de diciembre de 2010

[Webcast] Introducción a XNA para Windows Phone 7

Este fin de semana fue la codecamp de Windows Phone 7 en Madrid. Esta vez acudí como experto y no como programador. Previamente se creó un contenido de formación para todos los asistentes, y en mi caso me ocupé del primer webcast que sirvió de Introducción a XNA para Windows Phone 7:

image

El contenido se compone de los siguientes puntos:

  • Introducción a Windows Phone 7 desde el punto de vista del terminal.
  • Creando juegos para WP7: Explico las principales características de WP7 que soporta XNA.
  • Demo básica: Crear un proyecto desde cero y trastear con la orientación del teléfono.
  • Demo PeterBeer: Minijuego de ejemplo
  • Demos de Creators: Demos de ejemplo descargadas desde Creators para demostrar las capacidades de WP7
  • SlugKiller: Comentaré brevemente el juego que hice en la CodeCamp anterior.
  • Consejos: Dada la experiencia de la codecamp anterior, daré una serie de consejos bastante recomendables para que los asistentes a la codecamp logren llevar su proyecto al éxito.

Si quieres verlo, puedes hacerlo a través del siguiente enlace.

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.

jueves, 28 de octubre de 2010

[Ebooks] Ebook GRATIS de WP7

Hoy se ha celebrado el PDC2010, donde se han anunciado jugosas novedades que ya tendremos tiempo de ir digiriendo. Mientras tanto, han publicado un ebook gratis sobre WP7:

9780735643352x

 

24 capítulos y 1000 páginas. Si quieres aprender a programar para Windows Phone 7 y no conoces unas buenas referencias, aquí tienes un buen libro donde comenzar.

Lo puedes descargar desde aquí

martes, 19 de octubre de 2010

[XNA] SlugKiller

Fruto de la MiniCodeCamp que hicimos con Microsoft en Madrid, ya tengo la versión 0.5 de SlugKiller:

image

Es un juego simple, sencillo y adictivo cuyo único argumento consiste en chafar las babosas que se escoden bajo suculentas berenjenas. Pero tenga usted cuidado, porque las babosas escupen bolas de babas que te impedirán ver la pantalla!

En cuanto disponga de tiempo iré añadiendo más features y features, pero por ahora queda esta versión jugable.

jueves, 16 de septiembre de 2010

[XNA] Lanzamiento XNA 4.0

Hoy se ha publicado por fin la versión 4.0 de XNA Game Studio, y como ya ocurrió en la beta ahora también se integran dentro de la Windows Phone Tool Developer Tools. Este kit incluye lo siguiente:

  • Visual Studio 2010 Express for Windows Phone
  • Windows Phone Emulator
  • Silverlight for Windows Phone
  • XNA Game Studio 4.0
  • Expression Blend
  • Como siempre, gratis y sin coste alguno para poder empezar o seguir trasteando con XNA y Windows Phone 7!

    viernes, 6 de agosto de 2010

    [XNA] Acelerómetro en Windows Phone 7

    Desde el día 4 de agosto disponemos en XNA Creators Club de un par de tutoriales que explican cómo usar el acelerómetro con XNA en Windows Phone 7.

    El primer tutorial implementa una clase que gestiona el acelerómetro y actualiza la posición de un sprite en pantalla en función de los datos capturados por este sensor.

    El segundo tutorial consiste en el tratamiento de colisiones para simular un sistema de físicas donde las esferas se modelan con algo de elasticidad y se implementa la fricción entre ellas para calcular los vectores de fuerza. En este caso el acelerómetro actúa de generador de vector de gravedad.