| 赞 | 76 |
| VIP | |
| 好人卡 | |
| 积分 | 99 |
| 经验 | |
| 最后登录 | 2026-3-14 |
| 在线时间 | 580 小时 |
- 梦石
- 0
- 星屑
- 9862
- 在线时间
- 580 小时
- 注册时间
- 2017-9-28
- 回帖
- 203
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
好久不开论坛,冒个泡
这次【胡扯】主要有三件事:
- 抄一个控制台,启用 ANSI 控制符(添加颜色之类的)
- 抄一个后台运行
- 写一个初学者都会写的轮询文件
cat_rep.7z
(1.33 MB, 下载次数: 97)
(文件限制 2M 还行,刚好塞一个 RGSS301.dll,双击 run.cmd 即可)
我电脑是 win10,不保证其他环境能正常运行。以下是实现细节不看也罢:
1.1 直接抄 taroxd 的简易调试控制台
1.2 启用 ANSI 控制符其实十分简单,执行下面三行 win32api 调用即可(api 的实现见 api.rb,其实就是普通的 Win32API.new(...).call)
- stdout = api('kernel32', 'GetStdHandle').call(-11)
- api('kernel32', 'GetConsoleMode').call(stdout, buf('L'))
- api('kernel32', 'SetConsoleMode').call(stdout, buf[0] | 4)
复制代码 如何使用 ANSI 控制符可以看这篇 wiki
2 直接抄 SixRC 的后台运行脚本
2.0.1 为了和 RGD 兼容,做如下处理(见 bgr.rb)
- if defined? RGD
- Graphics.background_exec = true
- else
- # 原后台运行脚本
- end
复制代码
3 有了上面两个东西,发现还是不能一边在控制台里打字一边运行游戏,
这是因为游戏控制台和 Game.exe 是同一个线程,同时只能有一个在运行
所以想到开两个 rgss 进程,一个是游戏本身,另一个是控制台
不同进程之间的交流有很多种方法,比如共享内存、管道、UDP、甚至 HTTP(可以利用不死鸟之翼的 AsHttp.dll)
这里用一个十分睿智的办法:游戏进程循环读取一个文件,一旦(判断文件内容)有消息传过来,就去做相应的处理并把结果保存到文件
[fold=贴在游戏里的脚本,见 main.rb]- module Debug
- CMDS = {}
- FILE = ENV['TEMP'].tr('\\', '/') + 'RgssDebug_add8e6.i'
- ELIF = FILE.sub(/\.i$/, '.o')
- File.delete FILE if File.exist? FILE
- def self.update
- if File.exist? FILE
- begin
- stdout = eval(File.read(FILE), TOPLEVEL_BINDING).inspect
- open(FILE, 'wb') { |f| f.write Marshal.dump [true, stdout] }
- rescue => e
- stderr = ["#{e.class}: #{e}"]
- e.backtrace.each do |c|
- break if c.start_with?(':1:')
- if parts = c.match(/^(?<file>.+):(?<line>\d+):in `(?<code>.*)'$/)
- next if parts[:file] == __FILE__
- cd = Regexp.escape(File.join(Dir.getwd, ''))
- file = parts[:file].sub(/^#{cd}/, '')
- if inner = file.match(/^\{(?<rgss>\d+)\}$/)
- id = inner[:rgss].to_i
- file = "[#{$RGSS_SCRIPTS[id][1]}]"
- end
- stderr << " #{file} #{parts[:line]}: #{parts[:code]}"
- else
- stderr << " #{c}"
- end
- end
- open(FILE, 'wb') { |f| f.write Marshal.dump [false, stderr] }
- end
- File.rename FILE, ELIF
- end
- end
- class << ::Graphics
- alias _rgss_debug_update update
- def update
- Debug.update
- _rgss_debug_update
- end
- end
- end
复制代码 [/fold][fold=“控制台”里的脚本,见 console.rb]- module Debug
- FILE = ENV['TEMP'].tr('\\', '/') + 'RgssDebug_add8e6.o'
- ELIF = FILE.sub(/\.o$/, '.i')
- File.delete FILE if File.exist? FILE
- def self.send line
- open(FILE, 'w') { |f| f.write line }
- File.rename FILE, ELIF
- sleep 0.01 while File.exist? ELIF
- if File.exist? FILE
- ok, ret = Marshal.load IO.binread FILE
- if ok
- "\e[37m#{ret}\e[0m"
- else
- ret[0] = "\e[4m#{ret[0]}\e[0m"
- "\e[97m#{ret.join("\n")}\e[0m"
- end
- else
- "\e[92mReconnected.\e[0m"
- end
- end
- end
复制代码 [/fold]
以上就是,游戏本体里只贴一份轮询脚本,另一份工程跑一个控制台
既然是跑控制台那就不需要什么游戏框了,直接掏一个 RGSSEval 出来用(rgss.exe)就好了(见 rgss.c)。
结语:这个东西的好处大概是不需要外部再装什么 ruby 了()
以上冒泡完毕 |
评分
-
查看全部评分
|