Otro juego de fútbol multiusuario en el cual colaboré con la programación del lado del servidor. Lo interesante que tuvo este proyecto es que había bots que jugaban junto con el jugador y en su contra utilizando agentes y máquinas de estado.
Otra cosa que me gustó de este proyecto es que apliqué "nuevas técnicas" que me permitieron desarrollarlo en tiempo récord desde cero.
Cuando manejamos herencia, a veces es necesario poder diferenciar entre varias clases heredadas. Una forma ordenada de hacerlo, es declarar una variable tipo que nos identifique con que clase estamos trabajando. Otra opción es realizando un casting dinámico para aprovechar las propiedades RTTI (Run-time type information) de los objetos de C++. Si el casting nos regresa NULL es que no es del tipo que nos interesa.
A continuación presento un ejemplo que ilustra esta técnica:
#include <iostream>
usingnamespace std;
class Figura {
public:
// Es importante que la clase base sea polimorfica agregándole al menos una función virtual:
virtual ~Figura(){};
};
class Triangulo : public Figura {
};
class Cuadrado : public Figura {
};
main(){
Figura *figura1 = new Cuadrado;
Figura *figura2 = new Triangulo;
Esta es una pequeña prueba de concepto de como se pueden llamar objetos remotos java desde Flex usando Linux y Tomcat del lado del servidor.
Creación de la aplicación web en Tomcat
1. Dentro del directorio webapps, creamos el directorio de nuestro proyecto (p.e. blazeds):
mkdir webapps/blazeds
2. Bajamos la distribución binaria de BlazeDS de su página de Internet y la desempaquetamos en un directorio temporal.
3. Copiamos el archivo blazeds.war al directorio de nuestro proyecto y lo desempaquetamos.
4. Borramos el archivo .war.
5. Opcionalmente, agregamos la siguiente línea al archivo de configuración conf/server.xml dentro del tag de Host, para que tengamos bien definido el directorio de nuestra aplicación:
Para este ejemplo, creamos una pequeña clase en Java, en el directorio WEB-INF/src que simplemente nos de la hora:
import java.util.Date;
publicclass Sereno {
publicString getTime(){ Date now = newDate(); return"The time is: " + now; }
}
La compilamos con:
javac Sereno
La copiamos al directorio classes.
Ahora que todo esta listo del lado del servidor, declaramos nuestra clase agregando las siguientes lineas al tag service del archivo flex/Remoting-config.xml:
<destinationid="blazeds"> <properties> <!-- El nombre de nuestra clase --> <source>Sereno</source> </properties> </destination>
Creación de la aplicación Flex
Del lado del cliente, necesitamos crear un archivo de configuración services-config.xml que más adelante se utilizará como un parámetro del comando mxmlc que compila nuestro código.
<!-- Con este id, llamamos al java desde flex --> <destinationid="blazeds"> <channels> <channelref="my-amf"/> </channels> </destination> </service>
</services>
<channels> <channel-definitionid="my-amf"class="mx.messaging.channels.AMFChannel"> <!-- Aqui tengo la ruta de donde se va a jalar las cosas, proviene del war de flex --> <endpointuri="http://192.168.1.100:8080/blazeds/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
Aquí tenemos el mxml (blazeds.mxml ) que vamos usar como ejemplo:
Al ejecutar el mxml, veremos una etiqueta vacia que al darle doble click, nos imprimirá la hora del servidor.
Conclusiones
De aquí en adelante, ya todo es creatividad. Por supuesto que se pueden usar frameworks como Spring para acelerar el desarrollo del lado del servidor. Pero lo importante de este post, era comprobar con una prueba de concepto lo bien que se llevan estas tecnologías y hacerlo "a manita" para aprender más. No es muy díficil hacer esto mismo con Flex Builder para el cliente y Eclipse para el servidor.