Anuncios

Bienvenidos sean a este post, en el post anterior creamos nuestro servidor y dos clases, una para obtener la ip del equipo y asignar un puerto y el que hara de servidor, hoy nos centraremos en el segundo.

Anuncios

Con lo dicho anteriormente vamos a nuestro objeto obj_servidor y agregaremos un nuevo evento de tipo Create, una vez generado le agregamos el siguiente codigo:

if (global.puerto_server < 65535)
{
	++global.puerto_server;
}
else if (global.puerto_server > 49152)
{
	--global.puerto_server;
}

reintentar = -1;

server = network_create_server(
		network_socket_tcp,
		global.puerto_server,
		2);
Anuncios
Anuncios

En este caso tendremos un condicional donde primero verificamos si puerto_server es menor que 65535, si se da el caso lo incrementamos en 1, luego tenemos otro condicional donde verificamos si puerto_server es mayor a 49152, y en caso de ser verdadero lo decrementamos en 1, esto lo hacemos porque si intentamos conectarnos directamente puede suceder que figure como ocupado y nuestro server no se pueda crear, por ello debemos hacer esta simple operacion para que el servidor real crea que esta asignando otro puerto, despues agregamos una nueva variable llamada reintentar con el valor -1 pero de esto hablaremos en un rato, lo siguiente sera crear otro servidor pero esta vez lo haremos de tipo TCP y con un limite de conexiones en 2 y no solamente de 1, nuestro siguiente paso sera agregar el siguiente condicional:

if (server < 0)
{
	reintentar = show_question_async(
			"Fallo la creacion, reintentar?");
}
Anuncios

En este caso volvemos a verificar si server es menor a 0, recuerden que esto significa que no se pudo iniciar el server pero esta mostraremos un mensaje de pregunta por medio de show_question_async, este es similar a show_question pero es asincronico, lo cual como dijimos en el post anterior no detiene los procesos en la espera de una respuesta, en este caso preguntaremos si desea volver a intentar crear o levantar el server y si deseamos reintentar, la eleccion presionada la guardaremos en reintentar pero por ahora solo lo almacenaremos, agreguemos el siguiente condicional:

if (!global.vars_servidor_iniciadas)
{
	sockets[1] = -1;
	sockets[0] = -1;
	network_array_pos = 0;
	
	datos_a_enviar = buffer_create(
					2400,
					buffer_fixed,
					4);
	global.vars_servidor_iniciadas = true;
}
Anuncios

En este condicional verificaremos si vars_servidor_iniciadas no es verdadera, lo cual no es cierto porque no la definimos en ningun momento, es decir que no tiene ningun valor pero despues lo asignaremos, por el momento vamos a suponer que es false, por ende se va a ejecutar el bloque cuando iniciemos el objeto.

Anuncios
Anuncios

Dentro de este bloque crearemos un array llamado sockets y observen que definimos dos posiciones con el valor -1, esto equivale a la cantidad de sockets que recibiremos pero con esto solo los iniciaremos, la siguiente sera para definir en que posicion del array comenzaremos, lo siguiente sera crear una variable que usaremos como buffer, datos_a_enviar, en ella crearemos un nuevo buffer pero observen que el tamaño no es de 32 sino de 2400, esto lo hacemos asi porque tenemos un tamaño de room de 2048 x 348 y ese sera el limite de datos que usaremos para enviar, si lo observan es la suma del ancho mas el alto del room, volvemos a usar buffer_fixed y por ultimo no pasamos 1 sino 4, esto es debido que la alineacion a utilizar sera de 4 bytes por vez, lo siguiente sera cambiar el estado de vars_servidor_iniciadas a true esto lo haremos porque mas adelante veremos como podemos dar la posibilidad de volver a crearlo en caso de falla y volveremos a pasar por este evento por cada reintento y con esto evitaremos que se vuelve a crear otro buffer de manera innecesaria, con esto completamos el evento Create.

Anuncios

Nuestro siguiente paso sera agregar un nuevo evento, en este caso sera Asynchronous -> Async Dialog, una vez creado agregaremos el siguiente condicional:

if (reintentar == ds_map_find_value(async_load,"id")
		&& ds_map_find_value(async_load,"status"))
{
	show_message_async("Si el problema persiste,"
		+ "cierre el servidor y pruebe mas tarde");
		event_perform(ev_create,0);
}
else if (reintentar == ds_map_find_value(async_load,"id"))
{
	game_end();
}
Anuncios
Anuncios

En este caso el condicional verifica si reintentar almaceno si presionamos Ok o Cancelar, el primer condicional verifica si presionamos Ok, para ello usamos nuevamente a async_load dado que id es donde se almacena el indice de la pregunta vista anteriormente y usamos a status para saber si es verdad que presionamos este boton, en este caso mostraremos una notificacion de que si la falla es constante probemos de cerrar el servidor y probemos mas tarde, pero por detras vuelve a usar el evento Create para volver a generar el servidor, el else donde solo verifica el id considera que se apreto fue Cancelar, dado que ahora no comparamos si id es igual a true se considera que no se presiono Ok y por ende llamamos a game_end para cerrar el juego, con esto hemos terminado una parte del servidor pero nos resta una parte mas.

Anuncios

Antes de terminar vamos a solucionar el inconveniente de vars_servidor_iniciadas, dado que no podemos definirlo en el Create, para eso podemos eliminar el condicional y listo pero para evitar esto y que trabaje correctamente crearemos un nuevo room para iniciar esta variable, tal como vinimos haciendo con otros proyectos, en este caso crearemos uno llamado rm_setup y una vez generado iremos por medio de Creation Code al codigo de este room para agregar el siguiente codigo:

global.vars_servidor_iniciadas = false;
room_goto(Room1);
Anuncios

En este caso iniciamos a la variable global con el estado de false y luego usamos un room_goto direccionado al Room1, recuerden modificar el tamaño del nuevo room a 320 x 128 pero no es estrictamente necesario, con esto terminamos por ahora con el server.

Anuncios

En resumen, hoy hemos mejorado un poco nuestro objeto obj_servidor, hemos agregado la capacidad de crear un nuevo servidor, hemos visto como trabajar con algunas notificaciones de tipo asincronica, tambien hemos utilizado evento asincronicos para poder trabajar primero con la red y para luego trabajar con nuestro mensaje asincronico, en el proximo terminaremos el server, 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.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.00