查看: 2371|回复: 2

[已经解决] 关于Game_Battler脚本的一个疑问

[复制链接]
梦石
0
星屑
3348
在线时间
1120 小时
注册时间
2009-4-15
回帖
761
发表于 2014-10-31 22:07:27 | 显示全部楼层 |阅读模式

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

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

×
在Game_Battler脚本下有个函数:
[pre lang="ruby" line="1"]#--------------------------------------------------------------------------
  # ● 应用“状态附加”效果:普通
  #--------------------------------------------------------------------------
  def item_effect_add_state_normal(user, item, effect)
    chance = effect.value1
    chance *= state_rate(effect.data_id) if opposite?(user)
    chance *= luk_effect_rate(user)      if opposite?(user)
    if rand < chance
      add_state(effect.data_id)
      @result.success = true
    end
  end[/pre]
整个函数内容好像被没有使用item这个参数,那么,传递这个参数给item_effect_add_state_normal有什么意义呢?

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2014-10-31 22:25:45 | 显示全部楼层
本帖最后由 喵呜喵5 于 2014-10-31 22:38 编辑

Game_Battler:
  1.   #--------------------------------------------------------------------------
  2.   # ● 应用使用效果
  3.   #--------------------------------------------------------------------------
  4.   def item_effect_apply(user, item, effect)
  5.     method_table = {
  6.       EFFECT_RECOVER_HP    => :item_effect_recover_hp,
  7.       EFFECT_RECOVER_MP    => :item_effect_recover_mp,
  8.       EFFECT_GAIN_TP       => :item_effect_gain_tp,
  9.       EFFECT_ADD_STATE     => :item_effect_add_state,
  10.       EFFECT_REMOVE_STATE  => :item_effect_remove_state,
  11.       EFFECT_ADD_BUFF      => :item_effect_add_buff,
  12.       EFFECT_ADD_DEBUFF    => :item_effect_add_debuff,
  13.       EFFECT_REMOVE_BUFF   => :item_effect_remove_buff,
  14.       EFFECT_REMOVE_DEBUFF => :item_effect_remove_debuff,
  15.       EFFECT_SPECIAL       => :item_effect_special,
  16.       EFFECT_GROW          => :item_effect_grow,
  17.       EFFECT_LEARN_SKILL   => :item_effect_learn_skill,
  18.       EFFECT_COMMON_EVENT  => :item_effect_common_event,
  19.     }
  20.     method_name = method_table[effect.code]
  21.     send(method_name, user, item, effect) if method_name
  22.   end
复制代码
在method_table中读取方法名称,之后使用send调用对应名称的方法,并传递三个参数:user, item, effect
如果这里把
def item_effect_add_state_normal(user, item, effect)
改成
def item_effect_add_state_normal(user, effect)
的话
上面那个方法就只能改成成这样:
  1.   def item_effect_apply(user, item, effect)
  2.     method_table = {
  3.       EFFECT_RECOVER_HP    => :item_effect_recover_hp,
  4.       EFFECT_RECOVER_MP    => :item_effect_recover_mp,
  5.       EFFECT_GAIN_TP       => :item_effect_gain_tp,
  6.       EFFECT_ADD_STATE     => :item_effect_add_state,
  7.       EFFECT_REMOVE_STATE  => :item_effect_remove_state,
  8.       EFFECT_ADD_BUFF      => :item_effect_add_buff,
  9.       EFFECT_ADD_DEBUFF    => :item_effect_add_debuff,
  10.       EFFECT_REMOVE_BUFF   => :item_effect_remove_buff,
  11.       EFFECT_REMOVE_DEBUFF => :item_effect_remove_debuff,
  12.       EFFECT_SPECIAL       => :item_effect_special,
  13.       EFFECT_GROW          => :item_effect_grow,
  14.       EFFECT_LEARN_SKILL   => :item_effect_learn_skill,
  15.       EFFECT_COMMON_EVENT  => :item_effect_common_event,
  16.     }
  17.     method_name = method_table[effect.code]
  18.     if effect.code == EFFECT_ADD_STATE
  19.       item_effect_add_state_normal(user, effect)      
  20.     else
  21.       send(method_name, user, item, effect) if method_name
  22.     end
  23.   end
复制代码
顺带一提,其实我自己觉得将这个方法改成case when也没啥大问题,并且也不用传递多余的参数了……
[pre lang="ruby" line="1"]  def item_effect_apply(user, item, effect)
    case effect.code
    when EFFECT_RECOVER_HP then item_effect_recover_hp(user, item, effect)
    when 对应的Code        then 对应的方法(方法参数)
    end
  end[/pre]
但是如果之后其他人需要猴补item_effect_apply这个方法同时需要获取对应物品注释的时候应该怎么办?

评分

参与人数 1梦石 +2 收起 理由
VIPArcher + 2 好详细啊。

查看全部评分

回复

使用道具 举报

梦石
0
星屑
3348
在线时间
1120 小时
注册时间
2009-4-15
回帖
761
 楼主| 发表于 2014-10-31 22:33:40 | 显示全部楼层
喵呜喵5 发表于 2014-10-31 22:25
Game_Battler:在method_table中读取方法名称,之后使用send调用对应名称的方法,并传递三个参数:user, it ...

OK,了解,之前没有查到源头,所以这段正好没看到……
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部