Project1
标题:
如何让自己的引擎支持RGSS系统
[打印本页]
作者:
独孤残云
时间:
2010-10-20 14:02
标题:
如何让自己的引擎支持RGSS系统
如题~
想自己开发引擎,地图编辑器基本完成。为后续扩展方便,打算后期加入脚本系统。
当然,如果可以让自己的引擎直接支持一个成熟的脚本系统,就再好不过了,可以省去脚本系统开发的时间和不少不必要的麻烦。
夏娜大人的RGE引擎似乎完美的兼容了RGSS,官方说法“Ruby Game Engine使用了 RGSS 扩展类库”。
求教各位大神:有没有什么方法可以直接在自己的引擎里内嵌RGSS系统?RGSS 扩展类库是什么?这个是不是我在寻求的工具?
感激不尽~
作者:
禾西
时间:
2010-10-20 14:20
你只要在底層仿個RGSS封裝層的接口就可以了。
需要甚麼接口?Help當中有說……
作者:
独孤残云
时间:
2010-10-20 14:32
回复
禾西
的帖子
谢谢您的回答,不过,可不可以麻烦您说的更详细一些?RM本人还在龟速学习中^_^
另外,还想请教一下,您说的这个方法有无宿主语言的限制?比方说只能使用C语言等等。
非常感谢~
作者:
八云紫
时间:
2010-10-20 14:47
本帖最后由 铃仙·优昙华院·因幡 于 2010-10-20 14:52 编辑
HINSTANCE hInst;
hInst = LoadLibrary("RGSS202E.dll");
typedef int (_stdcall *fRGSSInitialize)(HINSTANCE);
typedef int (_stdcall *fRGSSFinalize)(void);
typedef int (_stdcall *fRGSSGameMain)(HWND, char*, char* /* ini */);
typedef int (_stdcall *fRGSSEval)(char*);
/* typedef int (_stdcall *fRGSSSetupRTP)(char*, int, int); */
fRGSSInitialize RGSSInitialize = GetProcAddress(hInst,"RGSSInitialize");
fRGSSFinalize RGSSFinalize = GetProcAddress(hInst,"RGSSFinalize");
fRGSSGameMain RGSSGameMain = GetProcAddress(hInst,"RGSSGameMain");
fRGSSEval RGSSEval = GetProcAddress(hInst,"RGSSEval");
fRGSSSetupRTP RGSSSetupRTP = GetProcAddress(hInst,"RGSSSetupRTP");
---------------------------------------------------------------
调用顺序是:
1. RGSSSetupRTP 获得 RTP // 不知道参数,所以,Orz
2. RGSSInitialize 初始化 RGSS 解析器. // RGSSInitialize(hInst)
3. RGSSGameMain 游戏主循环 // RGSSGameMain(窗口句柄, 脚本文件名, ini文件名) 好像是这样的
N. RGSSEval 调用 // RGSSEval(脚本)
复制代码
目前的研究结果~~~ 不全~~, 不过大概是 Game.exe 里的调用顺序,细节没写出来~~~
作者:
禾西
时间:
2010-10-20 14:48
大抵都和C接合。具體是引用dll庫或者so,require或者Win32API。
作者:
独孤残云
时间:
2010-10-20 15:01
回复
铃仙·优昙华院·因幡
的帖子
铃仙大人是用反汇编一点一点跟出来的吗?好了不起啊~
如果能搞到game.exe的代码就好了~
我的引擎用C#写的,不晓得行不行,实在不行就只能嵌非托管了=_="
非常感谢您~
作者:
八云紫
时间:
2010-10-20 15:04
本帖最后由 铃仙·优昙华院·因幡 于 2010-10-20 15:05 编辑
回复
独孤残云
的帖子
仅仅是初学。 需要 Game.exe 的源码需要逆向。不过不知道 EB 同不同意就是了。
再说,咱也没那个能力~~~
[line]1[/line]
然后是, 以上未测试。
其实可以去问问 RGE 里的大大们原理~~~
作者:
独孤残云
时间:
2010-10-20 15:05
本帖最后由 独孤残云 于 2010-10-20 15:38 编辑
回复
禾西
的帖子
C的dll加载分静态和动态两种,不过一般针对于C的SDK大都会提供.h、.lib和相关的库。RGSS中似乎没有看到这些资源。
还是很感激您的提示~ 谢谢~
继续求教各位高人~
==============================
糟~ 不知不觉就连帖了,向各位版主大人道歉……
回复铃仙大人:
残云是杂兵,还没资格到高级版发帖:'(
动态加载用的不太熟,谢过铃仙大人指教~
==============================
继续期待各位大神的指导~~ 感激不尽~
作者:
八云紫
时间:
2010-10-20 15:24
回复
独孤残云
的帖子
C# 不会, C++ 的是这样的。
比如说有个 dll 名字是 add.dll , 导出了一个函数 int _add(int, int), 加载就是这样:
HINSTANCE hInst; //句柄
hInst = LoadLibrary("add.dll"); // 动态加载 add.dll
typedef int (_stdcall *dll_add)(int, int); // 声明一个函数指针,用来指向导出的函数
dll_add d_add = GetProcAddress(hInst,"_add"); // 获取导出函数的地址。
print("1 + 2 = %d \n", d_add(1, 2)); // 然后就可以正常使用了~~
作者:
六祈
时间:
2010-10-20 15:43
回复
独孤残云
的帖子
能在RGE版回帖么?需要的话你可以在xp区发个提问题,然后愚者帮你转移过去
作者:
独孤残云
时间:
2010-10-20 15:43
本帖最后由 独孤残云 于 2010-10-20 16:18 编辑
回复
铃仙·优昙华院·因幡
的帖子
原来如此~ 这种方式不禁让残云想到Lua脚本函数的调用模式~
非常感谢铃仙大人的耐心指导~
=================================================
回复六祈大人:
是六祈大人,好久不见~
现在还不行,残云是杂兵,还没有升格到剑士,呵呵~
经铃仙大人点播,残云多少得到了一些启发。如果能总结出一些更加深入的理论,再劳烦六祈大人转一帖,可以吗?大家就可以继续深入讨论了~
深表感谢^_^
=================================================
回复六祈大人的点评:
六祈大人太谦虚了~ 您已经很强了~
残云的Ruby现在还在龟速前进中,好多不会的地方以后有机会还得继续向六祈大人多多请教呢^_^
作者:
八云紫
时间:
2010-10-20 16:29
Lua 就是这样调用的。 不过感觉 Lua 比 RGSS 要好点。个人感觉~~~
作者:
独孤残云
时间:
2010-10-20 16:40
本帖最后由 独孤残云 于 2010-10-20 16:42 编辑
回复
铃仙·优昙华院·因幡
的帖子
铃仙大人Lua也用的相当熟练吗?好厉害啊~
残云觉得Ruby比之Lua似乎更加正式一些,机制也较复杂一些~
举例来说,Lua中似乎并未出现类的概念,只能借由其他机制来模拟面向对象的过程,而Ruby中则明确提供了Class机制,并且通过一些更为复杂的机制实现了继承甚至多继承~
以上也是一点儿个人的看法啦~ 不对的地方还望铃仙大人帮忙指正,呵呵~
作者:
八云紫
时间:
2010-10-20 17:09
回复
独孤残云
的帖子
大人啥的不敢当的说。Lua 也只是初学,所以仅仅是感觉上~~~
作者:
IamI
时间:
2010-10-20 19:25
神奇物一枚不知是否有用:
http://hi.baidu.com/tvga/blog/item/a4da02f3c4262fc70b46e0a9.html
作者:
紫苏
时间:
2010-10-20 20:35
我倒是建议自己重写,毕竟 RGSS 在设计模式上有很多不足之处 O.O
Lua 是极其轻量级的脚本语言,轻功超绝,踏雪无痕,设计目的就是为了最高执行效率,不过拿它的效率和 Ruby 比就没意思了,毕竟 Ruby 的亮点在语言本身而不是底层机器 O.O
Lua 从底层表手动编写一个基于原型的面向对象框架倒是能培养孩子们自我动手的能力,不过有违软件工程的哲学……还有别的杂七杂八的比较,以前也有帖子讨论过,不妨参考:
http://rpg.blue/thread-147021-1-1.html
追求执行效率不妨嵌入 Lua,追求设计效率还是投向 Ruby 的怀抱吧~~
作者:
八云紫
时间:
2010-10-20 21:04
有所得必有所失么??
作者:
独孤残云
时间:
2010-10-20 22:13
回复
紫苏
的帖子
紫苏大人言之有理~ 呵呵~
不过,残云感觉,以自己现有的经验,凭空设计出如RGSS般优秀的脚本引擎,毕竟不太容易~是以才突然想到能否直接嵌入RGSS系统~
然而,就如同紫苏大人所说,如果可以靠自己的能力,用自己擅长的脚本设计出优秀的引擎,对于自身而言则绝对是一种锻炼~
关于脚本引擎的设计思想,以后有机会还望紫苏大人多多指教~
===========================================
回复IamI版主:
真的是很值得借鉴的神奇物件~ 非常感谢IamI大人的推荐~
作者:
DeathKing
时间:
2010-10-20 23:13
版权是个问题。。。再说。RGSS有点小脑残。
综上。。。。建议自己重写个。
参考(广告):【RGE】Phantom AVG Engine:
http://rpg.blue/thread-154984-1-1.html
作者:
独孤残云
时间:
2010-10-21 08:30
回复
DeathKing
的帖子
King大人好强啊~ 有机会必须得借鉴下~:)
作者:
灼眼的夏娜
时间:
2010-10-21 12:27
回lz rgss类库是以ruby接口存在的~~ 首先需要确认是否采用ruby?还是lua之类的?要实现RGSS那么首先得添加ruby的解释器~~ 可以编译ruby源码~~ 之后得提供rgss类的底层实现...
作者:
独孤残云
时间:
2010-10-21 16:51
本帖最后由 独孤残云 于 2010-10-26 09:51 编辑
回复
灼眼的夏娜
的帖子
夏娜大人,您所说的残云基本能够明白,只是最后一项“之后得提供rgss类的底层实现”,难道说必须要彻底摸清楚RGSS的底层机制,然后亲手重制一个更加强大的RGSS出来吗?
嗯…夏娜大人无需透露自己的技术,只需大致提示残云一个简单的思路就行了~
非常感谢~
=======================================================
回复六祈大人的点评:
嗯~ 六祈大人说的这些,残云先前曾经留意到过~
不过,就RGSS体系的规模来看,残云自己推断,RGSS的解释器似乎在Ruby的基础上做了相当程度的扩展~ 不知道猜的对不对~
谢谢六祈大人的提醒^_^
=======================================================
回复夏娜大人的点评:
夏娜大人的意思是… 要实现RGSS系统,只需基于脚本扩展即可,而不需进一步扩展Ruby虚拟机以产生新的API,是酱紫吗?~
另,夏娜大人太谦虚了,待到您认为合适的时候,希望能求得一份工程源码,好好研究一下^_^||
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1