Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por EN.I el 2013-08-25, 19:07

Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Iorana...
Aqui vengo con otras de mis investigaciones... un tanto raras, esta vez trata de scripts.

Verán, de vez en cuando, cuando tuve una idea de script me puse a hacer algo asi como un motor de audio ( luego lo abandoné porque la motivacion era mas que nada ocio xD), cuando quería conectar un motor de audio al maker. ¿Cual fue el problema? La libreria era un DLL el cual tenía que compilarse con un programa programado aparte... pero investigando me di cuenta que es posible conectarla y mucho mas... me di cuenta que se puede extender la funcionalidad de Ruby a otros lenguajes de programación de mucho mas perfomance :D

Pero... ¿De que trata esto?
Para los experimentados, sabrán que Ruby es un lenguaje de programación interpretado, el cual es de rendimiento mas lento a diferencia de los compilados (C, C++), ya que se desenvuelven mas directamente en el código máquina, siendo así lenguajes de bajo nivel. En sí, hablamos de agua y aceite. Para Ruby, si, hay cosas, pero la mayoría de las tonteras interesantes en el mundo de la programación existen para C, C++, Java, etc. Claro, si haces un programa con esos lenguajes, en internet tienes lleno de posibilidades para añadir a tus programas, incluyendo hasta incluso motores enteros de física, motores de audio, reproduccion de X formatos, entre otros.

Pero... estamos en el maker señores... y usa Ruby. En ruby... si, hay cosas: pero no son las mas nutridas que digamos. En los foros del maker, desde luego puedes encontrar cosas interesantes, pero mucha gente se limita a lo que ruby ofrece. ¿Y que pasa si quisieras extenderte a motores o funcionalidades extra que ruby de por si no es capaz de ofrecerte? ¿Te quedas de brazos cruzados sabiendo que ruby "no puede hacer eso,?" pero otro lenguaje si? No! para nada :)

Lo que tengo como idea es hacer "un puente" entre Ruby y esos lenguajes poderosos que si pueden hacer eso. Claro, si ruby "no se la puede", le deja el trabajo sucio a algún modulo hechos en esos lenguajes compilados, logrando su cometido de manera mucho mas práctica y rápida. Mientras ruby se encarga mas de tareas propias del maker, C o C++ se encarga de las tareas intensas que de seguro hacen lagear el maker.

De todas formas, esto no es una idea nueva. Android hace algo similar con su llamado NDK: Para las tareas de alta complejidad o rendimiento, android te ofrece el poder hacer "librerias" en código nativo para una mayor perfomance a diferencia de Java, que es el lenguaje por defecto el cual android se desenvuelve; aaaaunque los desarrolladores recomiendan solo usarlo si es realmente necesario, no para hacer programas enteros, debido al bajo nivel que implica usar C/C++ ( si lo usas mal, se vuelve todo una bomba de tiempo). En el maker podriamos hacer una analogía con Ruby y con C. Aquí voy: Con la clase Win32API que viene con ruby se pueden hacer llamadas a librerías dinamicas (mas conocidos como DLL), que no son mas que "pedazos de programas" acoplables a otros programas, los cuales dotan de funcionalidades extra (reproduccion de videos, calculos, conexión a diferentes bases de datos, blablabla) al programa el cual se conectan. Lo unico que contienen en su interior son funciones/metodos/subrutinas/comoquieranllamarlo sueltos. Entonces mi idea es proponer, en el caso de querer scripts de alto rendimiento, hacer "puentes" entre Ruby y C.

¿Y como?
Ya les dije lo de los DLL. Se pueden generar .DLL en lenguaje C/C++. Los DLL no son nada que funciones/metodos/subrutinas/comoquieranllamarlo. Ruby por Win32API es capaz de llamar a DLL's.

¿Mas claro?
En sencillas palabras, llamas a un script X que haga su trabajo, y cuando Ruby quiera pasarle el trabajo a tu código en C/C++, llamas a la Win32API que te llame a una de esas funciones de tu DLL y espera un resultado de vuelta ( si es que lo hay). Lo que estaría pasando allí, Ruby se lava las manos y le deja todo el trabajo a C/C++, dependiendo de la funcionalidad que desees.

Para hacer esto, es relativamente sencillo. Pero si necesitas saber manejarte con la clase Win32API, y saber programar en C/C++.

Parte 1. La parte "maker" en ruby.

Para llamar a un DLL desde el maker tendremos que usar la clase Win32API. Su uso no es para nada complicado: Sigue la logica de crear la clase con los parametros del DLL a llamar, y luego despues, solo "llamarla". Citaré la sintaxis del uso de la clase de un post viejo, el cual explica esto muy bien.

Win32API.new('ruta DLL', 'FUNCIÓN','Parámetros esperados', 'parámetro devuelto')

- ruta DLL: La ruta de la DLL que se quiera llamar

- FUNCIÓN: Nombre de la función contenida en la DLL

- Parámetros esperados: los parámetros que va a recibir la función
p = Puntero/String (Cadena de texto en rgss)
i = integral (número)
l = long. número largo
v = void (nil en RGSS)

- Parámetro devuelto: es el parámetro que devuelve la función.
p = Puntero/String (Cadena de texto en rgss)
i = integral (número)
l = long. número largo
v = void (nil en RGSS)
Un ejemplo para llamar una funcion de DLL desde Ruby :
La función a llamar es int funcion_de_ejemplo_en_el_dll(int numero); en dll_prueba.dll, pasandole como parametro el número 43

Código:
Llamada_DLL = Win32API.new("dll_prueba.dll","funcion_de_ejemplo_en_el_dll",['i'],'i')
codigo_retorno= Llamada_DLL.call(43)
La cosa aqui es cruda. Si se llama correctamente retornará el valor esperado, de lo contrario si se llama mal o si te equivocas en los parametros a la hora de llamar el maker simplemente crasheara.

Parte 2. La parte "C/C++"

Pero... para que nos servirá esto si no tenemos código en C?. Les explicaré brevemente como hacer un DLL que pueda recibir nuestro llamado desde fuera del codigo, en este caso el maker.

Código:
#include<windows.h>

__declspec(dllexport) int funcion_de_ejemplo_en_el_dll(int numero)
{
 //tu codigo va aqui. No me complicaré, solo multiplicare el numero de entrada por 2.
 return numero*2;
}
Para compilar, usa estos comandos ;) (Necesitas tener gcc/Mingw... (tambien sirve usar DevC++ o similar) instalado para esto en tu compu)
Código:

gcc -c codigo.c codigo.o
gcc -o tu_dll.dll -s -shared codigo.o -Wl,--subsystem,windows
Ventajas:
-Extension de la funcionalidad del maker a niveles casi insospechados.
-El codigo compilado es mucho mas eficiente y rapido que el interpretado (ruby)
-Codigo mas modularizado, todo en sus correspondientes llamadas.

Desventajas:
-Todo se basa en llamadas a funcionalidades, por lo que debes ser muy ordenado.
-A diferencia de ruby, los codigos de bajo nivel no se autocomprueban, por lo que si algo va mal, el juego se caerá ( ni alcanzará a fallar, se colgará y windows te dira que debe cerrarse).
-Es bajo nivel, cosas obvias que hacias en ruby en C debes hacerlo a mano (asignar memoria, limpiar variables, crear threads, etc).

Un ejemplito chico con un motor de audio para el maker que se llamaba B2RM. Basicamente muestra mensajes y reproduce audio. Todo desde el DLL:
http://www.mediafire.com/download/slg9iz0ud2dqg1m/B2RM.rar

(A ver si mas tarde les animo a subir un ejemplo mas elaborado para que puedan ver como funciona esto.)

¿Es factible o util esto para algo? ¿O ustedes creen que con lo que ya ofrece Ruby basta y sobra, y podemos prescindir de otros lenguajes para el trabajo sucio?

Maururu... chaos.
avatar
EN.I
Soñador
Soñador

0/3

Créditos 354

Gracias : 34

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por KLAUDAS el 2013-08-25, 19:38

Interesante, no... LO SIGUIENTE. La verdad es que esto abre un mundo muy amplio. Me brillan los ojos de emoción jejee muchas gracias por compartir.
avatar
KLAUDAS
Novato
Novato

0/3

Créditos 77

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por orochii el 2013-08-26, 01:56

¿Yo había puesto mi calculador de MD5 aquí xD? (sí, ya lo encontré). En fin, pongo un ejemplito más para el pozo de... de... cosas =D.
https://dl.dropboxusercontent.com/u/13006190/zomd5.rar

La mejor idea sería rehacer el RGSS xd. Algo como lo que había empezado vgvgf con el ARGSS. Porque el fallo del RPG Maker es que todo es hecho con Ruby, TODO. Ruby es un lenguaje de scripting, no de programación, por lo que para llevar un game engine entero pues no queda nada bien en performance xd (todavía no estoy seguro de si hay partes realmente compiladas dentro de ese DLL).
Cosas como Multimedia Fusion, Construct, Torque2D, todos usan un sistema de scripting, PERO el motor en sí está hecho con un lenguaje tipo C/++, usando GL o dX para la parte gráfica.

Pero en fin, si se puede usar un poco para una que otra cosa, pues genial. El Win32API es bastante útil. Y se pueden lograr cosas bastante interesantes, tipo... no sé, el NeoMode7... o el maldito FPLEngine nuevo que el MGC se estaba haciendo 8'D!. O el H-Mode7 también.
Oh rayos, MGC siempre se lleva toda la gloria 8'D!!! (y Blizzard <3).

Ajaja, bueno, bonito tema, salut,
Orochii Zouveleki
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por gerrtunk el 2013-08-26, 09:20

@orochii escribió:¿Yo había puesto mi calculador de MD5 aquí xD? (sí, ya lo encontré). En fin, pongo un ejemplito más para el pozo de... de... cosas =D.
https://dl.dropboxusercontent.com/u/13006190/zomd5.rar

La mejor idea sería rehacer el RGSS xd. Algo como lo que había empezado vgvgf con el ARGSS. Porque el fallo del RPG Maker es que todo es hecho con Ruby, TODO. Ruby es un lenguaje de scripting, no de programación, por lo que para llevar un game engine entero pues no queda nada bien en performance xd (todavía no estoy seguro de si hay partes realmente compiladas dentro de ese DLL).
Cosas como Multimedia Fusion, Construct, Torque2D, todos usan un sistema de scripting, PERO el motor en sí está hecho con un lenguaje tipo C/++, usando GL o dX para la parte gráfica.

Pero en fin, si se puede usar un poco para una que otra cosa, pues genial. El Win32API es bastante útil. Y se pueden lograr cosas bastante interesantes, tipo... no sé, el NeoMode7... o el maldito FPLEngine nuevo que el MGC se estaba haciendo 8'D!. O el H-Mode7 también.
Oh rayos, MGC siempre se lleva toda la gloria 8'D!!! (y Blizzard <3).

Ajaja, bueno, bonito tema, salut,
Orochii Zouveleki
Esto no es asi, ni el editor ni el interprete estan hechos en ruby creo. Lo que pasa es que estan hechos como el culo entre otras cosas por usar el GDI de windows. Nose que lenguaje usa, se que los clasicos usaban delphi.

Y las clases ocultas estan en ruby porque sino no se podrain extender ni modificiar facilmente no?

El argss lo deberiamos terminar, yo lo voy intentando, lo importe en el codelite pero no logro cocmpilarlo, vgvf esta desaparecido,  sino me equivoco funciona aunque aun hay cosas que hacer, reestructurar el rendimiento y sobretodo acabar las transiciones. Pero es algo que voy tratando de ahcer poco a poco y ahora pues trato de compilarlo y tal.

Usaba opengl un poco pse, sdl es la mas portable aunque hoy en dia sfml la rebase un cojon en todos los aspectos.

pd: si alguien quiere ayudar con el arggss q lo comente
avatar
gerrtunk
Principiante
Principiante

0/3

Créditos 361

Gracias : 22

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por orochii el 2013-08-27, 00:06

Ah claro, el editor y el intérprete no están hechos con Ruby (mucho menos el segundo, sería como hacer mantequilla con mantequilla xD).
El editor se puede comprobar con lo que está hecho, al menos en el caso de Delphi. Recuerdo que al menos el binario del rpg_rt, uno lo abría con un editor hexadecimal, y en algún lado tenía guardados los datos del linkeado y tal, no sé.

Respecto a lo de ayudar a terminar el ARGSS, yo no soy programador, pero al menos podría intentar ayudar con eso de lograr compilarlo. Lo único es que la mayor parte de los links están caídos, puesto que todo estaba alojado en el server de vgvgf, y su página ya no existe, creo.

Bueno, que todo salga bien, algún día estaremos con un RPG Maker hecho a la medida de nuestras sabias mentes (?), haciendo los mismos pinitos de siempre xD?. Por ahora, aprender a usar el Win32API, y si se puede llevar adelante al ARGSS. Si se pudiera terminar y portearlo, pues taría genial. Igual el Easy, que es otra cosa, un maker completo y expandible al infinito.

Que todo vaya a mejor,
Orochii Zouveleki
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por Metalero el 2013-08-27, 01:00

Yo creo que tengo el ARGSS original de vgvgf, que estaba hecho en SDL usando OpenGL. Andaba muy mal a nivel performance...

Luego, habia hecho una migración usando toda la base que hace de "puente" entre c++ y ruby, y habia empezado a rehacer el engine usando irrlicht... mas o menos andaban algunas cosas, pero lo deje ahi tirado.

SDL, en mi opinion, esta obsoleto... es muy interesante, y esta bueno para aprender, pero no me gusta como esta hecho internamente, tiene mala performance.
SFML lo use muy poco, pero para 2D me parece una de las mejores opciones. Luego habia otra que se llama Allegro (creo), pero nunca lo use.

Si alguno esta interesado, mandeme un PM, y puedo ver de revolver mi pc a ver si tengo los fuentes dando vuelta por ahí, y puedo llegar a darles una mano pero la verdad es que no estoy con tiempo como para ponerme de lleno a desarrollar nada.

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1709

Gracias : 100

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por gerrtunk el 2013-08-27, 09:22

http://sourceforge.net/p/argss/code/51/tree/
Darle a get snapshot para bajarlo. Lleva 3 tipos de proyecto, para codelite, y para los dos de microsoft de dos años(08 y 10 si no me equivoco).
Hay una web de argss en sourceforge con el soucecode, este es el traball que uso, me puedes decir metalero si te parece que es el mas actualizado?

Y mi problema es basicamente liarme con c++ y codelite cosas que no manejo(se c#, java... c, con dev c ese antiguo, interpreteados, xd, y coger algo ai=).

Y si si, sfml es el futuro sin duda alguna, es muchisimo mas completa. Aunque se deberia analizar un poco la situacion del proyecto de antemano, sdl lo bueno que tiene es que es protable, lo podreis usar EN TODOS LOS LADOS, los otros no, pero tiene un huevo de problemas.

Y allegro es en plan sdl pero menos portable y aun mas antigua.

De la pagina de sfml: Windows, Linux, Mac OS X and soon Android & iOS.
avatar
gerrtunk
Principiante
Principiante

0/3

Créditos 361

Gracias : 22

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por orochii el 2013-08-27, 23:45

De la pagina de sfml: Windows, Linux, Mac OS X and soon Android & iOS.
Dejémonos de huevadas, ¿todos quieren android? "Hagámoslo" en andEngine *ese día apareció en un callejón un tipo barbudo con la cabeza cortada de tajo.* (:ifyouknowwhatimean: 8'D...)
===
El Allegro es/era bueno, y es fácil de aprender comparado con SDL. Lo "malo" es que está pensado para PC por completo (MacOS, Windows, Linux -me refiero con PC al término de computador personal, creo que Mac entra en esa definición-).
Igual no sé qué tal estará el Allegro5, que muchos amantes del 4 lo odiaron. Hay que haber estado involucrado/en contacto (en cierto modo o medida) con el desarrollo como para saber detalles.

De SFML y SDL, pues no sé xD. Yo he usado SDL y para uno que otro pinito xd, SFML ni lo he tocado. Yo pensaría en el que presente buena portabilidad, buen performance, y en tercera variable una sintaxis simple, puesto que no descarto que quede el código accesible a gente que quiera echarle mano (igual es C++ así que no será como Ruby de accesible jamás xd, pero... digo... por cerrarlo menos).

Igual, yo qué sé xD, primero veamos si se organiza algo, sino va y queda esto como caballo con cabeza, pero sin patas (?).

Em bueno ahí va ='D, salut,
Orochii Zouveleki

PD.: Yo sigo diciendo que deberíamos hacerlo con AndEng-- ¡tatatatatatata~! *Orochii muere acribillado*. xD. Es joda.
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por Metalero el 2013-08-28, 01:22


Y mi problema es basicamente liarme con c++ y codelite cosas que no manejo(se c#, java... c, con dev c ese antiguo, interpreteados, xd, y coger algo ai=).
Visual Studio hombre! el mejor IDE (indiscutible) de todos los tiempos.


(igual es C++ así que no será como Ruby de accesible jamás xd, pero... digo... por cerrarlo menos).
Pero la idea del ARGSS es compilar un Game.exe custom, nada mas, el resto seguiria funcionando con Ruby... la ventaja seria que se podrian hacer mil cosas mas, que con el normal no se puede. O sea, seguiria usando ruby, y se podria ir extendiendo la base para quienes sepan C++


_________________
avatar
Metalero
Administrador
Administrador



Créditos 1709

Gracias : 100

Volver arriba Ir abajo

RPG Maker XP Re: Extensión de scripts haciendo "puente" entre lenguajes (Win32API)

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.