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

Project1

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

[已经解决] 请教类变量的实际功能跟实际变量的功能

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1388
在线时间
343 小时
注册时间
2016-7-17
帖子
132
跳转到指定楼层
1
发表于 2020-3-24 09:03:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
在Window_MenuCommand有一段定义

  #--------------------------------------------------------------------------
  # * Restore Previous Selection Position
  #--------------------------------------------------------------------------
  def select_last
    select_symbol(@@last_command_symbol)
  end

如果在大地图开启不会出错,可是我想在对话中呼叫Scene_Menu的时后报错了,请问是什么原因?谢谢带老~

Lv5.捕梦者

梦石
10
星屑
39587
在线时间
1920 小时
注册时间
2010-11-14
帖子
3320

R考场第七期纪念奖

2
发表于 2020-3-24 12:09:00 | 只看该作者
本帖最后由 KB.Driver 于 2020-3-24 12:12 编辑

标题比较含糊,直接就你的提问回答了。

呼叫菜单界面Scene_Menu后,会生成菜单指令窗口Window_MenuCommand
先看一下Window_MenuCommand的部分原代码:

RUBY 代码复制
  1. class Window_MenuCommand < Window_Command
  2.   #--------------------------------------------------------------------------
  3.   # ● 初始化指令选择位置(类方法)
  4.   #--------------------------------------------------------------------------
  5.   def self.init_command_position
  6.     @@last_command_symbol = nil
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对象
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     super(0, 0)
  13.     select_last
  14.   end
  15.   #--------------------------------------------------------------------------
  16.   # ● 返回最后一个选项的位置
  17.   #--------------------------------------------------------------------------
  18.   def select_last
  19.     select_symbol(@@last_command_symbol)
  20.   end
  21. # 后面省略


先看初始化,重点在于其中调用的select_last,会用到类变量@@last_command_symbol
类变量与常量相似,不进行初始化就引用的话会产生NameError,也就是找不到对象。
插句题外话,实例变量(不是“实际变量”)不经定义就引用是不会报错的,此时得到的引用为空值nil

为了避免出现类变量未定义的情况,这里有一个类方法init_command_position
它的作用很简单,就是定义@@last_command_symbol并为其赋予空值nil。

全局搜索Window_MenuCommand::init_command_position,会发现它一共出现在这两处:
事件解释器Game_Interpreter的“呼叫菜单”指令,
以及地图界面Scene_Mapcall_menu方法。

也就是说,按照游戏原来的设计,只有这两个菜单入口
他们全都提前对菜单的类变量进行了初始化(同时也是重置)

只要仿照以上两处,在你要呼叫菜单的地方提前调用Window_MenuCommand::init_command_position
就可以避免这个问题了。


评分

参与人数 2星屑 +10 +1 收起 理由
寂静的夜里 + 10 认可答案
b200077 + 1 精品文章

查看全部评分

用头画头像,用脚写脚本
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 11:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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