Project1

标题: 关闭窗口时执行脚本,如何实现? [打印本页]

作者: 6928233    时间: 2011-4-11 11:15
标题: 关闭窗口时执行脚本,如何实现?
关闭游戏窗口时执行脚本,如何实现?dsu_plus_rewardpost_czw
作者: Wind2010    时间: 2011-4-11 12:31
本帖最后由 Wind2010 于 2011-4-11 12:40 编辑
  1. unless $shizi_close_window
  2.   $shizi_close_window = true
  3.   alias shizi_exit exit
  4. end
  5. def exit(shizi)
  6.   # 这下面的只是模拟按退出要再按次C键
  7.   loop do
  8.     Graphics.update
  9.     Input.update
  10.     break if Input.press?(Input::C)
  11.   end
  12.   # 这上面的只是模拟按退出要再按次C键
  13.   shizi_exit(shizi)
  14. end
复制代码
不知道可不可以
作者: 沙漠点灰    时间: 2011-4-11 17:15
回复 Wind2010 的帖子

关闭游戏窗口,已终止RGSS运行,不能执行脚本了,话说对Ls的答案无语了,RMXP正规退出游戏是:    $scene = nil        不过Lz可以直接尝试Ruby
作者: Wind2010    时间: 2011-4-12 12:11
回复 沙漠点灰 的帖子

按右上角的×其实也是调用exit的,不信可以试试
作者: fux2     时间: 2011-4-12 12:34
while $scene != nil循环结束后面写一次
rescue SystemExit后面写一次
作者: 苏小脉    时间: 2011-4-12 14:21
本帖最后由 苏小脉 于 2011-4-13 11:54 编辑

2 楼 wind2010 和 3 楼 沙漠 说的是两种情况,都需要考虑。我能想到的通过 Ruby (以下言论针对 RM 使用的 CRuby 1.8 实现)退出时的情况大概有以下几种:

1、调用 Kernel.exit 时;
2、调用 Kernel#exit 时(包括 Object 对 Kernel 进行 mixin 后的 exit 调用);二楼处理的是这种情况;
3、调用 Process.exit 时;
4、调用 Kernel.abort 时;
5、调用 Kernel#abort 时(包括 Object 对 Kernel 进行 mixin 后的 abort 调用);
6、调用 Process.abort 时;


7、调用 Process.kill 时;
8、调用 Process.exit! 时;
9、调用 Kernel.exit! 时;
10、调用 Kernel#exit! 时(包括 Object 对 Kernel 进行 mixin 后的 exit! 调用);

(以下针对 Windows NT)

11、调用 ExitProcess 时;
12、调用 TerminateProcess 时;
13、所有线程到达程序代码末尾,跳转返回到操作系统内核(5 楼沙漠说的是这种)。


在 RM 中,发生频率最高的是第 2 种和第 13 种,具体如何办这就看个人所需了。

如果需要考虑所有场合——

11、12 是本地 API,自然需要单独挂上钩子。

1-10 都是相互独立的方法,其中:

1-6 默认有几个公用的钩子可用,其一是 Kernel.at_exit 和 Kernel#at_exit 这两个用来注册退出回调方法的方法,其二是 END { ... } 这个语法糖,其三是像 5 楼 fux2 说的那样去捕获 SystemExit 异常。如果我没记错的话,前两种方法在 RMXP 中被禁用了,只能用第三种。

7-10 没有经过 rb_exit,不会回调 on_exit,也不会抛出 SystemExit 异常。CRT 本身也有用来注册退出回调函数的函数 atexit,但涉及到回调函数就需要本地扩展。好消息是 1-6,8-10 都调用了 CRT 的 exit 函数,7 调用了 POSIX 标准库中处理进程 signal 的 kill 函数,而这两个函数在 Windows NT 下都将无可避免地调用 11 或 12,所以钩上了 11、12 这两个 API 其实就万事大吉了。然而,如果不想让程序太过复杂、不想拦截 API、不想写 Ruby 扩展的话,就只能在 Ruby 层写一个回调方法钩上 7-10 这 10 个方法,11、12 属于极端场合。

13 其实最好处理,在 RGSS 所有脚本之后添加上需要处理的事项即可。




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