加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 SixRC 于 2018-9-15 16:45 编辑
切换了之前的思路 这次说是版本置换也贴切 说是双版本也贴切
原理大概是这样的:
用了 RubyInstaller 编译好的 dll 自己再写了个 dll 用来启动等等
在代码页 init 里面初始化 修改了部分机器码使得此后的代码页交由新版本的 ruby 解释器执行
至于如何在新版本的解释器里执行原 RGSS 功能 我的做法大体上是利用 eval
新解释器里我写了三个方法 一个是 p 类同原功能 因为新版本对字符串编码的不同 若 p 一个包含中文的非字符串对象将无法显示中文 此外 一些函数不同了 游戏中部分显示文章的功能需要改写 这个我没附上 因为比较简单 可自己根据需求写
一个是 rgss_eval(str) 用旧版本的解释器 eval str 会有返回值 若是常量如 nil true false 和不大的数字 以及字符串 可以正常返回 其余的返回不可靠
这是因为新旧版本储存对象的方式和解释器环境不同 对象不可共用 除非是一些常量 数字 字符串能返回是因为我作了一个判断 然后作了转换
一个是 rgss_save_str(var_name, str) 将 str 储存到旧解释器的变量 var_name 中 如 rgss_save_str("$hello", "hello");rgss_eval("p $hello")
利用这三个方法 我将 RGSS 作了包装以用于新的解释器 如
module Audio module_function def bgm_play(filename, volume = 100, pitch = 100) rgss_eval("Audio.bgm_play(\"#{filename}\",#{volume},#{pitch})") end end
module Audio
module_function
def bgm_play(filename, volume = 100, pitch = 100)
rgss_eval("Audio.bgm_play(\"#{filename}\",#{volume},#{pitch})")
end
end
类的包装借助了全局变量 $bitmap 等等 每个新解释器下的原 RGSS 对象都有一个 n 属性 是对应全局变量的编号以便于操作
所有的 RGSS 功能已经被包装 不需要了解细节也可以如常使用 细节在下面范例的脚本中 那个范例是一个模板 假如要使用可以从那个开始 或者把文件夹下的 dll 啊 lib 库 和需要的脚本拷贝过去 需要什么库自己 require
我也有写 ReadMe.txt 其余的细节看那个吧 大致写的差不多
看一些转换和包装的脚本大概就能理解运作的过程了 操作内存的脚本需要改造 如保存 png 的 理由很明显 不想改造就把脚本放在 init 脚本页前的旧解释器环境下 然后用 rgss_eval 调用
这次应当并无隐疾 除了因为版本不同而造成的不同 这些请自己调整
下为范例
ruby版本置换1.0 8cbg
大致如此 有bug请提 欢迎建议 |