本帖最后由 KB.Driver 于 2020-3-24 12:12 编辑
标题比较含糊,直接就你的提问回答了。
呼叫菜单界面Scene_Menu后,会生成菜单指令窗口Window_MenuCommand
先看一下Window_MenuCommand的部分原代码:
class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # ● 初始化指令选择位置(类方法) #-------------------------------------------------------------------------- def self.init_command_position @@last_command_symbol = nil end #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- def initialize super(0, 0) select_last end #-------------------------------------------------------------------------- # ● 返回最后一个选项的位置 #-------------------------------------------------------------------------- def select_last select_symbol(@@last_command_symbol) end # 后面省略
class Window_MenuCommand < Window_Command
#--------------------------------------------------------------------------
# ● 初始化指令选择位置(类方法)
#--------------------------------------------------------------------------
def self.init_command_position
@@last_command_symbol = nil
end
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize
super(0, 0)
select_last
end
#--------------------------------------------------------------------------
# ● 返回最后一个选项的位置
#--------------------------------------------------------------------------
def select_last
select_symbol(@@last_command_symbol)
end
# 后面省略
先看初始化,重点在于其中调用的select_last,会用到类变量@@last_command_symbol
类变量与常量相似,不进行初始化就引用的话会产生NameError,也就是找不到对象。
插句题外话,实例变量(不是“实际变量”)不经定义就引用是不会报错的,此时得到的引用为空值nil
为了避免出现类变量未定义的情况,这里有一个类方法init_command_position
它的作用很简单,就是定义@@last_command_symbol并为其赋予空值nil。
全局搜索Window_MenuCommand::init_command_position,会发现它一共出现在这两处:
事件解释器Game_Interpreter的“呼叫菜单”指令,
以及地图界面Scene_Map的call_menu方法。
也就是说,按照游戏原来的设计,只有这两个菜单入口
他们全都提前对菜单的类变量进行了初始化(同时也是重置)
只要仿照以上两处,在你要呼叫菜单的地方提前调用Window_MenuCommand::init_command_position
就可以避免这个问题了。
|