Project1

标题: 写了一个开关窗口的小脚本看看有什么问题 [打印本页]

作者: 有丘直方    时间: 2017-7-21 11:21
标题: 写了一个开关窗口的小脚本看看有什么问题
  1. class Object
  2.   private
  3.   def get_instance_variables(class_name = Object)
  4.     result = []
  5.     set_instance_variables(class_name) { |ivar| result.push(ivar) }
  6.     return result
  7.   end
  8.   def set_instance_variables(class_name = Object, &action)
  9.     instance_variables.each do |varname|
  10.       ivar = instance_variable_get(varname)
  11.       action.call(ivar) if ivar.is_a?(class_name)
  12.     end
  13.   end
  14. end
  15. class Scene_Base
  16.   alias old_start start
  17.   def start
  18.     old_start
  19.     set_instance_variables(Window) { |window| window.openness = 0 }
  20.   end
  21.   alias old_post_start post_start
  22.   def post_start
  23.     old_post_start
  24.     set_windows(true)
  25.   end
  26.   alias old_pre_terminate pre_terminate
  27.   def pre_terminate
  28.     old_pre_terminate
  29.     set_windows(false)
  30.   end
  31.   def set_windows(open_or_close)
  32.     set_instance_variables(Window) { |window| open_or_close ? window.open : window.close }
  33.     begin
  34.       set_instance_variables(Window) { |window| window.update }
  35.       update_basic
  36.     end until get_instance_variables(Window).first.openness == (open_or_close ? 255 : 0)
  37.   end
  38. end
复制代码
如题,这个脚本的用处是像VX一样每次进入新的Scene的时候(post_start)都会有一个窗口渐渐(也不能算“渐渐”,不过就几帧而已)打开,换到别的Scene之前(pre_terminate)也会把窗口渐渐关闭。
使用脚本时出现堆栈过深(Stack too deep,好像是这么说的吧)错误,找不到错误的根源。注释掉这些内容之后错误消失。
望大神解决。
另外为什么RPG Maker VX Ace 讨论区的欢迎图片提到的是提问区而不是讨论区?

作者: guoxiaomi    时间: 2017-7-21 12:05
本帖最后由 guoxiaomi 于 2017-7-21 12:17 编辑

关于问题,会不会是 window.update 方法中在某些情况下不改变 openness?如果没有改变就会死循环吧。

不是很懂,但是有2个建议:
set_instance_variables -> iterate_instance_in_class
以及36行的 until 后面的内容不需要每次都调用,你既然只看第一个 Window 对象,直接在循环前单独取出来比每次循环都遍历全部的实例变量要好吧?


不行还是觉得诡异,既然 get_instance_variables(Window) 返回全体 Window 对象的数组,把这个数组存起来,然后 set_window 里遍历这个数组就可以吧。我只是觉得很诡异,但是这样做应该不能解决问题。
作者: 喵呜喵5    时间: 2017-7-21 13:09
1.先说明报错位置
2.检查报错位置是否是
  alias old_start start
  alias old_post_start post_start
  alias old_pre_terminate pre_terminate
如果是的话,
在脚本里把 old_start 全局替换成 old_20170721_start
在脚本里把 old_post_start 全局替换成 old_20170721_post_start
在脚本里把 old_pre_terminate 全局替换成 old_20170721_pre_terminate


作者: 铅笔描绘的思念    时间: 2017-7-21 14:24
本帖最后由 铅笔描绘的思念 于 2017-7-21 14:36 编辑

首先建议是不要污染标准库。。然后测试并没有stack level too deep
只有
fix:



而且有个问题就是 地图场景一直显示Window_Message和Window_MapName啊。。就不能排除下本来openness为0的window么
作者: 有丘直方    时间: 2017-7-21 20:54
想要解决的问题应该解决了,但是Window_Message却会被提前打开……这只需要修改Scene_Map内的内容就行了应该
另外需要把old_start下面那一行东西剪切到old_post_start上面,不然会有bug,主要是因为Scene_Base的子类一般都是先调用父类的start再创建窗口而不是与之相反,所以在old_start之后将所有Window对象的openness设为0是无用的,把它换到old_post_start之前才能很好地解决问题




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