Project1
标题:
关闭窗口时执行脚本,如何实现?
[打印本页]
作者:
6928233
时间:
2011-4-11 11:15
标题:
关闭窗口时执行脚本,如何实现?
关闭游戏窗口时执行脚本,如何实现? dsu_plus_rewardpost_czw
作者:
Wind2010
时间:
2011-4-11 12:31
本帖最后由 Wind2010 于 2011-4-11 12:40 编辑
unless $shizi_close_window
$shizi_close_window = true
alias shizi_exit exit
end
def exit(shizi)
# 这下面的只是模拟按退出要再按次C键
loop do
Graphics.update
Input.update
break if Input.press?(Input::C)
end
# 这上面的只是模拟按退出要再按次C键
shizi_exit(shizi)
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