设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2469|回复: 5
打印 上一主题 下一主题

[已经解决] 关闭窗口时执行脚本,如何实现?

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
34 小时
注册时间
2010-9-30
帖子
48
跳转到指定楼层
1
发表于 2011-4-11 11:15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关闭游戏窗口时执行脚本,如何实现?

点评

你是想打开个广告链接吧- -  发表于 2011-4-11 17:22

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
2
发表于 2011-4-11 12:31:22 | 只看该作者
本帖最后由 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
复制代码
不知道可不可以

点评

unless method_defined? :shizi_exit更好一些,没必要占用一个全局变量  发表于 2011-4-12 12:42

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
3
发表于 2011-4-11 17:15:39 | 只看该作者
回复 Wind2010 的帖子

关闭游戏窗口,已终止RGSS运行,不能执行脚本了,话说对Ls的答案无语了,RMXP正规退出游戏是:    $scene = nil        不过Lz可以直接尝试Ruby
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复

使用道具 举报

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
4
发表于 2011-4-12 12:11:44 | 只看该作者
回复 沙漠点灰 的帖子

按右上角的×其实也是调用exit的,不信可以试试

点评

我说的是"正式",和人际语言一样....不然默认就不会有"退出游戏"这一选项了  发表于 2011-4-12 17:17

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
27 小时
注册时间
2010-11-10
帖子
135
5
发表于 2011-4-12 12:34:00 | 只看该作者
while $scene != nil循环结束后面写一次
rescue SystemExit后面写一次

评分

参与人数 1星屑 -6000 梦石 -4 -40 收起 理由
fux2 -6000 -4 -40 0v0这能算刷分么

查看全部评分

章鱼baby的马甲
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
6
发表于 2011-4-12 14:21:31 | 只看该作者
本帖最后由 苏小脉 于 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 所有脚本之后添加上需要处理的事项即可。

点评

@67:适用 @后知:RMXP 应该用不了 @fux2:http://zh.wikipedia.org/wiki/%E8%AF%AD%E6%B3%95%E7%B3%96  发表于 2011-4-13 04:35

评分

参与人数 3星屑 +734 收起 理由
fux2 + 302 语法糖是啥0.0
后知后觉 + 132 我在某鼠标脚本里见过 END{ ... } 这个在RM.
六祈 + 300 路过投币,问下紫苏,对非RM的Ruby程序适用.

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-25 16:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表