查看: 2158|回复: 10

[有事请教] 请教给防具增加一个实例变量时遇到的问题

[复制链接]
梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
发表于 2023-5-1 20:09:25 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 taeckle 于 2023-5-1 20:40 编辑

大家好,

神明共鉴,RPG Maker Xp默认脚本会从数据库读取所有防具的数据, 现在我想给防具增加一个实例变量"重量", 我是这么写的, 结果却没有达到我想要的效果:
  1. module RPG
  2.   class Armor
  3.     attr_accessor :zhongliang
  4.     alias al_initialize initialize
  5.     def initialize
  6.       al_initialize      
  7.       @zhongliang = 100 #这里我打算给所有防具增加一个实例变量"重量",先让所有防具的重量值是100
  8.     end
  9.   end  
  10. end
复制代码


然后看了下 @芯☆淡茹水 大神的写法:
  1. class RPG::EquipItem < RPG::BaseItem
  2.   def bian_liang
  3.     return @bian_liang || 100
  4.   end
  5.   def bian_liang=(n)
  6.     @bian_liang = n
  7.   end
  8. end
复制代码


按照@芯☆淡茹水 大神的写法把"bian_liang"改成"zhongliang"效果就出来了,可为什么我写的却没有效果呐?

新增一个防具实例变量.rar

188.13 KB, 下载次数: 1

新增防具实例变量

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2023-5-1 20:14:56 | 显示全部楼层
本帖最后由 soulsaga 于 2023-5-1 20:20 编辑

你没写def 你的实例变量
def initialize
是重新开始时会执行一次
如果在这里加变量旧存档就不能读

[pre lang="ruby"]module RPG
  class Armor
    attr_accessor :zhongliang
    def zhongliang   
      return @zhongliang || 100 #这里我要给所有防具增加一个实例变量"重量",初始值是100
    end
  end  
end[/pre]
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2023-5-1 20:23:37 | 显示全部楼层
本帖最后由 taeckle 于 2023-5-1 21:00 编辑
soulsaga 发表于 2023-5-1 20:14
你没写def 你的实例变量
def initialize
是重新开始时会执行一次


按照我自己上面的写法我就是想让其在游戏重新开始生效的, 为此咱还特意把这段代码放到了Game_Temp的上面, 结果当我想在class Game_Actor的def initialize中调用下$data_armors[2].zhongliang时神奇的事情出现了:
1.这个$data_armors[2].zhongliang不会报错
2. 但这个$data_armors[2].zhongliang显示的值不是100,而是nil
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2023-5-1 20:32:19 | 显示全部楼层
soulsaga 发表于 2023-5-1 20:14
你没写def 你的实例变量
def initialize
是重新开始时会执行一次


大神请看这个例子:

新增一个防具实例变量.rar

188.13 KB, 下载次数: 2

防具实例变量

回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2023-5-1 20:59:00 | 显示全部楼层
taeckle 发表于 2023-5-1 20:32
大神请看这个例子:

新加的话似乎不能照原版来写..
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2023-5-1 21:02:17 | 显示全部楼层
soulsaga 发表于 2023-5-1 20:59
新加的话似乎不能照原版来写..

是不是在Module RPG里的所有class都不能像我这样来新增实例变量呐?
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2023-5-7 13:55:45 | 显示全部楼层
taeckle 发表于 2023-5-1 21:02
是不是在Module RPG里的所有class都不能像我这样来新增实例变量呐?


可能要加上
[pre lang="ruby"]def zhongliang
return @zhongliang
end[/pre]
回复

使用道具 举报

梦石
0
星屑
7296
在线时间
1244 小时
注册时间
2015-8-15
回帖
473
发表于 2023-5-7 17:02:46 | 显示全部楼层
本帖最后由 金芒芒 于 2023-5-7 17:08 编辑

再加个定义=变量  描述是说明里+@ 你也可以在名称里@
  1.   class Armor#防具类

  2.     def description #定义描述
  3.       #描述 = @描述拆分(/@/)[0]
  4.       des = @description.split(/@/)[0]
  5.       #返回描述 != nil ? 描述 : ""
  6.       return des != nil ? des : ""
  7.     end
  8.     # 防具装备所需各种 能力值
  9.     def need_lv#定义所需的等级
  10.       #需要新的等级 = @描述拆分(/@/)[1]
  11.       need_lv  = @description.split(/@/)[1]
  12.       ##返回需要新的等级!= nil ?需要新的等级到i : 1
  13.       return need_lv != nil ? need_lv.to_i : 1
  14.     end
  15.    
  16.     def need_str#定义需求新的力量
  17.      #需要新的力量 = @描述拆分(/@/)[2]
  18.       need_str  = @description.split(/@/)[2]
  19.        #返回需要新的力量!= nil ?需要新的力量到i : 0
  20.       return need_str != nil ? need_str.to_i : 0
  21.     end
  22.    
  23.     def need_dex#定义需要新的灵巧
  24.       #需要新的灵巧 = @描述拆分(/@/)[3]
  25.       need_dex  = @description.split(/@/)[3]
  26.       #返回需要新的灵巧!= nil ?需要新的灵巧到i : 0
  27.       return need_dex != nil ? need_dex.to_i : 0
  28.     end
  29.    
  30.     def need_agi#定义需要新的速度
  31.       #需要新的速度 = @描述拆分(/@/)[4]
  32.       need_agi  = @description.split(/@/)[4]
  33.        #返回需要新的速度!= nil ?需要新的速度到i : 0
  34.       return need_agi != nil ? need_agi.to_i : 0
  35.     end
  36.    
  37.     def need_int#定义需要新的魔力
  38.       #需要新的魔力 = @描述拆分(/@/)[5]
  39.       need_int  = @description.split(/@/)[5]
  40.       #返回需要新的魔力!= nil ?需要新的魔力到i : 0
  41.       return need_int != nil ? need_int.to_i : 0
  42.     end
  43.    
  44.   end
复制代码
变量.png
回复

使用道具 举报

梦石
0
星屑
2876
在线时间
172 小时
注册时间
2020-8-9
回帖
100
发表于 2023-5-7 20:54:52 | 显示全部楼层
你只在初始化的时候给装备赋予重量的值,在你重写这个方法前获取的装备因为当时的初始化方法没有这个值相关的操作,所以你在获取的时候值自然是nil,你这样新增是可以的,你能获取到nil这个值就是证明,但是你没有给你已经拥有的装备赋这个变量的值,只需要在开始游戏的时候用一个方法遍历装备数组给所有装备重新赋值就可以了,以后产生的新准备则不需要再重新赋值,因为你在初始化方法里已经赋了值。

点评

明白了!感谢!  发表于 2023-6-2 22:07

评分

参与人数 1赞 +1 收起 理由
taeckle + 1 感谢!

查看全部评分

回复

使用道具 举报

梦石
0
星屑
1433
在线时间
50 小时
注册时间
2020-2-16
回帖
85
发表于 2023-6-19 16:31:15 | 显示全部楼层
我是这么做的
  1. module RPG
  2.   class Armor
  3.     attr_accessor :zhongliang
  4.     alias al_initialize initialize
  5.     def initialize
  6.       al_initialize      
  7.       @zhongliang = 100 #这里我打算给所有防具增加一个实例变量"重量",先让所有防具的重量值是100
  8.     end
  9.   end  
  10. end
  11. # 在Scene_Title
  12. for i in 1...$data_items.size
  13.   $data_items[i].zhongliang = 0
  14. end
  15. -------------------------------------------
  16. # 或者
  17. $items_zhongliang = [1,2,3,4,56,44,13]
  18. for i in 1...$data_items.size
  19.   $data_items[i].zhongliang = $items_zhongliang[i]
  20. end

  21. # 不过默认脚本没有存档$data_items的功能 我是这么做的,继续按照上面的方式
  22. # 在存档的时候 $game_variables[1000] =$items_zhongliang  
  23. # 在读档的时候
  24. $items_zhongliang   =  $game_variables[1000]
  25. # 又或者直接用 $game_variables[1000]来之定相应物品的zhongliang
复制代码
流飘零半生,未逢明主。公若是不弃,流愿拜为义父
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部