Bienvenidos sean a este post, hoy haremos los ultimos pasos sobre nuestro servidor para poder terminarlo de una vez.
En el post anterior llegamos a ver como trabajar con algunos estados de la conexion de red y en el ultimo case mencionamos la utilizacion de un script, hoy nos centraremos en ese script y un evento mas.
Una vez comentado todo comencemos con la creacion de un script, para ello deben ir al Asset Browser, buscan la carpeta Scripts, hacen click con el boton derecho y seleccionen Create -> Script, lo llamaremos scr_maneja_datos, una vez generado el script le agregaremos el siguiente codigo:
function scr_maneja_datos(argument0, argument1){
buff = argument0;
cliente_a_enviar = argument1;
buffer_seek(buff, buffer_seek_start, 0);
jugador_x = buffer_read(buff, buffer_f32);
jugador_y = buffer_read(buff, buffer_f32);
sprite_jugador = buffer_read(buff, buffer_f32);
subimagen_jugador = buffer_read(buff, buffer_f32);
jugador_escalaX = buffer_read(buff, buffer_f32);
buffer_seek(datos_a_enviar,buffer_seek_start, 0);
buffer_write(datos_a_enviar, buffer_f32, jugador_x);
buffer_write(datos_a_enviar, buffer_f32, jugador_y);
buffer_write(datos_a_enviar, buffer_f32, sprite_jugador);
buffer_write(datos_a_enviar, buffer_f32, subimagen_jugador);
buffer_write(datos_a_enviar, buffer_f32, jugador_escalaX);
network_send_packet(sockets[cliente_a_enviar],
datos_a_enviar,
buffer_tell(datos_a_enviar));
}
Nuestro primer paso sera crear una variable llamada buff a la cual le asignaremos el primer argumento, si van al post anterior veran que le enviamos el buffer en async_load, la segunda variable sera para el cliente que debemos enviar el buffer, si volvemos al post anterior veran que dependiendo el condicional pasamos 1 o 0, estos equivalen a las posiciones en el sockets, despues tendremos cinco lineas que usaran a buffer_read para leer el buffer que informamos, veamos que datos reciben cada uno:
- jugador_x, recibira el primer dato y sera la posicion en el eje X
- jugador_y, recibira el segundo dato y sera la posicion en el eje Y
- sprite_jugador, recibira el tercer dato y corresponde al sprite del jugador
- subimagen_jugador, recibira el cuarto dato y corresponde a la subimagen del jugador
- jugador_escalaX, recibira el quinto dato y corresponde que escala usamos para el eje X
Con esto ya tenemos los datos basicos de cada uno de los jugadores, el siguiente paso sera volver a recuperar el principio del buffer que pasamos, esto lo haremos mediante los siguiente pasos donde usaremos buffer_write para reescribir los datos que obtuvimos antes en el buffer en el mismo orden que los obtuvimos, y en todos los casos pasamos los datos de la siguiente forma:
- Primero el buffer
- Seguido del tipo de buffer, recuerden que es para 32 bits el que usamos
- El dato a escribir en el buffer
Por ultimo enviamos por la red al buffer por medio de network_send_packet, al igual que vimos en el post anterior pero recordemos como lo hicimos:
- Primero usamos el socket que corresponde por medio del informado al comienzo (cliente_a_enviar)
- El segundo es el buffer que estuvimos trabajando
- El tercero volvemos a usar buffer_tell para que no use el tamaño total si no lo que escribimos en esta ultima modificacion
Con esto concluimos con el script pero todavia nos falta un paso mas para concluir con nuestro servidor, esta modificacion que haremos sera para informar a los clientes cuando el servidor sea cerrado, esto es debido a que el cliente no posee la capacidad de chequear esto y por ende lo haremos responsable al servidor, para comenzar agregaremos un nuevo evento Other -> Game End, una vez creado agregaremos el siguiente codigo:
if (sockets[0] != -1 && sockets[1] != -1)
{
buffer_seek(datos_a_enviar,
buffer_seek_start,
0);
buffer_write(datos_a_enviar,
buffer_f32,
-2);
for(i = 0; network_send_packet(
sockets[0],
datos_a_enviar,
buffer_tell(datos_a_enviar)
) < 0 && i <5; ++i) {}
for(i = 0; network_send_packet(
sockets[1],
datos_a_enviar,
buffer_tell(datos_a_enviar)
) < 0 && i <5; ++i) {}
network_destroy(server);
buffer_delete(datos_a_enviar);
}
Si lo observan es similar a cuando nos desconectamos del servidor como vimos en el post anterior, primero chequearemos si las dos posiciones de sockets son distintas de -1, si es verdad volveremos a buscar el principio del buffer y luego escribiremos el buffer con el valor de -2, ahora entra en accion algo distinto usaremos un bucle for que intentara enviar el buffer por la red cinco veces, para ello iniciaremos el bucle con una variable llamada i con el valor de 0, luego enviaremos el paquete con el ultimo buffer a la posicion 0 de sockets pero esto tambien lo usaremos como condicional porque si observan despues del envio del paquete ponemos que sea menor a 0 y usamos un operador AND para que verifique que i sea menor a 5, por ultimo incrementamos el valor de i por cada vuelta.
El condicional que usamos es debido a que si el valor del envio del paquete es menor a 0 se debe a que fallo el envio por alguna razon, la cual no nos concierne para este programa, y mientras i sea menor a 5 si se cumplen las dos condiciones repetira este ciclo 5 veces y pasara al siguiente bucle, pero si se pudo enviar el paquete saldra del bucle y pasara al siguiente, como la unica tarea la hicimos en el condicional no fue necesario ingresar instrucciones en el bloque del bucle, despues tenemos el mismo bucle pero esta vez sera para la segunda posicion o posicion 1 de sockets, es exactamente lo mismo al anterior pero una vez terminado pasamos a destruir el servidor y eliminar el buffer.
Estos bucles son la solucion mas practica que tenemos para generar una pausa o reintento para que funcione correctamente, si bien se podria haber usado un sleep este comando ya no existe mas en el lenguaje porque fue reemplazado por las alarmas pero porque no usar la alarma en lugar de esto? Esto es debido a que usamos un evento Game End y nada puede ejecutarse para este evento, ergo nos anula el uso de alarmas,, con esto tenemos realmente completo el servidor, solo nos resta hacer unas modificaciones en el cliente pero sera en el proximo post.
En resumen, hoy hemos terminado el servidor, hemos creado un script que se encargara de manejar los datos del juego para enviarlos por medio de la red para ambos clientes, hemos visto como recuperar los datos del buffer y luego volvimos a escribir el buffer para enviarlo por la red, para finalmente agregar un evento cuando se cierre el servidor el cual se encargara de enviar las notificaciones a los clientes de que el servidor se ha cerrado y por ende dejaran de verse entre si, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.00
