Videojuego desarrollado en AS3: Flash + PHP + MySQL + XHTML + jQuery

Como algunos ya sabréis, me dedico al desarrollo videojuegos para cualquier plataforma, éste fué uno de los proyectos que un cliente ( makro.es ) me pidió hace un tiempo.

Se trata de un videojuego tipo Trivial Pursuit con los gráficos de Joan Carles Muñoz, desarrollado durante dos semanas, consiste en una serie de preguntas que pueden definirse fácilmente y sólo una de ellas es correcta. Trae soporte de login usando una conexión a un servidor Apache con PHP y MySQL y en varios lenguajes, en este caso portugués y español. Las preguntas son aleatorias, aunque no hay límite de tiempo, se compite por empezar y acabar antes que nadie así como tener el menor número de fallos posible.

Vídeo:

Está todo hecho de cero, desde los textos hasta los botones pasando por las animaciones, que son interpolaciones hechas con con tweeners.

Cuando un usuario hace el login, se guarda la hora de inicio de la partida, después, al conseguir todos los quesitos, se guarda la información generada: fallos, tiempos, etc.,así como se calcula el mejor tiempo conseguido. Todo va a la base de datos MySQL que se presenta a los encargados de la administración como un listado de personas con sus datos correspondientes, ordenado por los mejores tiempos de partida, esta parte fué elaborada usando jQuery así como las plantillas en XHTML+CSS3.

Estos datos pueden ser exportados como CSV en modo texto para ser importados y tratados posteriormente en programas de análisis de datos como puede ser Microsoft Excel, permitiendo así analizar las partidas de los usuarios y hacer gráficos con ellos.

La parte más complicada fué ,quizás, la de los estados del juego y las firmas de seguridad incluídas usando encriptación en ambas partes, cliente y servidor. En cualquier caso, fué un desarrollo bastante entretenido.

Portal de juegos flash en PHP

Arkatia es el portal sobre el que he estado trabajando recientemente, para un cliente de Valencia: Taykron  Games , que me proporcionó el diseño en imágenes de lo que quería, con el que nuestro querido amigo Joan Carles nos hizo la maqueta en XHTML+CSS +Jscript (algunas cosas en JQuery) y en mi caso ,me encargo de toda la parte de la programación y, diseño de estructuras de datos, base de datos, arquitectura de la información, jerarquía y roles, etc.: Las tareas de un ingeniero jeje, aunque en este caso también he hecho, entre otras, el diseño , maquetación y programación del backend o administración interna.

 

La estructura de clases de esta aplicación web consiste en un modelo vista controlador (MVC) para  juegos, concursos, jugadores ,etc., que están en continúa intercomunicación,i.e., todo centralizado desde una clase principal que gestiona las acciones de los controladores que llaman a las vistas, rellenando los datos proporcionados por el modelo de datos, asociado a tablas de la base de datos.

Los algoritmos de relación entre entidades se ejecutan a través de filtros de metadatos y se mantienen actualizados con metaprogramas y tareas automatizadas y mantenimiento, las búsquedas sin embargo se ejecutan mediante un híbrido entre los filtros like y match, jugando con los números de resultados para la toma de decisiones,difieren un poco frente a la búsqueda de entidades -similares- en que se usa una referencia citada por medio de categorías específicas.

Se construye el sitio web cumpliendo normativas básicas de XHTML válido -W3C – , compatible los navegadores más usados , opciones avanzadas y efectos en JavaScript, optimizado para posicionamiento (SEO), etiquetas opengraph, etc

Las páginas del sitio web se generan en unos milisegundos y se usan dominios y subdominios alternativos para aumentar la velocidad de carga mediante peticiones en paralelo ,esto es algo importante y mientras más se usa la web más fácil es de que sea cargarda en un instante mediante el uso de la caché del servidor y del navegador, sobre todo tratándose de este tema en el que los juegos flash pueden pesar bastante; de hecho la administración dispone de opciones a medida como la carga externa de datos desde una URL proporcionada.

 

Aunque el proyecto ha pasado a la fase final y entrega del mismo, sigue estando en desarrollo y continua mejora.

Características de administración:

  • Asistencia a la metaprogramación
  • Gestión de banners
  • Gestión de usuarios
  • Gestión de concursos
  • Visualización de estadísticas básicas
  • Edición de páginas dinámicas
  • Gestión de configuración del sitio

La parte cliente tiene:

  • Buscador basado en metadatos con diferentes algoritmos
  • Gestión inteligente de SEO (posicionamiento)
  • XHTML validado por la W3C
  • Uso de etiquetas para redes sociales y botones para compartir en estas
  • Sistema de plantillas para gestionar temas distintos
  • Interacción de usuarios siguiendo reglas básicas de publicación

En desarrollo:

  • Sistema de niveles y premios
  • otros

 

Aplicación web de reservas, ofertas y otros para apartamentos

Uno de los prototipos del framework zen php más avanzados de los años 2007 a 2008 fué desarrollado mientras trabajaba en Agencia Q4, dónde se realizó el diseño de la web (la plantilla XHTML+CSS) mostrada en el vídeo.

Técnicamente: en esta aplicación web se rellena el contenido de las plantillas usando una estructura de clases embebida en una clase principal, es decir, toda la aplicación es un único objeto con referencias a cada parte.

Las plantillas fueron mejoradas usando JQuery para las operaciones de administración con AJAX y validaciones de formularios, animaciones, etc.

Se utilizan las sesiones de usuario para mantener los datos, al enviarse un formulario de reserva se avisa al encargado de los apartamentos y puede ver dicha información de reserva a través de un enlace en el e-mail enviado automáticamente que va directamente a la administración permitiendo realizar las reservas oportunas en el apartamento correspondiente a la reserva.

Patrones de diseño: Elementos reutilizables para la web

La Ingeniería del Software aplicada a la web requiere una inversión inicial para “hacer las cosas bien”, mientras más vueltas a la cabeza le das a un problema, más manejo cogemos para solucionarlo en un futuro, además de mejorar nuestro ingenio y agudizar nuestras habilidades.

Desde hace mucho tiempo que programamos en PHP o cualquier otro lenguaje al nivel del software Orientado a Objetos, para este artículo he utilizado como bibliografía el libro “Design Patterns” de la élite-grupo formada por: Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides de la editorial Addison Wesley. Es más, en la mayoría de enlaces que pongo a la Wikipedia se copian literalmente (bueno no literalmente porque se traducen del inglés al español) toda la teoría de este libro, directamente. Ahora además , ¡veremos la parte práctica!

¡¡Pero primero, …un poco de teoría!!

 

 

 

 

 

Ya os estaréis preguntando de qué demonios va esto de los patrones de diseño y cómo los podemos utilizar en la construcción de una aplicación web para hacer el proceso, si cabe, más divertido :] …para explicarlo, se debe de conocer primero qué es un patrón de diseño, concretamente deberíamos conocer el Modelo-Vista-Controlador o bien,MVC, alguna de sus variantes y, llegado este punto, recordar lo que es un catálogo de patrones de diseño, a los que pertenecen los siguientes:

  • Abstract Factory (patrón de diseño): provee de una interfaz (una clase) para crear familias de objetos relacionados o dependientes sin especificar sus clases concretamente
  • Adapter (Adaptador): convierte la interfaz de una clase en otra permitiendo a ambas trabajar juntas, las hace compatibles.
  • Bridge (o Handle/Body) – enlace : desacoplar una abstracción de su implementación, así, ambas pueden variar independientemente, i.e., para poder conectar una abstracción con diferentes implementaciones de forma transparente.
  • Builder (constructor): separa la construcción de un objeto complejo de su representación de forma que el mismo proceso de construcción puede crear diferentes representaciones.
  • Chain of Responsibility (cadena de responsabilidad) : permite la posibilidad de que un objeto que envíe una petición a más de un receptor, con un criterio establecido que funciona como una cadena.
  • Command (petición de operación): encapsula una petición como un objeto, así le es posible parametrizar clientes con diferentes peticiones, hacer una cola o guardar un registro de peticiones y solventar posibles operaciones que se puedan deshacer.
  • Composite (constructor de objetos complejos): compone objetos en tres estructuras para representar parte o toda una jerarquía. Permite a los clientes tratar objetos individuales y composiciones de objetos uniformemente.
  • Decorator: adhiere dinámicamente funcionalidades adicionales a un objeto, proveyendo así una alternativa flexible a las subclases para extender la funcionalidad.
  • Facade: provee de una interfaz unificada a un conjunto de interfaces en un subsistema de aplicaciones web, definiendo una interfaz de alto nivel que hace al subsistema fácil de usar.
  • Factory Method: define una interfaz para crear un objeto, pero permite a las subclases decidir qué clase instanciar.
  • Flyweight: compartir para soporte eficiente de un amplio número de objetos granulados finos (Granularidad: Grado de especificación de la información que contiene un elemento de datos. Una tabla de hechos de granularidad fina contiene muchos hechos discretos )
  • Interpreter: Dado un lenguaje, define una representación de su gramática acompañada de un intérprete que usa la representación para interpretar sentencias en el lenguaje
  • Iterator: provee de una forma de acceder a los elementos de un objeto agregado secuencialmente sin exponer su representación subyacente
  • Mediator: define un objeto que encapsula la forma en la que un conjunto de objetos interactúan. Es decir, coordina la relación entre sus asociados y permite su interacción independientemente
  • Memento: sin violar la encapsulación, captura y externaliza el estado interno de un objeto para poder restaurar dicho estado en otro momento


  • Observer (observador): define una dependencia “de uno a muchos” entre objetos de forma que cuando un objeto modifica su estado interno, todos sus dependientes son notificados y actualizados automáticamente
  • Prototype: clona objetos, se especifica que tipos de objetos crear usando un instancia prototipo, después se crean nuevos objetos copiando a este
  • Proxy: provee de un substituto único (subrrogate o placeholder: parámetro de substitución) para controlar el acceso a otro objeto
  • Singleton: asegura que una clase sólo tenga una instancia, además provee de un punto global de control de acceso a este
  • State: permite a un objeto alterar su propia “conducta” cuando su estado interno cambia, es decir, puede cambiarse de clase como de piel
  • Strategy: define una familia de algoritmos, encapsulando cada una y haciéndolas intercambiables; Permite que el algoritmo varíe independientemente de los clientes que lo usan
  • Template Method: define el esqueleto de un algoritmo en una operación, delegando algunos pasos a subclases de forma que estas pueden redefinir ciertos pasos de un algoritmo sin cambiar la estructura del mismo
  • Visitor: representa una operación que debe ser llevada a cabo sobre los elementos de la estructura de un objeto. Permite definir una nueva operación sin cambiar las clases de los elementos con los que opera

Organizando el catálogo

Ahora que conocemos el contenido del catálogo de los patrones de diseño, debemos saber más acerca de su espacio, es decir, a qué ámbito, qué propósito tienen, donde enmarcarlos en definitiva a la hora de utilizarlos. Como hemos visto en sus descripciones, hay objetos y clases, algunas clases son abstractas, por lo que necesitan ser construidas desde otra clase que sí se puede instanciar y que hereda de la primera sus características. En el caso de las clases , según su propósito tenemos para crear contenido el patrón Factory Method, para estructurar el mismo elegimos el Adapter (Adaptador) y como comportamiento los patrones de diseño de clases: Interpreter y Template Method.

Sin embargo, a la hora de seleccionar qué patrones de diseño utilizar para enfocar los objetos, encontramos para el apartado creativo los patrones: Abstract Factory, Builder, Prototype y Singleton; en cambio, para el estructural : de nuevo podemos coger al Adaptador, Bridge, Composite, Decorator, Facade, Flyweight y Proxy. En el caso de los comportamientos de los objetos: Chain of Responsability, Command, Iterator, Mediator, Observer, State, Strategy, Visitor.

¡¡Pasamos a un ejemplo práctico!!

Un ejemplo de software libre que usa patrones de diseño para comunicar un servicio de vídeo de Flash con un objeto Flash incrustado en un HTML con comunicación asíncrona por XML (con AJAX) es AMFPHP, un ejemplo de profesionales utilizando patrones de diseño en una aplicación Flash con esta plataforma es: Digital Tutors.

Ahora que somos unos amos de los patrones veamos un ejemplo, saber cuáles de ellos nos harán falta es sencillo, para este ejemplo vamos a construir un generador de formularios, como por ejemplo el de Fabrik, en PHP.

Para empezar necesitamos una clase principal que utilice el patrón Singleton, para ello lo único que tenemos que hacer es crear una clase llamada Singleton (en un alarde de imaginación) con una variable estática llamada instancia y comprobar en la función constructor si dicha variable está vacía, entonces creamos una instancia de la clase Singleton que almacenamos en aquella, en otro caso no,evidentemente…aunque, personalmente, prefiero guardar punteros (pese a que dicha práctica no se continúe en PHP5 y 6 [deprecated]), echad un vistazo a este framework.

Ahora que tenemos una clase principal (usando el patrón Facade para poder crear una clase para presentar el contenido y otra para administrarlo) , $web, vamos a asignarle un modelo de datos del patrón MVC modificado con el uso del patrón Composite, en este caso es una clase llamada $formularios,  y su vista (o visualizador) asociémosla a la anterior y llamémosla clase $html_formularios, sirve de conexión con las plantillas HTML de modo que usaremos un patrón Bridge como controlador incrustado en el visualizador o vista, así, se pueden crear distintas implementaciones para controlar las acciones de los formularios generados, ejemplo: al enviar un formulario para almacenar datos en la base de datos que se apliquen distintos filtros a cada campo. Dichos campos siguen el patrón Abstract Factory, y para pasar de un tipo a otro, por ejemplo de un tipo campo de texto a un tipo área de texto (<input type=”text”/> a <textarea/>) utilizamos un patrón Adapter, evidentemente, para construir los campos usamos un Builder.

Esta clase abstracta Builder debe encargarse de crear las reglas de actualización de estados, es decir, de las dos posibilidades que hay: notificar automáticamente a los objetos asociados cuando el estado interno de un campo cambia o dejar que el usuario lo haga, tomamos la primera para evitar dar más trabajo al programador y realmente no es mucho más ineficiente hacer las notificaciones automáticas puesto que no hay demasiados objetos en un formulario que dependan de otros y además tenemos las reglas en cascada del sistema de base de datos (llaves externas). La clase Builder se llama dentro de cada constructor de cada Modelo de Datos y se denomina $constructor, que toma los campos que lee el Modelo de datos de la base de datos y construye las Chain of Responsibility en función de su esquema de llaves (Foráneas o ExternasPrimarias) ,para construir dicho esquema podéis usar la herramienta de vuestro motor de sistema de base de datos. En mi caso uso MySQL Workbench, aquí un ejemplo con activadores (triggers): revisión 1. Finalmente, la relación queda almacenada en una estructura de datos de la clase del Modelo de datos y en este caso usamos un funciones aunque lo mejor sería hacerlo con otra clase que encapsularíamos mediante el patrón Command o incluso podríamos usar un patrón Decorator para hacer lo mismo que hago en mi caso pero añadiendo las funcionalidades extra en los objetos.

Para crear los formularios asociados al modelo de datos donde se recogen un conjunto de campos se puede utilizar un patrón Factory Method, de modo que usaremos Iterators y Mediators para conectar $formularios asociados a la clase principal $web con las clases del patrón Factory Method, así, usando la configuración de un esquema de formulario (aquí se puede usar el patrón Strategy) almacenado en la base de datos podemos matener una correlación con los datos insertados por los usuarios de forma transparente e inteligente. Para mostrar dichos datos usaremos Visitor de forma que se pueden mostrar datos en distintos formatos sin modificar el visualizador del MVC. Si en nuestra administración queremos poner un comando deshacer, podemos asociar un patrón Memento, pero debe de estar unido a un patrón Observer, para que cuando un campo cambie, cambie los formularios asociados a este así como los campos que son interdependientes, ejemplo: un listado de pacientes de un hospital, si cambiamos en una hoja del historial el tamaño de su campo Nombre o el contenido del mismo, (además de actualizarse en cascada por el esquema de la base de datos) debe notificarse al resto de objetos implicados.

 

La intención de este post es comenzar con la primera iteración en el proyecto para construir webs usando Ingeniería del Software sin tener que perder tiempo de desarrollo, sino, más bien, haciendo las cosas bien desde el principio y para que las próximas veces ni tan siquiera tengamos que preocuparnos por la base para empezar a implementar la web.

 

 

 

Para la versión JavaScript y JQuery de los patrones de la web usad el siguiente libro.

* Actualización (Junio 2011): Libros recomendados en este servidor: Code as Design de Jack Reeves – Presenta la noción de que la programación es fundamentalmente una actividad de disco y que solo al final como representación de este diseño se encuentra el código en sí mismo. Y el otro libro es : Managing the Development of Large Software Systems de Winston Royce – ilustrativo documento donde se explica genialmente el proceso de diseño de software tal como debería ser el ciclo de desarrollo como una cascada de agua “waterfall”.


Mini aplicación web AJAX con gestor de contenidos

En este caso la aplicación web es un catálogo de minitractores con categorías, edición de atributos en los productos y animaciones con JQuery. Contiene un buscador rápido de contenidos,la administración de la información de la empresa se hace con texto enriquecido y el framework utilizado es zenphp.


Ver vídeo en youtube con explicaciones

Design by: Agencia Q4.

Aplicación web y tecnologías a medida

Esta aplicación web hecha a medida con la plantilla de un diseñador web muestra como se puede adaptar en poco tiempo el contenido de una página a las peticiones de un cliente y un administrador. Todo el contenido es editable: animaciones con JQuery, validaciones, objetos flash incrustables, rutas de miga de pan, direcciones (url’s) amigables (SEO) editables desde la administración, jerarquía de categorías administrable, galería de imágenes, etc.

vídeo en youtube con explicaciones sobre la imagen

El diseño corre a cargo de la empresa Agencia Q4.

Página 1 de 212
footer
jbelon © | sitemap.xml