Anuncios

Bienvenidos sean a este post, en el post anterior terminamos el servidor pero hoy nos centraremos en el cliente que se conectara.

Anuncios

Si bien el cliente lo tenemos parcialmente creado porque es nuestro juego en si, nuestro primer paso sera crear un objeto para el cliente dentro del proyecto del juego al cual llamaremos obj_cliente, una vez creado agregaremos un evento Create y a este evento le agregaremo el siguiente codigo:

get_string_async("Ingresa el servdor y puerto con el formato IP:PORT","");
jugador_dos = -1;
ip_server = "";
puerto_server = "";
conectado = false;
socket = network_create_socket(network_socket_tcp);
buff = buffer_create(2400, buffer_fixed, 4);
Anuncios
Anuncios

En este caso primero pediremos que ingresen la direccion ip del servidor junto al puerto con un formato especial, ya que estos dos datos debemos unirlos con los dos puntos (:), este dato no lo almacenaremos en ninguna variable porque despues por medio de otro evento obtendremos esta informacion, despues tenemos una variable llamada jugador_dos la cual tendra un valor de -1 para indicar que no existe todavia, lo siguiente son dos variables para almacenar la ip y el puerto del servidor respectivamente pero por el momento estaran vacias, despues tenemos una variable llamada conectado a la cual estableceremos como false, lo siguiente sera la creacion del socket de tipo TCP y por ultimo estableceremos el buffer tal como vimos en el servidor para poder manejar todos los elementos del room, con esto completamos el evento Create pasemos al siguiente tema.

Anuncios

El siguiente paso sera agregar un nuevo evento de tipo Asynchronous -> Async Dialog, una vez creado le agregaremos el siguiente codigo:

datos_server = ds_map_find_value(async_load, "result");
ip_server = "";
puerto_server = "";
separador = false;

if (datos_server == "")
{
	get_string_async("No fue informado el servidor.\n Recuerda que el formato debe ser IP:PORT","");
}
else
{
	for(i = 1; i < string_length(datos_server) + 1; ++i)
	{
		substr = string_char_at(datos_server, i);
		
		for(var a = 48; a < 58 && separador; ++a)
		{
			if (substr == chr(a)) 
			{
				break;
			}
			else if (a == 57)
			{
				get_string_async("Puerto invalido\n"
				+ "Recuerda que el formato es IP:PORT",
				"");
			}
		}
		
		if (substr != ":" && !separador)
		{
			ip_server = ip_server + substr;
		}
		else if (substr == ":")
		{
			separador = true;
		}
		else
		{
			puerto_server = puerto_server + substr;
		}
	}
	
	if (puerto_server == "")
	{
		get_string_async("No se informo ningun puerto.\n Recuerda que el formato es IP:PORT","");
	}
	else if (network_connect(socket, ip_server, real(puerto_server)) < 0)
	{
		get_string_async("No se pudo conectar al servidor\nEsto es debido a que se informo mal"
			+ " la ip o el puerto o fallo la conexion\nRecuerda que el formato es IP:PORT", "");
	}
	else
	{
		conectado = true;
	}
}
Anuncios
Anuncios

Anteriormente dijimos que al momento de solicitar la IP y Puerto del servidor no necesitabamos guardarlo en una variable porque en este evento nos encargaremos de manipular esta informacion que ingresamos, lo primero que haremos es crear una variable llamada datos_server la cual recibira el valor ingresado anteriormente, luego volveremos a resetear el valor de ip_server y puerto_server porque pasaremos mas veces de lo que creen y por ultimo crearemos una variable llamada separador y la iniciaremos con el estado false, esta ultima variable la usaremos para identificar si encontramos el separador (:) que solicitamos anteriormente, pasemos al siguiente condicional.

Anuncios
Anuncios

El condicional primero verifica si los datos pasados estan en blanco, en caso de ser asi nos informara en pantalla que debemos ingresar los datos y le recordamos el formato, esto lo haremos constantemente, pero en caso contrario verificaremos como obtener los datos y que sean de formato correcto, para esto primero usaremos un bucle for que pasara por todo la variable datos_server, no comenzaremos desde 0 sino desde 1 y luego el condicional utilizara string_length para obtener el tamaño de datos_server pero lo incrementaremos en 1 para que pase realmente por todo la cadena, dentro del bloque primero obtendremos el caracter actual y lo asignaremos a substr, para ello usaremos a string_char_at la cual toma la cadena que le informemos, datos_server, y luego la posicion en base al valor del bucle, lo siguiente que tenemos es otro bucle for.

Anuncios
Anuncios

Este bucle se encarga de verificar si ingresamos bien el puerto, para esta ocasion usaremos un bucle que contara de 48 a 57 (el valor ASCII de los numeros) pero en esta ocasion el condicional sera mientras la variable sea menor a 58 y separador sea igual a true, es decir el bucle contara de 48 a 57 y si separador es igual a true ejecutara el bloque, en el bloque chequearemos si el valor obtenido en substr es igual al caracter de la vuelta del bucle, esto es gracias a chr, y en caso de ser verdadero sale del bucle de este bucle por medio del break, en cambio si sigue tenemos un condicional donde verifica que si la variable a es igual a 57 significa que substr no posee un numero y por ende debemos informarle al usuario que el puerto no es valido, finalizando con este bucle.

Anuncios
Anuncios

Despues tenemos un condicional donde verificamos si substr es distinto del separador que solicitamos (:) y a su vez separador sea false, en caso de cumplirse estas dos condiciones el valor de substr lo agregaremos al texto de ip_server, observen como previamente agregamos el contenido de esta variable y luego substr para generar la nueva cadena, luego tenemos un else if donde verifica si substr es igual al separador y en caso de ser verdadero establece a la variable separador como true, esto afectara al bucle anterior y por ende afectara al condicional anterior que no se ejecutara mas, despues tenemos un else donde el dato que tenemos en substr lo agregaremos a puerto_server tal como hicimos con la ip, esto es asi porque tenemos como true a separador y entendemos que ya pasamos de la ip del servidor al puerto del mismo.

Anuncios

Por ultimo tenemos un condicional para verificar varios temas, el primero verifica si puerto_server es igual a nada, en caso de ser verdadero mostraremos un mensaje notificando la falta del puerto para que lo ingresemos, luego tenemos un else if donde verifica si la conexion al servidor es menor que 0, es decir que por alguna razon fallo, en ese caso volvemos a notificar el fallo de la conexion ya sea porque se informo mal la IP o el Puerto, o hubo alguna falla en el servidor, y por ultimo tenemos un else donde si ninguna de las dos condiciones se cumplio significa que todo salio correcto y nos conectamos al servidor y por ende establecemos a conectado como true, con esto terminamos el condicional y por ende el objeto pero en el proximo post completaremos lo faltante para probarlo definitivamente.

Anuncios

En resumen, hoy hemos creado al objeto que sera el cliente con respecto a nuestro servidor, sera el encargado de solicitar la informacion necesaria para conectarse al servidor, tambien hemos visto las instrucciones necesarias tanto para obtener la informacion de la ip como del puerto asi como tambien lo verificamos para que en caso de falla volvamos a solicitarle informacion al jugador, en el proximo post completaremos al cliente, 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
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.00