World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Todo aquello que no está relacionado con Gemix Studio ni con la programación DIV en general.

World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby erkosone » Wed Jan 24, 2018 5:21 am

Hola gente, vuelvo a colgar este post ya que con la caida del foro se ha perdido :)

Se trata de mi MMORPG "WORLD OF ISTHANIA", un rpg online donde podremos subir de nivel a nuestro personaje y luchar en algunas de las aventuras mas alocadas y divertidas que ni os podeis imaginar.

https://www.dropbox.com/s/urwcj2e0uraois3/test2.avi?dl=0

Tras muchos años de estudiar java, processing, multithreading, libs de red y demases locuras al final parece que no he perdido la cordura y todavia me queda algo de cerebro mas para emprender esta apasionante experiencia.

Si bien es verdad que visto desde fuera parece facil, el crear un MMO para mi está siendo toda una hazaña de nivel superior ya que una cosa es lo que parece que es y otra cosa es lo que es realmente y solo podia descubrirlo emprendiendo el programar un mmo propio.

He de decir que está siendo una experiencia bastante gratificante, pues estoy teniendo que estudiar nuevos temas y aprender nuevas tecnicas de acceso a datos concurrentes desde varios hilos de ejecución, y esto para mi es realmente fascinante.

Bueno que me enrrollo..

Lo que ya tengo yujuu!!!!!! "que se note que estoy super contento jaja"..

Sistema de comunicación a bajo nivel basado en la librería para transmision midi "Open Sound Control" por red la cual he de decir que funciona como un tiro de rápida.. impresionante. :D :D :D

Tengo la lib de red especifica y personalizada para mi juego online, el motor de colisiones por mapGetPixel() que para este tipo de juegos me parece muy bueno y la verdad es que en java funciona como un tiro de rapido también :)

También tengo mi fork de Div llamado "gameLibZERO" en 3 versiones, PC/LINUX/MAC acelerada por hardware, PC/LINUX/MAC por software, y ANDROID acelerada por hardware jeje. "Dentro de muy poco tengo pensado iniciar el port a JavaScript" y así por fin tener el "engine" disponible para todas las plataformas.

Sobre el juego en si, tengo ya el sistema de login, el sistema de registro de cuentas de usuario 'inGame', la creación de personajes..

Y lo que ya está operativo es el juego y el servidor dedicado, los clientes ya pueden crear su cuenta y logearse y pueden moverse por el mundo viendo el contenido..

He diseñado un sistema de listas dinamicas de objetos que creo que como concepto es también bastante interesante, se trata de que el servidor envia una lista de objetos en tiempo real al cliente descartando los que no son necesarios por "distancia al jugador", de esta manera el server solo envia el contenido que está cercano al player y así no se abusa del ancho de banda..

El sistema de control de personaje ingame está basado en encapsular bits en un INT32 y enviarlo en streaming al servidor..

También tengo creado un sistema que cada cierto tiempo envia al servidor un mensaje advirtiendo de que el player sige vivo y jugando.. vivo y sin juegar o que el player ha cerrado la APP. También si este mensaje no llega antes de un tiempo el servidor desconecta "kick" al player eliminando su instancia del servidor y actualizando su cuenta de usuario con su actual inventario y posicion.

Os dejo unas capturas muy feas de unos test del juego XD.. son todo place holder.. espero no provocar algun desprendimiento de retina.!
You do not have the required permissions to view the files attached to this post.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby CicTec » Wed Jan 24, 2018 10:43 am

erkosone wrote:El sistema de control de personaje ingame está basado en encapsular bits en un INT32 y enviarlo en streaming al servidor..

Hola erkos,

Se trata del sistema que explique en el thread que de momento se perdio ?.

erkosone wrote:También tengo mi fork de Div llamado "gameLibZERO" en 3 versiones, PC/LINUX/MAC acelerada por hardware, PC/LINUX/MAC por software, y ANDROID acelerada por hardware jeje. "Dentro de muy poco tengo pensado iniciar el port a JavaScript" y así por fin tener el "engine" disponible para todas las plataformas.

Una sugerencia, no uses el termino "fork de DIV" esta mal indicado y podria confundir la gente.

Un fork es la creación de un proyecto en una dirección distinta de la principal u oficial tomando el código fuente del proyecto ya existente (el original).

En tu caso no estas usando el codigo fuente original de DIV, tu libreria es un "clone de DIV" o sea un proyecto hecho por ingenieria inversa u otros metodos (sin utilizar el codigo fuente original) de sistema de computación basado en los diseños y desarrollos de otra compañía, fabricado para tener una compatibilidad del 100 por ciento o muy similar con el modelo original.

Ejemplos entre forks y clones:
Gemix: es un clone de DIV, fabricado por medio de ingenieria inversa y otros metodos, con escritura total del codigo fuente para ser 100% o casi igual con el modelo original.
DivDX: es un fork de DIV (actualmente) tomando el codigo fuente original del proyecto, con varios bugfix y porting a plataformas modernas.
Mi version de DivDX: es un fork del DivDX oficial, tomando el codigo fuente del mismo, con otros bugfix y funcionalidades no unificadas aun con el proyecto oficial.
DIV-GO: clone de DIV como Gemix, pero escrito en JS.
gameLibZero: clone de DIV, fabricado por medio de ingenieria inversa y otros metodos, con escritura total del codigo fuente en Java, para tener funcionalidades muy similar al modelo original.
CDIV: clone de DIV como gameLibZero, pero para lenguaje C.
User avatar
CicTec
 
Posts: 16553
Joined: Thu Jul 31, 2008 10:18 pm

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby Spiderman » Wed Jan 24, 2018 3:04 pm

Guuaauuu! Muy interesante tu proyecto Erkosone. Ademas que parece que ya lo tienes muy avanzado.


Vas a hacerlo tu solo o tendras gente que colabore contigo?
No hablo de la programacion, que imagino que te encargaras tu de todo. Me refiero mas que nada al tema graficos y musica.
User avatar
Spiderman
 
Posts: 761
Joined: Wed Feb 11, 2009 2:49 am

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby erkosone » Wed Jan 24, 2018 5:22 pm

@CicTEc si tio, en parte es lo que hablamos de encapsular datos en un int, pero no terminé de entender como encapsular datos byte en un int, la primera parte de la encapsulacion que es del cliente hacia el servidor ya está hecha, son boolean en un INT32, ahora me liaré a usar un int como un array de 4 bytes, con eso voy a ahorrar un monton mas de ancho de banda.

Al final te hice caso y he dejado de lado los String como contenedor de datos, son demasiado pesados y por algun motivo que desconozco son mas propensos a corromperse viajando por UDP que los propios INT, así que intento solo usar INT en las transmisiones para mantener una coherencia en el memory alloc y así facilitar los saltos por la memoria en los bucles que descomponen los datagramas en propiedades de los objetos. Osea que me llega al cliente una trama de datos tal como esta:

char int int int int int int int int int int int int.......

El char/byte inicial me indica que hacer con los datos, por ahora estos son los comandos que estoy usando por red mediante este char/byte:

/* NET COMMANDS */
Source Code (Java) [ Download ] [ Hide ]
  • final char NET_LOGIN    = 'a';
  • final char NET_PLAYER_CONTROLS = 'b';
  • final char NET_LOGOUT   = 'c';
  • /* SERVER NET COMMANDS */
  • final char NET_KICK     = 'd';
  • final char NET_PARAMS   = 'e';
  • final char NET_LOGIN_OK  = 'f';
  • final char NET_LOGIN_ACCOUNT_NOT_EXISTS  = 'g';
  • final char NET_CREATE_ACCOUNT = 'h';
  • final char NET_NICKNAME_ALREADY_IN_USE = 'i';
  • final char NET_OBJ_PLAYER = 'j';
  • final char NET_OBJ_STREAM = 'k';
  • final char NET_LOGIN_INCORRECT_PASSWORD = 'l';
  • final char NET_SET_GAME_ZONEMAP = 'm';
  • final char NET_PING = 'n';


Y en el INT32 [] me llegan los datos de los objetos de esta forma:
Source Code (Java) [ Download ] [ Hide ]
  • int type;
  • int x;
  • int y;
  • int id;
  • int crc;


Y lo que hago para asegurarme de que el protocolo UDP no me provoca parpadeos o posicionamientos anomalos es enviar al cliente desde el servidor la X la Y y el ID del objeto, su tipo, y finalmente la suma de todos estos parametros, y en el cliente lo que hago es leer los parametros y sumarlos, y luego los comparo con el ultimo llamado 'CRC', si coincide es que la información es integra, si no coincide está corrupta.

Bueno.. por ahora todo marcha, avanzo despacio por que quiero por lo menos tener una base solida, soy muy maniatico con esto.

Y ya te digo, tengo que mirar como encapsular un array de byte´s en un int y podre mejorar la comunicacion bastante mas.



@Spiderman - Gracias tio! por ahora todo es place holder y tengo como meta terminar la base del juego y que sea estable sin errores. Una vez alcanzado esto si, contratare a un grafista y comenzaré a trabajar en los graficos.



Haber si logro por lo menos que podamos conectarnos unos pocos y podamos jugar unas partidas XD.. la verdad es que con eso me conformo, con poder conectarme al juego y subir el personaje, hacer negocios con los otros players atraves de la subasta ingame y poder hacer un sistema de RAID o "BANDAS" para entrar en instancias al puro estilo World of Warcraft.


Tomo como referencia el sistema de juego del WOW, me parece un ejemplo a seguir ya que en mi opinión "y he probado todos los MMORPG habidos y por haber.." es un juego muy bien diseñado y estructurado.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby Spiderman » Wed Jan 24, 2018 6:11 pm

Hablando de Processing...tu los graficos en que formato y profundidad los trabajas?
User avatar
Spiderman
 
Posts: 761
Joined: Wed Feb 11, 2009 2:49 am

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby erkosone » Wed Jan 24, 2018 6:42 pm

todo png 32 bits
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby CicTec » Wed Jan 24, 2018 7:35 pm

erkosone wrote:@CicTEc si tio, en parte es lo que hablamos de encapsular datos en un int, pero no terminé de entender como encapsular datos byte en un int, la primera parte de la encapsulacion que es del cliente hacia el servidor ya está hecha, son boolean en un INT32, ahora me liaré a usar un int como un array de 4 bytes, con eso voy a ahorrar un monton mas de ancho de banda.

Bien, es mejor como sistema de transmision de datos.

erkosone wrote:Al final te hice caso y he dejado de lado los String como contenedor de datos, son demasiado pesados y por algun motivo que desconozco son mas propensos a corromperse viajando por UDP que los propios INT

Me alegro que te haya servido.

Aunque no te recomiendo usar el sistema STRING, asi por curiosidad, como enviabas esto dato STRING por la red ? de aqui se podria entender del porque te da error.

erkosone wrote:así que intento solo usar INT en las transmisiones para mantener una coherencia en el memory alloc y así facilitar los saltos por la memoria en los bucles que descomponen los datagramas en propiedades de los objetos. Osea que me llega al cliente una trama de datos tal como esta:

char int int int int int int int int int int int int.......

El char/byte inicial me indica que hacer con los datos, por ahora estos son los comandos que estoy usando por red mediante este char/byte:

/* NET COMMANDS */
Source Code (Java) [ Download ] [ Hide ]
  • final char NET_LOGIN    = 'a';
  • final char NET_PLAYER_CONTROLS = 'b';
  • final char NET_LOGOUT   = 'c';
  • /* SERVER NET COMMANDS */
  • final char NET_KICK     = 'd';
  • final char NET_PARAMS   = 'e';
  • final char NET_LOGIN_OK  = 'f';
  • final char NET_LOGIN_ACCOUNT_NOT_EXISTS  = 'g';
  • final char NET_CREATE_ACCOUNT = 'h';
  • final char NET_NICKNAME_ALREADY_IN_USE = 'i';
  • final char NET_OBJ_PLAYER = 'j';
  • final char NET_OBJ_STREAM = 'k';
  • final char NET_LOGIN_INCORRECT_PASSWORD = 'l';
  • final char NET_SET_GAME_ZONEMAP = 'm';
  • final char NET_PING = 'n';


Y en el INT32 [] me llegan los datos de los objetos de esta forma:
Source Code (Java) [ Download ] [ Hide ]
  • int type;
  • int x;
  • int y;
  • int id;
  • int crc;


Y lo que hago para asegurarme de que el protocolo UDP no me provoca parpadeos o posicionamientos anomalos es enviar al cliente desde el servidor la X la Y y el ID del objeto, su tipo, y finalmente la suma de todos estos parametros, y en el cliente lo que hago es leer los parametros y sumarlos, y luego los comparo con el ultimo llamado 'CRC', si coincide es que la información es integra, si no coincide está corrupta.

Bueno.. por ahora todo marcha, avanzo despacio por que quiero por lo menos tener una base solida, soy muy maniatico con esto.

Y ya te digo, tengo que mirar como encapsular un array de byte´s en un int y podre mejorar la comunicacion bastante mas.

Recuerda que CHAR en java no es byte, es short, java usa este tipo de datos para la codificacion de caracteres de texto, y la codificacion de las cadenas de texto usada es UTF-8 con lo cual cada char son 16bits, o sea equivalente a 2 bytes.

Dicho esto, la codificacion de bytes en un int es sencilla, primero pero debes asegurarte que INT sea efectivamente 32bit y que no cambie de dimencion segun la plataforma/architectura en la cual es enviado, sino vas a tener problemas de procesamiento de los datos.

Establechedo que el INT es siempre 32bits, esto lo puedes tomar igual a la codificacion de un color RGBA (32bit) donde cada canal son 8bits.

Suponendo que el endianess de la plataforma es little donde los bits se leen dal menos significativo (empezando por el ultimo a la derecha) hacia el mas significativo (el primero a la izquierda), o sea 31.....0, la codificacion de un RGBA seria...
INT = A R G B, repartido:
A = bit 24 a 31, mascara de bit para obtener el valor = 0xFF000000, shifting de desplazamiento para el desempaquetado = >> 24, shifting de desplazamiento para el empaquetado = << 24
R = bit 16 a 23, mascara de bit para obtener el valor = 0x00FF0000, shifting de desplazamiento para el desempaquetado = >> 16, shifting de desplazamiento para el empaquetado = << 16
G = bit 8 a 15, mascara de bit para obtener el valor = 0x0000FF00, shifting de desplazamiento para el desempaquetado = >> 8, shifting de desplazamiento para el empaquetado = << 8
B = bit 0 a 7, mascara de bit para obtener el valor = 0x000000FF, o simplemente 0xFF, shifting de desplazamiento para el desempaquetado = niguno, shifting de desplazamiento para el empaquetado = niguno

Con estas reglas y datos puedes extraer bytes de cualquier INT y/o empaquetarlas en otro.

Ahora ponemos un ejemplo, tienes una variable llamada "color" que es INT 32bit y le quieres guardar un color equivalente a una llamada ARGB = 255, 128, 64, 32, tendras la variable "visualmente" asi:
color = 255|128|64|32

Ahora tienes 4 variables byte llamadas R, G, B, A, para memorizar en cada una el correspondiente canal-byte del color seria:
A = (color & 0xFF000000) >> 24; (mascara + desplazamiento para desempaquetado)
R = (color & 0x00FF0000) >> 16;
G = (color & 0x0000FF00) >> 8;
B = (color & 0x000000FF);


Operacion inversa (empaquetado en un INT) en una variable "new_color" de tipo INT partendo da las variables canal-bytes:
new_color = (G << 8); (la mascara no es necesaria en el empaquetado, solo en el desempaquetado)
La istruccion anterior pone el estado de la variable "visualmente" asi:
new_color = 0|0|64|0

Para empaquetar mas valores simultaneamiente se usa el operador suma ("+") o mas propriamente el operador bit a bit "|" (OR).

Ejemplo 1: la variable "new_color" esta nuevamente vacia (0) y queremos empaquetar los caneles R y G, seria:
new_color = (R << 16) | (G << 8); (datos byte + valores de desplazamiento para empaquetado conjuntos con el operador bit a bit "|")
La istruccion anterior pone el estado de la variable "visualmente" asi:
new_color = 0|128|64|0

Ejemplo 2: tenendo "new_color" en el estado seteado del ejemplo 1 y querendole ahora empaquetar tambien el valor A, seria:
new_color = (A << 24) | (new_color);
La istruccion anterior pone el estado de la variable "visualmente" asi:
new_color = 255|128|64|0

Ejemplo 3: tenendo "new_color" en el estado seteado del ejemplo 2, y querendole modificar el valor de A da 255 a 128, ponendo el caso de tener otra variable byte "A_50p" la operacion seria la siguiente:
new_color = (A_50p << 24) | (new_color & 0x00FFFFFF);
La istruccion anterior pone el estado de la variable "visualmente" asi:
new_color = 128|128|64|0
Notaras en este ultimo ejemplo la mascara 0x00FFFFFF, si te fijas esta es la conjuncion de las mascaras para los canales R, G y B, el motivo es que cuando se sobreescribe un valor no "vacio" (en el caso anterior A no es mas 0, sino 255) es necesario obtener un nuevo dato temporal con el byte vacio, eso se hace con la mascara, que recupera los datos R G B tal cual estan y setea el A a 0 (lo limpia) para luego escribir el nuevo valor.

Esto es todo, basandote en estas reglas y ejemplos te puedes montar el sistema de empaquetado/desempaquetado de bytes en INT.
User avatar
CicTec
 
Posts: 16553
Joined: Thu Jul 31, 2008 10:18 pm

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby erkosone » Wed Jan 24, 2018 11:36 pm

Vaya no sabia lo de los shorts en char para java, lo voy a tener en cuenta y lo voy a cambiar por que me va a ahorrar trafico, exactamente unos 40 bytes aprox. por segundo y por cliente.

Sobre lo de empaquetar bytes en INT32 me parece una buena idea, incluso creo que processing usa ya las funciones red() green() blue() alpha() y color() para esto mismo.. creo que con muy poco codigo extra voy a poder usarlas ya nativas de processing/java2D para encapsular los datos. voy a investigarlo :)

Y sobre el proyecto en general, la verdad es que me tiene muy ilusionado. :D :D
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby CicTec » Wed Jan 24, 2018 11:44 pm

erkosone wrote:Vaya no sabia lo de los shorts en char para java, lo voy a tener en cuenta y lo voy a cambiar por que me va a ahorrar trafico, exactamente unos 40 bytes aprox. por segundo y por cliente.

Este net command lo puedes empaquetar junto con TYPE, ID y CRC en un INT, siempre y cuando los valores maximos de estas variables puedan entrar en un sola variable 32bit, asi ahorras aun mas ancho de banda.

erkosone wrote:Sobre lo de empaquetar bytes en INT32 me parece una buena idea, incluso creo que processing usa ya las funciones red() green() blue() alpha() y color() para esto mismo.. creo que con muy poco codigo extra voy a poder usarlas ya nativas de processing/java2D para encapsular los datos. voy a investigarlo :)

El ejemplo sobre los colores era para poner el funcionamento del empaquetado/desempaquetado, sobre las funciones de que hablas, salvo que no haya algunas para hacer el sistema que te indique y sean inline, no te recomiendo usarlas, la performance del juego bajaria bastante, usa codigo directo con las formulas que te indique.
User avatar
CicTec
 
Posts: 16553
Joined: Thu Jul 31, 2008 10:18 pm

Re: World of Isthania [WIP] [PROCESSING] [GAMELIBZERO]

Postby erkosone » Fri Jan 26, 2018 4:52 am

Ok CicTec pues voy a hacerlo directamente con la formula, queda como muy dificil así visto a primera vista pero si, efectivamente es mas rapido jeje..

Me encanta tu forma de pensar, rápida y siempre eficaz ante cualquier otra cosa.

Bueno.. ya está tomando forma el juego.. ya he implementado las primeras formulas para el calculo de la barra de vida energia y mana de los player y el cliente reciviendo el nivel del jugador y su valor de vida ya representa el porcentaje de barra de vida correctamente en el cliente.. que way.. esto marcha :lol: :lol:

EDIT: Que gracia.. me asomaba la barra de vida por la izquierda cuando tenia poca vida XD.. he tenido que implementar el sistema de regiones para screenDrawGraphic() jeje.. esto marchaaaaa!!!!!
You do not have the required permissions to view the files attached to this post.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.


Return to Offtopic

Who is online

Users browsing this forum: No registered users and 7 guests