Project1

标题: 没有任何技术含量的控制台 [打印本页]

作者: hyrious    时间: 2019-2-3 16:43
标题: 没有任何技术含量的控制台
好久不开论坛,冒个泡



这次【胡扯】主要有三件事:


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)
  1. stdout = api('kernel32', 'GetStdHandle').call(-11)
  2. api('kernel32', 'GetConsoleMode').call(stdout, buf('L'))
  3. api('kernel32', 'SetConsoleMode').call(stdout, buf[0] | 4)
复制代码
如何使用 ANSI 控制符可以看这篇 wiki

2 直接抄 SixRC 的后台运行脚本
2.0.1 为了和 RGD 兼容,做如下处理(见 bgr.rb)
  1. if defined? RGD
  2.   Graphics.background_exec = true
  3. else
  4.   # 原后台运行脚本
  5. end
复制代码


3 有了上面两个东西,发现还是不能一边在控制台里打字一边运行游戏,

这是因为游戏控制台和 Game.exe 是同一个线程,同时只能有一个在运行
所以想到开两个 rgss 进程,一个是游戏本身,另一个是控制台

不同进程之间的交流有很多种方法,比如共享内存、管道、UDP、甚至 HTTP(可以利用不死鸟之翼的 AsHttp.dll)
这里用一个十分睿智的办法:游戏进程循环读取一个文件,一旦(判断文件内容)有消息传过来,就去做相应的处理并把结果保存到文件

贴在游戏里的脚本,见 main.rb
“控制台”里的脚本,见 console.rb

以上就是,游戏本体里只贴一份轮询脚本,另一份工程跑一个控制台

既然是跑控制台那就不需要什么游戏框了,直接掏一个 RGSSEval 出来用(rgss.exe)就好了(见 rgss.c)。


结语:这个东西的好处大概是不需要外部再装什么 ruby 了()

以上冒泡完毕
作者: SixRC    时间: 2019-2-4 05:24
console.zip (712.05 KB, 下载次数: 106)
我也写了一个!

那个控制台是拿 c 写的
控制台和 rgss 的交流通过 NamedPipe
读指令 传指令 指令eval 传回去结果 显示结果 读指令
输入LL就是接收几行直到LL
错误了是直接p出来 然后返回 nil
就实现了这些基本的功能
不过学到了很多东西 还是挺有意思的(??)
作者: fux2    时间: 2019-2-4 09:20
无敌的喵喵喵,令人发指




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1