• No se han encontrado resultados

Implementación del servidor

In document Juegos Arcade online sobre mapas reales (página 87-93)

El servidor como bien se ha ido relatando en capítulos previos es el encargado de realizar todos los cálculos. Para llevar a cabo la implementación se ha divido las clases en paquetes con temáticas similares. La única clase no introducida en ningún paquete es la clase Main del Servidor. Dicha clase únicamente crea un objeto de la clase SuperServidor, sirve para arrancar éste. A continuación daremos un esquema de los paquetes con sus clases, y más abajo se explicarán en detalle.

Paquetes y clases:

Utilidades: Es el paquete que concentra todas las utilidades que se utilizarán en otras clases.

o UtilidadesXML: Es la clase encargada de ejecutar el algoritmo.

o Utilidades: dispone de la mayoría de las funciones utilizadas para transformar unidades (como por ejemplo pasar de pixeles a coordenadas), calcular distancias entre puntos, etc.

o Jugador: Como su nombre indica define a un jugador junto sus métodos y atributos.

o Calibrar: Es el encargado de pasar de coordenadas de los mapas a pixeles de nuestra pantalla. Tiene unos valores adecuados a nuestras circunstancias.

o Coordenada: Define lo que es una coordenada, sus valores de latitud y longitud como atributos y lo que podemos hacer con ella.

o Pixel: Identifica a los puntos de las pantallas.

o PtosCardinales: Esta clase define los puntos cardinales (norte, sur, este, oeste). Se creó en la primera aproximación al algoritmo.

o Vector: Define un vector sobre el plano. Tiene como atributos un punto y dispone de métodos para calcular su módulo, distancia a otro punto, etc.

Socket: paquete con todo lo relacionado con la arquitectura cliente-servidor. También la comunicación entre ambas partes.

o SuperServidor: Encargado de atender la primera conexión del cliente, y quedar a la espera de futuras peticiones.

o SocketServidor: De ésta heredan todos los juegos. Se encarga de todas las comunicaciones con el cliente y va a ejecutar los juegos. Será una especie de controladora de que todo se ejecute pero sin involucrarse en la lógica propia de cada juego.

Juegos: Aglutina todos los juegos. Todos ellos heredan de la clase Socket Servidor ya que comparten la comunicación mediante sockets con el cliente.

o ComeCocos: Implementa la lógica propia del juego del comecocos. o PillaPillaSolo: Encargado del juego del pilla pilla.

o Snake: Define en ella el juego de la serpiente. o PinchaGlobos: Es el juego del pincha globos. o MonoPlatanero: Juego del mono platanero.

Procedemos a introducirnos en materia en cuanto al desarrollo de cada clase:

 UTILIDADESXML

Define el algoritmo que se usa para el desplazamiento a través del mapa. Es una de las que mayor importancia tienen. Ha sido explicada con bastante detenimiento y esmero en capítulos anteriores por esta razón en este punto únicamente la citamos.

 UTILIDADES

Esta clase aglutina muchas de las utilidades que se usan en otras clases. No dispone de atributos, únicamente de métodos porque es verdaderamente para lo cual lo utilizamos. Los métodos de los que dispone son:

-Cambiar extensión de un fichero

String cambiarExtension(String filename){ return filename.replaceAll("osm", "xml"); }

-Calcular la distancia entre dos puntos

public double distancia (double x, double y){ if (x>0&&y>0||x<0&&y<0)

return Math.abs(Math.abs(x)-Math.abs(y)); return Math.abs(x)+Math.abs(y);

}

-Transforma la latitud de una coordenada a metros public double latitudAmetro(double gradosLat){ return 111133*gradosLat;

}

-Transforma la longitud a metros

return 111320*Math.cos(gradosLat)*gradosLong; }

-Método que pasa una coordenada dada en metros a pixeles

public Coordenada MetrosAPixel(Coordenada coordAct,double minLat,double minLon,double maxLat,double maxLon,int altoPant,int anchoPant){

Coordenada coordPix=new Coordenada();

double diferenciaLat= this.calcularDistanciaCoordenadasLat(minLat,maxLat); double diferenciaLong=this.calcularDistanciaCoordenadasLong(maxLon,minLon,minLat,m axLat); double relLat=altoPant/diferenciaLat; double relLong=anchoPant/diferenciaLong; double latAm=latitudAmetro(coordAct.getLatitud());

double lonAm=longitudAmetro(coordAct.getLatitud(), coordAct.getLongitud()); double latesquinam=latitudAmetro(minLat);

double lonesquinam=longitudAmetro(minLat,maxLon); double distPtoOrigenlat=distancia(latAm, latesquinam); double distPtoOrigenlon=distancia(lonAm, lonesquinam); double pixX=(distPtoOrigenlon*relLong); double pixY=(distPtoOrigenlat*relLat); coordPix.setLatitud(pixY); coordPix.setLongitud(pixX); return coordPix; }

Únicamente hemos expuestos los que nos parecían más interesantes. El resto se pueden consultar en el código fuente.

 JUGADOR

Es la clase que define a nuestro jugador. Tiene como atributos: la posición donde esta,

no sea posible verlos, puntos ganados, imagen de su icono, un suceso de lo que le ha ocurrido. Los métodos que dispone son accesores y modificadores de sus atributos. En su constructora se inicializan éstos.

 CALIBRAR

Es el encargado de hacer el calibrado, pasar puntos de la imagen real a puntos en la pantalla, y aún siendo diferentes escalas conseguir que todo se mantenga en el mismo lugar. Se necesitará los valores de máximas y mínimas longitudes y latitudes. El proceso en sí está explicado detalladamente con anterioridad.

 COORDENADA

Como su nombre indica, define una coordenada. Tiene dos atributos de tipo double que son la longitud y latitud, los valores que identifican el punto en la Tierra. Dispone de métodos básicos para acceder a las variables y modificarlas. Se ha redefinido el método para identificar si son dos coordenadas iguales. También se redefinió el método hashcode.

 PIXEL

Es un punto de la pantalla, del eje de cartesianas de dos dimensiones. Queda identificado por dos enteros. Tiene métodos básicos para usar la clase, accesores y modificadores. Igual que en el caso anterior se ha redefinido el método equals y hashcode.

 VECTOR

Es un vector centrado en el origen. Lo podemos usar como punto ya que únicamente tiene dos atributos de tipo double y los métodos para manejar estos atributos. Además tiene métodos propios de los vectores como el cálculo de su módulo, producto vectorial entre dos de ellos.

double ProductoEscalar(Vector v1,Vector v2) {

return ((v1.getX() * v2.getX()) + (v1.getY()* v2.getY())); }

//Función que haya el módulo del producto vectorial de vectores con signo double ModuloDelProductoVectorialConSigno(Vector v1,Vector v2) { return ((v1.getX()* v2.getY()) - (v1.getY() * v2.getX()));

}

double modulo(){

return (Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))); }

 SUPERSERVIDOR

El objeto de esta clase cuando se crea entra en un bucle esperando clientes. Es la encargada de atender la primera vez a cada cliente. Y luego delega en socketservidor para futuras conexiones del cliente. Antes de esta delegación del trabajo, se ocupa de asignar un número de puerto diferente a cada juego nuevo que entra. La ejecución del juego se va a comunicar a partir de entonces con este nuevo número de puerto. Así conseguimos que haya varios juegos en máquinas diferentes utilizando como servidor esta clase simultáneamente.

 SOCKETSERVIDOR

De esta clase heredarán todos los juegos, es una de las clases claves en la interconexión. Una vez que el SuperServidor ha hecho su trabajo, crea un objeto de esta clase que va a implementar el juego.

Para poder estar a la escucha de futuras peticiones de nuestro cliente, un cliente ya fijo, entrará en un bucle infinito. Cuando alguno de los dos necesite comunicarse abrirán conexión por el puerto que nos había indicado el SuperServidor. Este puerto es únicamente para comunicarnos durante este concreto juego. Si entrase un nuevo cliente para iniciar un juego accedería a SuperServidor y con un número de puerto conocido. Para obtener más información sobre esta clase se puede consultar en el apartado (ver capítulo 4) de la comunicación entre cliente y servidor donde ha sido explicada detenidamente, ya que juega un papel importantísimo.

 PAQUETE DE JUEGOS

Cada una de las clases que conforman este paquete implementa un juego diferente. Todas ellas heredan de SocketServidor. Este paquete ha sido explicado extensamente en un apartado de este texto exclusivamente.

Cada clase implementa el juego que indica su propio nombre. La clase comecocos implementa el juego del comecocos, la clase Snake implementa el juego de la serpiente (“snake” en inglés) y así para PinchaGlobos, MonoPlatanero y PillaPillaSolo.

In document Juegos Arcade online sobre mapas reales (página 87-93)

Documento similar