查看: 3680|回复: 7

[已经解决] 这个护盾的脚本,请大家伙看看

[复制链接]
梦石
0
星屑
2019
在线时间
940 小时
注册时间
2015-10-26
回帖
293

开拓者

发表于 2017-2-22 12:00:22 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 踢腿水上飘 于 2017-2-22 14:25 编辑

这个脚本可以提供一个护盾技能,使用后附加状态63,护盾值取决于变量84的值,上了护盾之后受到攻击先扣变量84的值,扣到0了才破盾扣血
但这个脚本有几个问题
一是如果给单体加护盾的话,就会出现给A上盾之后,再给B上盾就会把A的护盾刷新了……而且,即使给2个人都上了盾,护盾的总值也是不变的,比如护盾1000点,即便给2个人上盾,也只能吸收1000点总伤害,而不是分别吸收1000点伤害。
二是我在技能使用信息那里写的“全体队员获得了共\v[84]点护盾。”,但在测试中发现显示的是0点,,,好像原因是先显示使用时的信息,然后才给变量84赋值,这个问题好解决吗?
332211.png






[pre lang="ruby"]class Game_Actor

  alias apply_guard_without_state apply_guard
  def apply_guard(value)
    value = apply_guard_without_state(value)
    if state?(63) && value > 0   # 50 号状态
      v = $game_variables      
      if v[84] >= value       # 30 号变量
        $Hurt_Shield = value
        $Magic_Shield = "have"
        v[84] -= value.to_i
        0
      else
        value -= v[84]
        $Hurt_Shield = value
        $Magic_Shield = "have"
        v[84] = 0
        $game_party.members.each {|actor| actor.remove_state(84) }
        value
      end
    else
      $Magic_Shield = ""
      value
    end
  end
end
class Game_ActionResult
  #--------------------------------------------------------------------------
  # ● 获取 HP 伤害的文字
  #--------------------------------------------------------------------------
  def hp_damage_text
    if @hp_drain > 0
      fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
      sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
    elsif @hp_damage > 0
      fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
      sprintf(fmt, @battler.name, @hp_damage)
    elsif @hp_damage < 0
      fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
      sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
    elsif $Magic_Shield == "have"
      fmt = "护盾抵消了%s点伤害,还剩下\\v[84]点护盾。"
      sprintf(fmt,$Hurt_Shield.to_i)
    else
      fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
      sprintf(fmt, @battler.name)
    end
  end
end[/pre]
梦石
0
星屑
644
在线时间
830 小时
注册时间
2016-7-24
回帖
644

开拓者

发表于 2017-2-22 13:33:48 | 显示全部楼层
你之前解這一題的時候不是就會加實例變量了嗎~
https://rpg.blue/forum.php?mod=v ... peid%26typeid%3D479
2016/07/17 加入RPG製作,勿忘初衷!
回复

使用道具 举报

梦石
0
星屑
2019
在线时间
940 小时
注册时间
2015-10-26
回帖
293

开拓者

 楼主| 发表于 2017-2-22 14:17:43 | 显示全部楼层
本帖最后由 踢腿水上飘 于 2017-2-22 14:21 编辑
QQ蚊子湯 发表于 2017-2-22 13:33
你之前解這一題的時候不是就會加實例變量了嗎~
https://rpg.blue/forum.php?mod=viewthread&tid=398881& ...


那是别人的脚本啊,我并不会……

给每个人分别上盾真是头大
回复

使用道具 举报

梦石
0
星屑
644
在线时间
830 小时
注册时间
2016-7-24
回帖
644

开拓者

发表于 2017-2-22 14:31:38 | 显示全部楼层
    class Game_Actor

      attr_accessor :description
      def description
        @description || actor.description
      end

    end

可以依樣畫葫蘆阿
把說明改成護盾 (變數名)
文字改成數字而已 (變數值)

計算傷害的時候調用 傷害-self.護盾值方法           (此為理解用的偽代碼)

你想加判斷可以創一個方法  (理解用偽代碼)

def 護盾?
@護盾值 > 0
end
(類似你上面用全局變量$Magic_Shield做的事情)


總之就是你把$Hurt_Shield改成@Hurt_Shield就可以個別判斷了
2016/07/17 加入RPG製作,勿忘初衷!
回复

使用道具 举报

梦石
0
星屑
644
在线时间
830 小时
注册时间
2016-7-24
回帖
644

开拓者

发表于 2017-2-27 07:44:16 | 显示全部楼层
本帖最后由 QQ蚊子湯 于 2017-2-27 07:45 编辑

連假早上有點空閒,寫個給你參考
我沒怎麼改你的結構,只改我想吐血的部分www

你可以感受一下實例變量和全局變量的不同之處

[pre lang="ruby"]    class Game_Actor
       attr_accessor  :game_Shield
       attr_accessor  :magic_Shield
       def add_state(state_id)
      super
     self.game_Shield =500  if state_id == 50
    end
      def apply_guard(value)
        super
        if state?(50) && value > 0   # 50 号状态
          v = @game_Shield   
          if v >= value      
            @hurt_Shield = value
            @magic_Shield = true
            @game_Shield -= value.to_i
            return 0
          else
            value -= v
            @hurt_Shield = value
            @magic_Shield = true
            @game_Shield  = 0
            self.remove_state(50)
            value
          end
        else
          @magic_Shield = false
          value
        end
      end
    end
    class Game_ActionResult
      #--------------------------------------------------------------------------
      # ● 获取 HP 伤害的文字
      #--------------------------------------------------------------------------
      def hp_damage_text
        if @hp_drain > 0
          fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
          sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
        elsif @hp_damage > 0
          fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
          sprintf(fmt, @battler.name, @hp_damage)
        elsif @hp_damage < 0
          fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
          sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
        elsif @battler.magic_Shield == true
          fmt = "护盾抵消了%s点伤害,还剩下#{@battler.game_Shield}点护盾。"
          @battler.magic_Shield = false
          sprintf(fmt,@Hurt_Shield.to_i)
        else
          fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
          sprintf(fmt, @battler.name)
        end
      end
    end[/pre]

点评

嗯,我弄下来先研究下  发表于 2017-2-27 16:17

评分

参与人数 1梦石 +1 收起 理由
RaidenInfinity + 1 版主认可的答案

查看全部评分

2016/07/17 加入RPG製作,勿忘初衷!
回复

使用道具 举报

梦石
0
星屑
265
在线时间
64 小时
注册时间
2012-1-22
回帖
51
发表于 2019-2-17 20:58:44 | 显示全部楼层
我用了楼上改良版的脚本,发现未使用护盾技能时攻击敌人有时会报错,报错是45行enemy什么的,不知道是怎么回事。

而当友方附加护盾时,提示永远是吸收了0伤害,护盾剩余数倒是正确,但是好像如果一次性伤害大于护盾数,则没有任何吸收造成没有减免的伤害,这好像也不对吧?

点评

我觉得你可以另外开一贴提问,这个问题是“已经解决”的状态  发表于 2019-2-17 21:03
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部