Project1

标题: 请教角色所穿的防具中若有防御第666号状态则add_state(666)无效 [打印本页]

作者: taeckle    时间: 2021-12-3 05:24
标题: 请教角色所穿的防具中若有防御第666号状态则add_state(666)无效
本帖最后由 taeckle 于 2021-12-31 18:33 编辑

我用了一个笨方法,在默认脚本Class Battler下def add_state(state_id, force = false)里面这么写的:

  1.     if state_id==666 #免疫第666号状态
  2.      if self.is_a?(Game_Actor)
  3.       armor1 = $data_armors[@armor1_id]
  4.       armor2 = $data_armors[@armor2_id]
  5.       armor3 = $data_armors[@armor3_id]
  6.       armor4 = $data_armors[@armor4_id]      
  7.       if armor1!=nil && armor1.guard_state_set.include?(state_id)
  8.       return
  9.       elsif armor2!=nil && armor2.guard_state_set.include?(state_id)
  10.       return
  11.       elsif armor3!=nil && armor3.guard_state_set.include?(state_id)
  12.       return
  13.       elsif armor4!=nil && armor4.guard_state_set.include?(state_id)
  14.       return      
  15.       end
  16.      end  
  17.     end
复制代码



请问大家有更简单的方法嘛?最好是用一行就解决这个问题,还请大家指点一二,多谢了!
作者: alexncf125    时间: 2021-12-3 08:31
本帖最后由 alexncf125 于 2021-12-3 08:39 编辑
我只想说个理解误区,简单和复杂不是代码行数的决定的,你想要把循环式脚本写得简洁就可以用本楼得那些数组自带方法,随便搜下都有很多,什么each, map, find_all, any?等等在某些情况下的确可以让代码变成一行。本楼提供的运行逻辑和楼主你写的没有太大区别,主要式更懂得利用一些函数,理论上它并没有更简单。

作者: fux2    时间: 2021-12-3 12:55
用楼上的写法画瓢就行了

不过如果只是想防御状态的话,根本不需要写脚本


创建一个免疫666号状态的状态,把它附加给目标就可以了
作者: RPGzh500223    时间: 2021-12-3 15:59
已有 Game_Actor#state_guard?  ● 判定防御属性。
RPG::Armor#guard_state_set意思就是免疫状态(无论好坏)。
指令【更改状态】直接调用的 Game_Battlerr#add_state,该方法不考虑 RPG::Armor#guard_state_set。
不含公共事件事件的【技能】、【物品】直接调用的 Game_Battler#states_plus,该方法考虑 RPG::Armor#guard_state_set。

要么自行修改Game_Battler#add_state,要么合理运用状态的附加方式。
最后还是建议你先看看脚本吧……
作者: taeckle    时间: 2021-12-8 07:56
本帖最后由 taeckle 于 2021-12-8 07:58 编辑
alexncf125 发表于 2021-12-3 08:31
[fold= 我只想说个理解误区,简单和复杂不是代码行数的决定的,你想要把循环式脚本写得简洁就可以用本楼得 ...


报告大神,我们这个写法其实还有个漏洞,如果角色没装备任何防具的话会报错,所以应该改成这样:
  1.     if state_id==666 #免疫第666号状态
  2.      if self.is_a?(Game_Actor)
  3.       armor1 = $data_armors[@armor1_id]
  4.       armor2 = $data_armors[@armor2_id]
  5.       armor3 = $data_armors[@armor3_id]
  6.       armor4 = $data_armors[@armor4_id]      
  7.       if armor1!=nil && armor1.guard_state_set.include?(state_id)
  8.       return
  9.       elsif armor2!=nil && armor2.guard_state_set.include?(state_id)
  10.       return
  11.       elsif armor3!=nil && armor3.guard_state_set.include?(state_id)
  12.       return
  13.       elsif armor4!=nil && armor4.guard_state_set.include?(state_id)
  14.       return      
  15.       end
  16.      end  
  17.     end
复制代码


请问下这么改过之后还能用你在上面第2楼的方法只用一行表达出来吗?
作者: enghao_lim    时间: 2021-12-8 17:22
taeckle 发表于 2021-12-8 07:56
报告大神,我们这个写法其实还有个漏洞,如果角色没装备任何防具的话会报错,所以应该改成这样:
  1. armor1!=nil && armor1.guard_state_set.include?(state_id)
复制代码

你不是写出来了吗?
如果 n 对应的就是 @armorn_id把 armorn !=nil 直接用 $data_armors[n] != nill 来表达即可不是吗?
作者: taeckle    时间: 2021-12-8 21:21
enghao_lim 发表于 2021-12-8 17:22
你不是写出来了吗?
如果 n 对应的就是 @armorn_id把 armorn !=nil 直接用 $data_armors[n] != nill 来 ...


我是想问这个问题可不可以也用find_all, any?之类之类的句式,就像你在上面第2楼的方法只用一行那样




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