Project1

标题: 尝试制作另一套装备系统时遇到关於object=的报错 [打印本页]

作者: 真紅樂章    时间: 2018-6-16 23:38
标题: 尝试制作另一套装备系统时遇到关於object=的报错
事源是想要抄袭默认脚本装备系统来制作另一套装备系统顺便了解一下默认脚本如何运作
靠着各种报错一步步了解结果来到object=的报错卡住
翻找一星期了还是理不清Game_BaseItemGame_ActorWindow_EquipItemScene_Equip之间是如何互动
反而被默认脚本扭成一团的道具系统思路扭成一团了……
所以只好来找大佬求救了呢

其实就想问问这个报错错啥


RUBY 代码复制
  1. class Game_Actor < Game_Battler
  2.   def force_change_equip(slot_id, item)
  3.     @equips[slot_id].object = item          # ← 报的这里错
  4.     release_unequippable_items(false)
  5.     refresh
  6.   end
  7. end


然後是距离完成还很遥远自制脚本
因为目前还是在完全抄袭默认脚本然後把class名称Equip换成Soul的阶段所以冗长又看似无关的部份就不放上来了
这三段是目前改动里最可疑的部份
RUBY 代码复制
  1. class Game_Actor < Game_Battler
  2.   #--------------------------------------------------------------------------
  3.   # ● 获取装备栏的数组
  4.   #--------------------------------------------------------------------------
  5.   def equip_slots
  6.     return [0,0,2,3,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,9] if dual_wield?       # 双持武器
  7.     return [0,1,2,3,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,9]                      # 普通
  8.   end
  9. end
  10.  
  11. class RPG::Armor < RPG::EquipItem
  12.   #--------------------------------------------------------------------------
  13.   # ● 装备类型
  14.   #--------------------------------------------------------------------------
  15.   def etype_id
  16.     @note.include?("<soul>") ? etype_id = 5 : @etype_id
  17.   end
  18. end
  19.  
  20. class Window_SoulItem < Window_ItemList
  21.   #--------------------------------------------------------------------------
  22.   # ● 设置装备栏 ID
  23.   #--------------------------------------------------------------------------
  24.   def slot_id=(slot_id)
  25.     return if @slot_id == slot_id + 5
  26.     @slot_id = slot_id + 5
  27.     refresh
  28.     self.oy = 0
  29.   end
  30. end


制作思路方面是把[0,1,2,3,4]後面的[5,5,5,5,5,6,6,6,6,7,7,7,8,8,9]放到另一个装备页
但是新装备页里的从Window_EquipItem仿制的Window_SoulItem似乎无法……嗯……怎麽说呢……就是应该错了但是无法理解错在哪里的说

求各路大佬围观指点
作者: RaidenInfinity    时间: 2018-6-17 00:04
头痛医头,脚痛治脚:

请配着这个教程食用
https://rpg.blue/forum.php?mod=viewthread&tid=399513

undefined method XXX for YYY class
意思就是调用方法时(YYY类的实例.XXX方法),YYY类并没有定义XXX方法。
在这里,YYY是nil。就是空值。什么情况之下会出空值呢?
其中一个就是数组里并没有这个索引的数值。(例子:array长度3,但是你却尝试array[5])

请检查你的代码运行顺序,确保Game_Actor内force_change_equip方法的第一行
@equips[slot_id].object = item
从@equips提取出来的值不是nil(空值)。

也建议你在这种情况的时候加一个p(需要开启控制台/小黑窗)来检查数据。
例子:
RUBY 代码复制
  1. class Game_Actor < Game_Battler
  2.       def force_change_equip(slot_id, item)
  3.         p @equips #<- 在控制台输出,检查数据
  4.         p slot_id #<- 检查参数
  5.         @equips[slot_id].object = item
  6.         release_unequippable_items(false)
  7.         refresh
  8.       end
  9.     end

上面的检查,如果确实slot_id比@equips的大小还大,你是需要对@equips数组下手了。
作者: 百里_飞柳    时间: 2018-6-17 00:34
本帖最后由 百里_飞柳 于 2018-6-17 00:36 编辑

Game_BaseItem类只是一个对于$data_items $data_weapons等的一个封装,为了能够进行统一调用的容器类而已
如果你想将它们整合为使用 Game_BaseItem类的对象,可以在方法 .object = 赋值前加上
@equips[slot_id] = Game_BaseItem.new if @equips[slot_id].nil?
这样就先弄了一个空的容器类占位置

不过据我对于默认脚本的研究,@equips应该真的是单纯存的$data_weapons[id]或$data_armors[id],毕竟nil代表这里是空的没装备(在window里绘制时判定了这个nil)
比如 [ $data_weapons[1], nil, nil, $data_armors[1], $data_armors[2] ]
作者: 草莓萝莉控上校    时间: 2018-11-23 10:42
嘛~虽然帮不上什么忙~但是来和小红报道一下哦~
作者: 草莓萝莉控上校    时间: 2018-11-23 21:44
草莓萝莉控上校 发表于 2018-11-23 10:42
嘛~虽然帮不上什么忙~但是来和小红报道一下哦~


一起學習哦~

只是這裏似乎不能夠討論H相關的內容吧~(小聲說)




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