Entradas para el mes Julio de 2007

Estado del proyecto a 31/07/2007

Martes 31 de Julio de 2007 a las 23:43

Esta última quincena me ha cundido bastante y le he dado un pequeño empujón al proyecto.

He añadido al editor de scripts la posibilidad de mostrar los números de línea del código, funcionalidad en desuso hoy en día y que era muy común en los viejos editores de código. El visual studio 2005 permite mostrarlos aunque por defecto esta deshabilitado.

También he añadido al editor de scripts una ventana de opciones para configurar varios aspectos del editor. Actualmente permite establecer la fuente del editor de código, si se mostrarán los números de línea o no y si se sustituirán los tabuladores por espacios y si es así por cuantos espacios.

He creado un control llamado animación que encapsula toda la funcionalidad relativa a la creación de una animación para poder reutilizarlo con facilidad en los diversos editores. Actualmente solo está presente en el editor del personaje protagonista.

En cuanto a la ejecución de la aventura gráfica también he realizado algunos avances. El motor lee la información creada previamente con las herramientas o editores y dibuja el escenario inicial y el protagonista. Este se mueve por la pantalla respondiendo a las pulsaciones del teclado o yendo hacia el punto donde se haya hecho click con el ratón. El protagonista se mueve a la velocidad indicada en el editor del protagonista y camina en 8 posibles direcciones con las animaciones (secuencias de fotogramas) que se hayan definido.

Tambien he desarrollado una clase para dar soporte a la configuración de la aplicación, permitiendo varios ficheros de configuración y la actualización “en caliente”, es decir que si en tiempo de ejecución se modifica algún valor de un fichero de configuración dicho cambio es detectado y aplicado por la aplicación sin tener que reiniciarla.

Para pertimir moverse al protagonista de una forma coherente por las zonas transitables de los escenarios he implementado un algoritmo de búsqueda de caminos basándome en el A*. No está del todo terminado, ya que todavía tengo pendiente pulir un poco los caminos encontrados por el algoritmo de búsqueda..

Aun quedan pendientes muchas modificaciones a los editores y la creación de editores nuevos como el editor de objetos o el de conversaciones.

Más adelante iré subiendo algunas capturas de todo esto.

Descarga añadida: Control Borde

Lunes 30 de Julio de 2007 a las 23:39

He añadido en la sección de descargas el código completo del control borde del que hablé en un post anterior y que permite dotar a los controles de .NET de varios estilos de borde adicionales a los que vienen por defecto.

Primer aniversario

Domingo 29 de Julio de 2007 a las 23:54

Hoy se cumple el primer aniversario del nacimiento de este blog.

En estos 365 días he publicado 44 posts, a una media de un post cada ocho días y se han recibido 95 comentarios. El número de mensajes de spam recibidos asciende a más de 7000.
El número de visitas únicas ha sido de 9.808, que han visto 17.468 páginas. Muchos de ellos han sido gente despistada que ha llegado a través de google buscando otras cosas.

En cuanto al proyecto, no ha avanzado todo lo que hubiera querido debido a la falta de tiempo, aunque poco a poco va avanzando y ya hay algunas cosas visibles que espero mostrar en breve.

Singleton más legible y accesible en VB.NET

Jueves 26 de Julio de 2007 a las 23:59

Uno de los patrones de diseño más conocidos y utilizados (si no el que más) es el patrón singleton, que permite garantizar la existencia de una única instancia de una clase evitando la creación de objetos de ese tipo declarando el constructor como privado o protegido. Otra de las ventajas de este patrón es que permite centralizar en un único punto todos los accesos a la instancia.

Una posible implementación en Visual Basic .NET sería la siguiente:

 

VB.NET:
  1. Public Class Singleton
  2.  
  3.     Private Sub New()
  4.     End Sub
  5.  
  6.     Private Shared _instancia As Singleton
  7.  
  8.     Public Shared ReadOnly Property Instancia() As Singleton
  9.         Get
  10.             If _instancia Is Nothing Then
  11.                 _instancia = New Singleton
  12.             End If
  13.  
  14.             Return _instancia
  15.         End Get
  16.     End Property
  17. End Class

 

La forma de acceder a una propiedad de esta clase para asignarle un valor sería:

Singleton.Instancia.MiPropiedad = "miValor"

Esta forma de acceder a una propiedad es un poco artificial y no resulta tan legible o natural como:

Singleton.MiPropiedad = "miValor"

Para conseguir acceder de estar forma a una propiedad de nuestra instancia deberemos crearnos un modulo:

 

VB.NET:
  1. <Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
  2. Public Module Auxiliar
  3.     Public ReadOnly Property SingletonInst() As Singleton
  4.         Get
  5.             Return Singleton.Instancia
  6.         End Get
  7.     End Property
  8. End Module

 

Ahora para acceder a la propiedad simplemente tendremos que escribir:

SingletonInst.MiPropiedad = "miValor"

Esta solución únicamente es valida en Visual Basic.NET debido a que en C# no existen los módulos.

Detectar los cambios de la IP

Martes 24 de Julio de 2007 a las 23:51

A la hora de contar las visitas que tiene un sitio web es interesante no computar tus propias visitas que en algunos momentos pueden llegar a ser numerosas y que falsean las estadísticas reales. Para evitar esto los sistemas de estadísticas como el statcounter o el Google Analytics cuentan con la posibilidad de no contabilizar las visitas provenientes de una determinada IP.

El problema es que es bastante común tener direcciones IP dinámicas que cambian de vez en cuando, lo que obliga a tener que estar comprobando frecuentemente si tu IP actual coincide con la que estás filtrando en los servicios de estádisticas y si no es así actualizar las IP de los filtros.

En el caso de que se olvide hacer esta comprobación y cambies de IP las estadísticas habrán estado contando todas tus visitas.

Para evitar está situación he creado una pequeña aplicación en Visual Basic.NET que apenas cuenta con media docena de líneas de código y que configurada para que se arranque al iniciar windows realizará la comparación de la IP actual y la anterior IP y en el caso de que sea diferente mostrará un aviso.

En el área de descargas está disponible el ejecutable.

El código de esta pequeña aplicación creada en VB.NET es el siguiente:

 

VB.NET:
  1. Option Strict On
  2. Option Explicit On
  3.  
  4. Module Programa
  5.  
  6.     Sub Main()
  7.         Dim IPs As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName())
  8.  
  9.         If IPs.AddressList(0).ToString <> My.Settings.IP Then
  10.             MsgBox("Ha cambiado la IP de la máquina", MsgBoxStyle.Information, "Atención")
  11.             My.Settings.IP = IPs.AddressList(0).ToString
  12.             My.Settings.Save()
  13.         End If
  14.     End Sub
  15.  
  16. End Module

Dotando a los controles de .NET de un borde personalizado

Miércoles 18 de Julio de 2007 a las 23:57

Sorprendentemente los controles de .NET no admiten apenas estilos de borde. Por ejemplo el control listbox solo permite dibujar el borde de tres formas: hundido, con una línea negra o sin borde.

El intellisense que desarrollé hace tiempo para el editor de código se basaba en un listbox y no tenía una apariencia adecuada ni similar a los del intellisense de los IDES habituales debido al borde que tenía que era el borde hundido que viene por defecto en dicho control.

La primera forma de implementar los bordes que me vino a la cabeza fue crear un control que heredara de listbox, es la forma más lógica de implementarlo debido a lo que se busca es un listbox con cierta funcionalidad adicional. Sin embargo el control listbox no implementa el evento paint y aunque lo hereda de la clase Control nunca se levanta. De igual forma si se sobrescribe el método onpaint tampoco se ejecuta nunca.

La siguiente opción que se me ocurrió fue crear un control de usuario compuesto de un listbox y un picturebox, un panel o similar que contuviera el listbox y que sobresaliera dos pixels por cada uno de los lados del listbox. En esos pixeles sería donde dibujaría los bordes valiéndome del evento paint. Esta opción tiene un importante inconveniente y es que al no heredar de listbox sino de la clase UserControl no implementa todos los métodos, propiedades y eventos de listbox. En este punto habría dos opciones, la fácil que consistiría en hacer publico el listbox. Esta opción rompe con uno de los pilares de la orientación a objetos que es la encapsulación y el código que utilizara el control tendría que hacer utilizar por ejemplo listBoxConBorde.ListboxInterno.SelectedIdex en vez de listBoxConBorde.SelectedIdex que sería lo deseable.
La otra opción sería recubrir las propiedades, métodos y eventos del listbox en el control de usuario, creando en el control de usuario tantas propiedades, métodos y eventos como tenga el listbox. Estos miembros del control de usuario simplemente llamarían a los miembros homónimos del listbox. Esta opción me parece más adecuada que la anterior pero mucho mas tediosa de implementar.

Finalmente opté por una solución que me ha parecido mucho más acertada, sencilla y genérica. Consiste en crear un control llamado "Borde" que dibuje el borde de cualquier control. Hereda de la clase "Control" y consta de dos propiedades:

  • El tipo de borde (que admite los siguientes valores Elevado, ElevadoDobleLinea, Hundido, ElevadoYHundido y HundidoYElevado)
  • El control asociado al que se le dibujará el borde.

Además del código para realizar el dibujo del borde también se encarga de adecuar su tamaño y posición a la del control asociado.

Extender el control para añadir nuevos tipos de bordes con diferentes efectos sería una labor bastante sencilla de realizar.

La nueva apariencia del intellisense estableciendo el borde a ElevadoDobleLinea es la siguiente:


Intellisense con el nuevo borde.
Intellisense con el nuevo borde.


Intellisense."
Intellisense anterior.

 

En la sección de descargas se puede encontrar el código completo en VB.NET del control.

Combatiendo el spam

Martes 17 de Julio de 2007 a las 23:58

Después de bastante tiempo sin escribir ningún post y tener también abandonada la programación de videojuegos retomo ambas actividades.

En todo este tiempo en blog se me ha llenado de spam, no 3 o 4 comentarios, sino miles de ellos (en torno a 7000). Espero no haber borrado ningún comentario que no fuera spam por error durante las tareas de limpieza del blog.

Parece que es bastante habitual recibir spam en los blogs basados en wordpress.

Para evitar esta situación he decidido instalar un plugin antispam llamado wordverify. Este plugin se puede encontrar gratuitamente en esta página. De momento esta funcionando bien y no me ha llegado ni un solo comentario de spam desde que lo instalé. El original no funcionaba del todo correctamente así que he tenido que hacerle algunas modificaciones para corregirlas además de para traducir los textos. Si alguien está interesado que me lo pida. Se basa en solicitar a la persona que va a escribir el comentario que escriba una determinada palabra en una caja de texto con el fin de diferenciar a las personas y a los procesos automáticos de envio de Spam.

Para combatir el spam que llegaba mediante los trackbacks he utilizado el plugin Simple Trackback Validation que parece funcionar también correctamente.

Espero que estos plugins no presente ningún efecto secundario adverso. Si alguien tiene algún problema para escribir comentarios o de cualquier tipo con los filtros antispam por favor que me lo comunique a mi dirección de email brauXsoftYgmailZcom (eliminad la X, sustituid la Y por @ y la Z por .)