注册会员 登录
Project1 返回首页

zhangbanxian的个人空间 https://rpg.blue/?79298 [收藏] [复制] [分享] [RSS]

日志

半仙的ruby研究之旅(四) f12的灵异事件?

已有 365 次阅读2013-1-24 00:28 |个人分类:ruby研究| , 灵异事件

什么?你用了这么长时间rm还不知道f12是啥用的?f12虽然作为快速重启按键,却常常被人忽视,有些人或许会觉得f12就是返回标题画面嘛...错,返回标题画面在仅仅只是把$scene切换到Scene_Title而已,而f12是真正的重启,所有脚本都会在f12之后重定义一遍,但是有个蛋疼的问题就是RGSS预定义的一堆class并不会被重定义...
  于是,就出现了一些人在f12之后华丽地弹出stack too deep的错误,其实就是无限递归...至于这个问题就不得不说说我们通常写脚本的习惯了...
  class Window_Base
  alias fucker_update update
  def update
  do_something
  fucker_update
  end
  end
  alias呢,就是原先的方法拷贝,可以理解为
  def update
  do_something
  end
  def fucker_update
  do_something
  end
  通常情况下,这样的脚本f12是不会有问题的,因为在f12之后所有脚本都会被重定义,于是Window_Base里的update在f12之后被重定义了,所以alias fucker_update update并不会导致神马问题...但如果是RGSS预定义类就杯具了...
  class Window
  alias fucker_update update
  def update
  do_something
  fucker_update
  end
  end
  f12之后alias fucker_updateupdate就导致原本的脚本变成了这样...
  def update
  do_something
  fucker_update
  end
  def fucker_update
  do_something
  fucker_update
  end
  于是就造成了无限递归,但是绝大多数的脚本员都会忽视这一点,造就了众多f12杯具...
  不过,我要说一件值得庆幸的事就是这个问题在va之后将不会再出现,那就是rgss_main的出现,va开始,f12将不会从头开始把所有脚本重定义一遍,而只是调回到rgss_main处,也就是定义层和执行层分离开了...这样对于那些加载一大堆dll的脚本来说也可以减轻一些重定义浪费的时间...
  我是建议大家使用最新的va的,但xp党难道就只能站着流口水吗?有人提议是通过修改脚本的方法来达到此目的,比如alias fucker_updateupdate unless defined? fucker_update这样就不可能会alias两遍fucker_update,但我是比较推崇不修改别人的脚本来达到目的,况且一个个改过来不蛋疼吗- -b
  嘿,不就是rgss_main吗?我们自己实现一个不就好了,先来看看f12的实现过程,没错,抛出Reset异常,然后转到异常处理实现重启...
  不过Reset在va之前是个隐藏类,必须在脚本定义后才可使用;va之后,则更名为RGSSReset,而且无需自定义...
  接下来是重点,重启到底是如何实现的,嗯,其实主要就是各种rgss对象的释放吧,因为rgss是用c写的,所以总有一堆ruby层面看不到的黑盒,不过,利用ruby的强大语言功能,实现起来也不算太难...于是就有了插屁版的伪rgss_main...
  class Reset < Exception
  end
  def rgss_main
  yield
  rescue Reset
  ObjectSpace.each_object do |i|
  next unless i.respond_to?(:dispose)
  begin
  i.dispose
  rescue RGSSError
  end
  end
  Graphics.freeze
  retry
  end
  rgss_main{
  begin
  # 准备过渡
  # 设置系统默认字体
  Font.default_name = (["黑体"])
  Graphics.freeze
  # 生成场景对像 (标题画面)
  $scene = Scene_Title.new
  # $scene 为有效的情况下调用main 过程
  while $scene != nil
  $scene.main
  end
  # 淡入淡出
  Graphics.transition(20)
  rescue Errno::ENOENT
  # 补充 Errno::ENOENT 以外错误
  # 无法打开文件的情况下、显示信息后结束
  filename = $!.message.sub("Nosuch file or directory - ", "")
  print("找不到文件 #{filename}。")
  end
  }

鸡蛋

鲜花

评论 (0 个评论)

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

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

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

GMT+8, 2024-5-3 11:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部