Professional Documents
Culture Documents
Studio?
DS LISTS
DS MAPS
BUFFERS
http://juegosluzplateada.blogspot.com.ar/2013/03/3-que-significa-tcp.html
Es importante que hayas ledo las entradas del blog al principio del post, que
mencionan conceptos bsicos! Si no las has ledo, te doy otra oportunidad.
Bien, vamos a lo que en verdad nos interesa, para que toda la magia surja,
obviamente necesitamos al servidor, para ello contamos con la funcion:
network_create_server(type, port, max_client);
Esta funcin es utilizada para crear un nuevo servidor.
La funcion devolver un Identificador Unico (de ahora en mas ID), si se pudo
crear correctamente el servidor. Es importante que la guardemos en una
variable para luego usarla como referencia en otras funciones.
Ahora, en el caso de que no se pueda crear o haya ocurrido algo anormal
entonces devolver un valor menor a 0.
Parametros:
type: es el tipo de protocolo que vamos a usar para transferir datos, aqu
Eventos asncronos
- What the... hell? :S
- Tranquilo Brother, deja que te explique...
Los eventos asncronos son algunos de los eventos que pueden ser gatillados
dentro de una instancia y que pueden contener cdigos y acciones.
Gatillar se considera, lanzar o activar un evento, cuando ocurre algo en
especial o se cumplen determinadas condiciones o cuando se llama a una
funcin asncrona, por ejemplo: get_string_async(...).
Estos famosos eventos asncronos estn disponibles como eventos dentro de
un objeto. Vamos, donde estan create, step, alarm...
Dialog
Networking
Esta funcin dispara el evento asncrono dialog. Y como sabemos, all, dentro
de ese evento se crea un ds_map, llamado async_load que tendr entradas
especiales.
En nuestro caso, es un cartel que pide nuestro nombre.
Entonces, vamos al evento asncrono dialog y comencemos:
Primero, nuestro mapa async_load, tiene 3 diferentes entradas (o palabras):
Luego agregamos la parte que pedimos una direccin para poder conectarnos.
Esto lo haremos desde un evento de mouse left key pressed, para que cada
vez que presionemos en nuestro boton obj_cliente, nos pida una IP, y un
numero de puerto.
obj_boton_server
obj_cliente
case network_type_data:
//Recibimos datos
break;
}
As entonces podremos operar los datos recibidos, ms las entradas adicionales
por cada motivo, de manera conveniente para realizar algunas acciones, como
enlistar jugadores, quitarlos de una lista, reenviar datos, etc...
Ahora, vamos a suponer que se nos conecta un nuevo cliente a nuestro
servidor. Entonces, se activar el evento asncrono, se obtendr un valor y
almacenar en la variable MOTIVO, luego esta ser evaluada y entrar en el
caso de los clientes conectados, o sea, network_type_connect.
Nosotros vamos a enlistar a los jugadores que vayan llegando. Pero solo es con
fines del ejemplo, se puede hacer lo que al programador se le antoje.
Bien, para ello vamos a necesitar el uso de las ds_list funciones nativas de
Game Maker Studio para crear listas dinmicas. Para ello contamos con la
funcin:
ds_list_create();
la cual nos crea una lista dinmica y nos devuelve un ID nico que nos servir
para hacer referencia a dicha lista en caso de que la necesitemos para otras
funciones.
Convenientemente vamos a crear nuestra lista en el evento create, de la
siguiente forma:
lista_jugadores = ds_list_create();
Entonces as nos aseguramos de guardar el ID de nuestra lista en
lista_jugadores para luego poder referirnos a ella.
Ahora que tenemos una lista creada, bastara llenarla con los jugadores que
vayan entrando a la sesin. Entonces volvemos al evento asncrono donde
tenemos el switch, y dentro del case donde se verifica la conexin de un
cliente, usaramos una funcin para agregar un elemento a nuestra lista
lista_jugadores, la cual es:
ds_list_add(id_lista, valor);
Esta funcin nos permite agregar un valor a la lista, ya sea en formato de
numero o de cadena. Siempre se agrega al final.
Argumentos:
2-Modificar la lista
Para quitar un valor de la lista, contamos con la funcin:
ds_list_delete(id_list, pos);
con esta funcin borramos en la lista id_list el valor en la posicin pos.
Argumentos:
id: ID de la lista en donde queremos borrar un valor.
pos: posicin del valor que queremos quitar.
El nico problema que tendramos es que los jugadores se conectan en un
orden especfico, al momento de desconectarse no lo haran en el orden
inverso. Me refiero que el ltimo en entrar no sera necesariamente el primero
en salir. Por lo que no sabramos la posicin exacta de un valor en la lista.
Para lidiar con esto contamos con la siguiente funcin:
ds_list_find_index(id_list, val)
esta funcin nos devuelve la posicin de val dentro de la lista id_list. Si no
est dentro de la lista devolver -1
Argumentos:
Buffer fijo: una vez que se crea dicho buffer con un determinado
tamao, al llenarse no pueden agregarse mas datos.
Buffer envolvente: una vez que se llega al limite del tamao de dicho
buffer, ste vuelve al principio para sobre escribir los datos que ya
hayan, hasta ocupar el espacio faltante.
type: tipo y tamao del dato que vamos a escribir. Game Maker Studio
cuenta con diversas constantes que reprensentan muchos tipos de datos,
voy a listar solo algunas para ms, busca en el manual en el apartado
de buffer_write. Algunas son:
buffer_u8 = un entero de 8 bits sin signo. Esto quiere decir que el
valor tiene que ir de 0 a 255
buffer_s8 = un entero de 8 bits con signo. Esto quiere decir que el
valor a escribir debe ir de -128 a 127 (el 0 se considera positivo)
buffer_u16 = Un entero de 16bits sin signo. El valor a escribir debe
ir de 0 a 65.535
buffer_s16 = Un entero de 16 bits con signo. El valor a escribir debe
ir de -32.768 a 32.767
buffer_string = Una cadena de cualquier tamao.
Algo importante que se debe saber es que cuando se lee o se escribe dentro de
un buffer, hay como un indice dentro de este que indica la posicin donde se
termin de escribir (o leer).
Es como dejar un marcador dentro de un libro, comienzas el libro, lees 5
paginas y dejas el marcador all, luego la siguiente vez que vuelves a leer el
libro este marcador avanzar desde donde te quedaste.
Cada tipo de buffer tiene si tamao en bytes, dejo una tabla de los ya
mencionados, para ms, vase el manual.
TIPO DE DATO
ESPACIO EN BYTES
buffer_u8
buffer_s8
buffer_u16
buffer_s16
buffer_string
*N/A
case network_type_data:
var paquete_recibido = ds_map_find_value(async_load,
buffer); //obtenemos el buffer que nos envia un cliente
buffer_seek(paquete_recibido, buffer_seek_start, 0); //nos
aseguramos de comenzar a leer desde el inicio.
Var ID_PAQUETE = buffer_read(paquete_recibido, buffer_u8);
//leemos el indice del paquete que nos enviaron
switch(ID_PAQUTE) //Evaluamos el indice de dicho paquete
{
case 10: //nos dice que recibimos un paquete de
coordenadas
//Leemos las coordenadas, como se ve, tengan en cuenta
que se leen en el orden en el cual estn definidas en el paquete del cliente.
player1_x = buffer_read(paquete_recibido, buffer_s8);
player1_y = buffer_read(paquete_recibido, buffer_s8);
break;
}
break;
Ya con esto el servidor puede procesar los datos que envi el cliente. En este
caso los guarda dentro de las variables player1_x y player1_y. Que pueden ser
interpretadas de cualquier forma que se desee dentro del programa.
Si quisiramos enviar datos del servidor al cliente, es exactamente el mismo
proceso:
-Crear un paquete
Colocarle una ID y los datos
-Enviarla al cliente
y finalmente, el cliente debera procesar los datos como crea conveniente.
Eso es todo... muuuuuuuuuuuy extenso, pero bueno! Es lo que se requiere
para hacer un juego en linea TCP.
Espero que les haya servido. Y si desean compartir el tutorial, bienvenido sea!
Los crditos son agradecidos.
Cualquier pregunta es bienvenida!
Black_Cat