| 本帖最后由 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
 就可以避免这个问题了。
 
 
 
 |