Project1

标题: 如何让队伍中某个角色的攻击力随队伍成员发生改变 [打印本页]

作者: 喵呜喵5    时间: 2014-5-27 16:24
标题: 如何让队伍中某个角色的攻击力随队伍成员发生改变
本帖最后由 喵呜喵5 于 2014-5-27 16:28 编辑

想实现这样一个效果,队伍中特定角色的攻击力在队伍中存在特定职业的成员时会上升。
目前的做法是修改Game_actor类里获取人物能力的方法,增加上判断队伍成员职业的语句,但是默认的判断队伍成员的语句会再次调用获取人物能力的方法,最终造成死循环。
目前的解决方法是获取队伍中人物职业时跳过这名角色,但是队伍中存在既能提升攻击力又拥有特定职业的角色时判定变得很头疼...

于是,如何如何让队伍中某个角色的攻击力随队伍成员发生改变?
作者: taroxd    时间: 2014-5-27 16:34
判断队伍成员的语句哪里调用获取人物能力的方法了?
作者: taroxd    时间: 2014-5-27 16:53
RUBY 代码复制
  1. class Game_Actor
  2.   alias atkxxx atk
  3.   def atk
  4.     if $game_party.members.any? {|actor| actor.class_id == 1 }
  5.       atkxxx + 123
  6.     else
  7.       atkxxx
  8.     end
  9.   end
  10. end


总之我没看出哪里会死循环呢……
作者: 喵呜喵5    时间: 2014-5-27 16:54
本帖最后由 喵呜喵5 于 2014-5-27 17:01 编辑
  1. class Game_Actor
  2.  alias m5_20140525_param_plus param_plus
  3.  def param_plus(param_id)
  4.   a_par = m5_20140525_param_plus(param_id)
  5.   return a_par if (@actor_id != ACTOR1 && @actor_id != ACTOR2)
  6.   data = CLASS
  7.     $game_party.all_members.each do |actor|
  8.       class_id = actor.class_id
  9.       a_par += data[class_id][param_id] if data.has_key?(class_id)
  10.   end
  11.   a_par
  12.  end
  13. end
复制代码
@taroxd  
作者: taroxd    时间: 2014-5-27 17:33
本帖最后由 taroxd 于 2014-5-27 17:46 编辑
喵呜喵5 发表于 2014-5-27 16:54
@taroxd


很抱歉我还是看不出哪里会死循环……看不出的话我自己写估计也会死循环的
脚本水平低,又没环境无法调试真是不爽
如果是去掉自身就不会死循环的话,我只能这样看看了……
  1. class Game_Actor
  2.   alias m5_20140525_param_plus param_plus
  3.   def param_plus(param_id)
  4.   a_par = m5_20140525_param_plus(param_id)
  5.   return a_par if @actor_id != ACTOR1 && @actor_id != ACTOR2
  6.   data = CLASS
  7.   $game_party.all_members.each do |actor|
  8.     p '断点1' if actor.id == @actor_id
  9.   class_id = actor.class_id
  10.     p '断点2' if actor.id == @actor_id
  11.   a_par += data[class_id][param_id] if data.has_key?(class_id)
  12.     p '断点3' if actor.id == @actor_id
  13.   end
  14.   a_par
  15.   end
  16. end
复制代码

作者: moy    时间: 2014-5-27 18:56
换个方向,特定职业无非有几种情况,入队离队外加改职业,从这三个方向入手避开成员迭代呗。
atk那里只是+某变量,在上面3个情况修改这个变量,这样不就好了?
作者: 喵呜喵5    时间: 2014-5-28 11:01
taroxd 发表于 2014-5-27 17:33
很抱歉我还是看不出哪里会死循环……看不出的话我自己写估计也会死循环的
脚本水平低,又没环境无法调试 ...

三个断点都没p出来,只有
$game_party.all_members.each do |actor|这句前的断点可以出来,还是以死循环的方式无限的p出来直到堆栈过深

作者: taroxd    时间: 2014-5-28 12:32
喵呜喵5 发表于 2014-5-28 11:01
三个断点都没p出来,只有
$game_party.all_members.each do |actor|这句前的断点可以出来,还是以死循环 ...


等到我有环境的时候再看看吧……话说你不是说只要去掉角色本身就不会死循环的么
作者: 紫苍焰    时间: 2014-5-28 18:52
……
话说,技能公式能做到用特定职业数目来增加攻击力不?能的话只需要用那个把默认的攻击指定为特定技能的脚本加上公式就完美解决了……
作者: 喵呜喵5    时间: 2014-5-28 19:04
紫苍焰 发表于 2014-5-28 18:52
……
话说,技能公式能做到用特定职业数目来增加攻击力不?能的话只需要用那个把默认的攻击指定为特定技能 ...

我要提升的是角色所有技能的攻击力不是一个技能的攻击力......
作者: taroxd    时间: 2014-5-30 17:03
本帖最后由 taroxd 于 2014-5-30 19:30 编辑
喵呜喵5 发表于 2014-5-28 19:04
我要提升的是角色所有技能的攻击力不是一个技能的攻击力......


测试代码:
RUBY 代码复制
  1. $count = 0
  2.  
  3. class Game_Actor
  4.   alias m5_20140525_param_plus param_plus
  5.   def param_plus(param_id)
  6.     a_par = m5_20140525_param_plus(param_id)
  7.     return a_par unless @actor_id == 1
  8.     $count += 1
  9.     data = {1=>[1,2,3,4,5,6,7,8]}
  10.     if $count >= 5
  11.       puts caller
  12.       Graphics.update until Input.trigger?(:C)
  13.     end
  14.     $game_party.all_members.each do |actor|
  15.       class_id = actor.class_id
  16.       a_par += data[class_id][param_id] if data.has_key?(class_id)
  17.     end
  18.     $count -= 1
  19.     a_par
  20.   end
  21. end


测试结果的一部分(发生问题的原因):

都是初始化的时候refresh惹的祸!!!


解决办法不用我说了吧~  你想怎么解决就怎么解决啦!

At Last,求糖!
作者: 喵呜喵5    时间: 2014-5-30 17:27
taroxd 发表于 2014-5-30 17:03
测试代码:
$count = 0

……但我还是不知道怎么解决
作者: taroxd    时间: 2014-5-30 17:40
本帖最后由 taroxd 于 2014-6-2 09:52 编辑
喵呜喵5 发表于 2014-5-30 17:27
……但我还是不知道怎么解决


比如说一个解决办法
RUBY 代码复制
  1. class Game_Actor
  2.   alias m5_20140525_param_plus param_plus
  3.   def param_plus(param_id)
  4.     a_par = m5_20140525_param_plus(param_id)
  5.     return a_par if !@last_skill || # uninitialized
  6.       @actor_id != 1 # test_database
  7.     data = {1=>[1,2,3,4,5,6,7,8]} # test_database
  8.     $game_party.all_members.each do |actor|
  9.       class_id = actor.class_id
  10.       a_par += data[class_id][param_id] if data.has_key?(class_id)
  11.     end
  12.     a_par
  13.   end
  14. end

缺点:第一次初始化的完全恢复时,是按照未加成的mhp等进行计算的
但是这个随便处理一下,游戏玩家就看不出来了。比如Game_Actors中初始化角色之后立刻完全恢复之类。

如果怕由于其他人改脚本, @last_skill 的判断不可靠的话,可以在 Game_Actors 里面定义个 initialized? 或者 include? 之类的方法。这样应该就没什么问题了。

再比如说,如果不求功能完整的话,可以放弃mhp、mmp这两个属性

@Sion 结贴






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