Project1

标题: 一个血条脚本问题 [打印本页]

作者: Vison49    时间: 2019-7-21 14:21
标题: 一个血条脚本问题
程错出现 undefined method ‘hp_rate’for # <Game_Enemy:0x2edcd60>,不知道是不是没有定义hp_rate,但是在游戏脚本game_enemy中有hp_rate的相关字符。请问如何修改
作者: Vison49    时间: 2019-7-21 14:23
  1. ==============================================================================
  2. # F08 - 战斗敌人显示血条 - By芙蕾娅
  3. #------------------------------------------------------------------------------
  4. #  ★ - 新增  ☆ - 修改  ■ - 删除 ● - 无变更
  5. #==============================================================================
  6. module Freya
  7.   # 隐藏HP的文本
  8.   HideGaugeText = "Hide_Gauge"
  9.   # 血条颜色
  10.   EnemyHPGaugeColor1 = Color.new(64,128,96)
  11.   EnemyHPGaugeColor2 = Color.new(96,192,160)
  12. end
  13. #==============================================================================
  14. # ■ Sprite_Battler_HP
  15. #------------------------------------------------------------------------------
  16. #  显示战斗者的生命在战斗者的精灵下面。
  17. #==============================================================================
  18. class Sprite_Battler_HP < Sprite
  19.   #--------------------------------------------------------------------------
  20.   # ● 初始化对象
  21.   #--------------------------------------------------------------------------
  22.   def initialize(viewport,battler)
  23.     super(viewport)
  24.     @battler = battler
  25.     @last_hp = 0
  26.     create_bitmap
  27.     update
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 释放
  31.   #--------------------------------------------------------------------------
  32.   def dispose
  33.     self.bitmap.dispose
  34.     super
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 生成位图
  38.   #--------------------------------------------------------------------------
  39.   def create_bitmap
  40.     @last_hp = @battler.hp_rate
  41.     bw = 96
  42.     bh = 6
  43.     self.bitmap = Bitmap.new(bw, bh)
  44.     self.bitmap.fill_rect(0, 0, bw, bh, Color.new(32,32,64))
  45.     if Freya::Gauge_Type.nil? or Freya::Gauge_Type == 0
  46.       hp = ((bw) * @battler.hp_rate).to_i
  47.       self.bitmap.gradient_fill_rect(0, 0, hp, bh, Freya::EnemyHPGaugeColor1, Freya::EnemyHPGaugeColor2)
  48.     elsif Freya::Gauge_Type == 1
  49.       hp = ((width - 2) * @battler.hp_rate).to_i
  50.       self.bitmap.gradient_fill_rect(1, 1, hp, bh - 2, Freya::EnemyHPGaugeColor1, Freya::EnemyHPGaugeColor2)
  51.     elsif Freya::Gauge_Type == 2
  52.       hp = ((width) * @battler.hp_rate).to_i
  53.       self.bitmap.gradient_fill_rect(0, 0, hp / 2, bh, Freya::EnemyHPGaugeColor1, Freya::EnemyHPGaugeColor2)
  54.       self.bitmap.gradient_fill_rect(hp / 2, 0, hp / 2, bh, Freya::EnemyHPGaugeColor2, Freya::EnemyHPGaugeColor1)
  55.     elsif Freya::Gauge_Type == 3
  56.       hp = ((width - 2) * @battler.hp_rate).to_i
  57.       self.bitmap.gradient_fill_rect(1, 1, hp / 2, bh - 2, Freya::EnemyHPGaugeColor1, Freya::EnemyHPGaugeColor2)
  58.       self.bitmap.gradient_fill_rect((hp / 2) + 1, 1, hp / 2, bh - 2, Freya::EnemyHPGaugeColor2, Freya::EnemyHPGaugeColor1)
  59.     end
  60.   end
  61.   #--------------------------------------------------------------------------
  62.   # ● 更新画面
  63.   #--------------------------------------------------------------------------
  64.   def update
  65.     super
  66.     unless self.bitmap.nil?
  67.       self.x = @battler.screen_x - self.width / 2
  68.       self.y = @battler.screen_y
  69.       create_bitmap if @last_hp != @battler.hp
  70.       hide = $data_enemies[@battler.enemy_id].note.include?(Freya::HideGaugeText)
  71.       if @battler.hp == 0 or hide
  72.         self.opacity = 0
  73.       elsif @battler.hp > 0 && !hide
  74.         self.opacity = 255
  75.       end
  76.     end
  77.   end
  78. end

  79. #==============================================================================
  80. # ■ Sprite_Battler
  81. #------------------------------------------------------------------------------
  82. #  显示战斗者的精灵。根据 Game_Battler 类的实例自动变化。
  83. #==============================================================================
  84. class Sprite_Battler < Sprite_Base
  85.   #--------------------------------------------------------------------------
  86.   # ☆ 初始化对象
  87.   #--------------------------------------------------------------------------
  88.   alias initialize_freya_enemy_hp initialize
  89.   def initialize(viewport, battler = nil)
  90.     initialize_freya_enemy_hp(viewport, battler)
  91.     if @battler.is_a?(Game_Enemy)
  92.       @hp_gauge = Sprite_Battler_HP.new(viewport, battler)
  93.     end
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ☆ 释放
  97.   #--------------------------------------------------------------------------
  98.   alias dispose_freya_enemy_hp dispose
  99.   def dispose
  100.     dispose_freya_enemy_hp
  101.     unless @hp_gauge.nil?
  102.       @hp_gauge.dispose
  103.     end
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ☆ 更新画面
  107.   #--------------------------------------------------------------------------
  108.   alias update_freya_enemy_hp update
  109.   def update
  110.     update_freya_enemy_hp
  111.     @hp_gauge.update unless @hp_gauge.nil?
  112.   end
  113. end
复制代码

QQ图片20190721014257.png (50.26 KB, 下载次数: 22)

QQ图片20190721014257.png

作者: Vison49    时间: 2019-7-21 14:25
  1. ==============================================================================
  2. # ** Game_Enemy
  3. #------------------------------------------------------------------------------
  4. #  這個類用來操控敵方人物,這個類作為 Game_troop 類($game_troop)的內部類使用。
  5. #==============================================================================

  6. class Game_Enemy < Game_Battler
  7.   #--------------------------------------------------------------------------
  8.   # * 宣告執行個體變數
  9.   #--------------------------------------------------------------------------
  10.   attr_reader   :index                    # 隊伍中隊員編號
  11.   attr_reader   :enemy_id                 # 敵人類型編號
  12.   attr_reader   :original_name            # 原始名稱
  13.   attr_accessor :letter                   # 要附加於敵人名稱之後的字母
  14.   attr_accessor :plural                   # 有多個敵人出現的標幟
  15.   attr_accessor :screen_x                 # 作戰畫面X座標
  16.   attr_accessor :screen_y                 # 作戰畫面Y座標
  17.   #--------------------------------------------------------------------------
  18.   # * 物件初始化
  19.   #     index    : 隊伍內隊員編號
  20.   #     enemy_id : 敵人類型編號
  21.   #--------------------------------------------------------------------------
  22.   def initialize(index, enemy_id)
  23.     super()
  24.     @index = index
  25.     @enemy_id = enemy_id
  26.     enemy = $data_enemies[@enemy_id]
  27.     @original_name = enemy.name
  28.     @letter = ''
  29.     @plural = false
  30.     @screen_x = 0
  31.     @screen_y = 0
  32.     @battler_name = enemy.battler_name
  33.     @battler_hue = enemy.battler_hue
  34.     @hp = maxhp
  35.     @mp = maxmp
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # * 判定是否是主角(當然要返回false了喔~)
  39.   #--------------------------------------------------------------------------
  40.   def actor?
  41.     return false
  42.   end
  43.   #--------------------------------------------------------------------------
  44.   # * 獲取敵人物件資訊
  45.   #--------------------------------------------------------------------------
  46.   def enemy
  47.     return $data_enemies[@enemy_id]
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # * 獲取敵人顯示名資訊
  51.   #--------------------------------------------------------------------------
  52.   def name
  53.     if @plural
  54.       return @original_name + letter
  55.     else
  56.       return @original_name
  57.     end
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # * 獲取基礎HP上限值資訊
  61.   #--------------------------------------------------------------------------
  62.   def base_maxhp
  63.     return enemy.maxhp
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # * 獲取基礎MP上限值資訊
  67.   #--------------------------------------------------------------------------
  68.   def base_maxmp
  69.     return enemy.maxmp
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # * 獲取基礎攻擊力資訊
  73.   #--------------------------------------------------------------------------
  74.   def base_atk
  75.     return enemy.atk
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # * 獲取基礎防禦力資訊
  79.   #--------------------------------------------------------------------------
  80.   def base_def
  81.     return enemy.def
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # * 獲取基礎精神意志力資訊
  85.   #--------------------------------------------------------------------------
  86.   def base_spi
  87.     return enemy.spi
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # * 獲取基礎敏捷力資訊
  91.   #--------------------------------------------------------------------------
  92.   def base_agi
  93.     return enemy.agi
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # * 獲取命中率資訊
  97.   #--------------------------------------------------------------------------
  98.   def hit
  99.     return enemy.hit
  100.   end
  101.   #--------------------------------------------------------------------------
  102.   # * 獲取迴避率資訊
  103.   #--------------------------------------------------------------------------
  104.   def eva
  105.     return enemy.eva
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # * 獲取會心一擊率資訊
  109.   #--------------------------------------------------------------------------
  110.   def cri
  111.     return enemy.has_critical ? 10 : 0
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # * 獲取攻擊優勢資訊
  115.   #--------------------------------------------------------------------------
  116.   def odds
  117.     return 1
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # * 獲取屬性調整度資訊
  121.   #     element_id : 屬性編號
  122.   #--------------------------------------------------------------------------
  123.   def element_rate(element_id)
  124.     rank = enemy.element_ranks[element_id]
  125.     result = [0,200,150,100,50,0,-100][rank]
  126.     for state in states
  127.       result /= 2 if state.element_set.include?(element_id)
  128.     end
  129.     return result
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # * 獲取狀態附加成功率資訊
  133.   #     state_id : 狀態編號
  134.   #--------------------------------------------------------------------------
  135.   def state_probability(state_id)
  136.     if $data_states[state_id].nonresistance
  137.       return 100
  138.     else
  139.       rank = enemy.state_ranks[state_id]
  140.       return [0,100,80,60,40,20,0][rank]
  141.     end
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # * 獲取經驗值資訊
  145.   #--------------------------------------------------------------------------
  146.   def exp
  147.     return enemy.exp
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # * 獲取所攜資金資訊
  151.   #--------------------------------------------------------------------------
  152.   def gold
  153.     return enemy.gold
  154.   end
  155.   #--------------------------------------------------------------------------
  156.   # * 獲取掉落物品1的資訊
  157.   #--------------------------------------------------------------------------
  158.   def drop_item1
  159.     return enemy.drop_item1
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # * 獲取掉落物品2的資訊
  163.   #--------------------------------------------------------------------------
  164.   def drop_item2
  165.     return enemy.drop_item2
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # * 使用精靈物設?
  169.   #--------------------------------------------------------------------------
  170.   def use_sprite?
  171.     return true
  172.   end
  173.   #--------------------------------------------------------------------------
  174.   # * 獲取作戰畫面Z座標資訊
  175.   #--------------------------------------------------------------------------
  176.   def screen_z
  177.     return 100
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # * 執行敵人死亡處理
  181.   #--------------------------------------------------------------------------
  182.   def perform_collapse
  183.     if $game_temp.in_battle and dead?
  184.       @collapse = true
  185.       Sound.play_enemy_collapse
  186.     end
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # * 撤退
  190.   #--------------------------------------------------------------------------
  191.   def escape
  192.     @hidden = true
  193.     @action.clear
  194.   end
  195.   #--------------------------------------------------------------------------
  196.   # * 變身
  197.   #     enemy_id : 要變身為的敵人類型的編號
  198.   #--------------------------------------------------------------------------
  199.   def transform(enemy_id)
  200.     @enemy_id = enemy_id
  201.     if enemy.name != @original_name
  202.       @original_name = enemy.name
  203.       @letter = ''
  204.       @plural = false
  205.     end
  206.     @battler_name = enemy.battler_name
  207.     @battler_hue = enemy.battler_hue
  208.     make_action
  209.   end
  210.   #--------------------------------------------------------------------------
  211.   # * 確定執行作戰行為的條件是否得到滿足
  212.   #     action : 作戰行為
  213.   #--------------------------------------------------------------------------
  214.   def conditions_met?(action)
  215.     case action.condition_type
  216.     when 1  # 回合數
  217.       n = $game_troop.turn_count
  218.       a = action.condition_param1
  219.       b = action.condition_param2
  220.       return false if (b == 0 and n != a)
  221.       return false if (b > 0 and (n < 1 or n < a or n % b != a % b))
  222.     when 2  # HP值
  223.       hp_rate = hp * 100.0 / maxhp
  224.       return false if hp_rate < action.condition_param1
  225.       return false if hp_rate > action.condition_param2
  226.     when 3  # MP值
  227.       mp_rate = mp * 100.0 / maxmp
  228.       return false if mp_rate < action.condition_param1
  229.       return false if mp_rate > action.condition_param2
  230.     when 4  # 狀態
  231.       return false unless state?(action.condition_param1)
  232.     when 5  # 隊伍中等級最高者的等級
  233.       return false if $game_party.max_level < action.condition_param1
  234.     when 6  # 開關
  235.       switch_id = action.condition_param1
  236.       return false if $game_switches[switch_id] == false
  237.     end
  238.     return true
  239.   end
  240.   #--------------------------------------------------------------------------
  241.   # * 建立作戰行為
  242.   #--------------------------------------------------------------------------
  243.   def make_action
  244.     @action.clear
  245.     return unless movable?
  246.     available_actions = []
  247.     rating_max = 0
  248.     for action in enemy.actions
  249.       next unless conditions_met?(action)
  250.       if action.kind == 1
  251.         next unless skill_can_use?($data_skills[action.skill_id])
  252.       end
  253.       available_actions.push(action)
  254.       rating_max = [rating_max, action.rating].max
  255.     end
  256.     ratings_total = 0
  257.     rating_zero = rating_max - 3
  258.     for action in available_actions
  259.       next if action.rating <= rating_zero
  260.       ratings_total += action.rating - rating_zero
  261.     end
  262.     return if ratings_total == 0
  263.     value = rand(ratings_total)
  264.     for action in available_actions
  265.       next if action.rating <= rating_zero
  266.       if value < action.rating - rating_zero
  267.         @action.kind = action.kind
  268.         @action.basic = action.basic
  269.         @action.skill_id = action.skill_id
  270.         @action.decide_random_target
  271.         return
  272.       else
  273.         value -= action.rating - rating_zero
  274.       end
  275.     end
  276.   end
  277. end
复制代码

作者: 百里_飞柳    时间: 2019-7-21 17:14
本帖最后由 百里_飞柳 于 2019-7-21 18:49 编辑

是没有这个方法,但是在你截图的判定里面就给出了这个方法的内容了,不过它里面只是局部变量,调用后就销毁
所以你把它改成一个方法放到Game_Enemy类里面就好
  1. def hp_rate
  2.   hp * 1.0 / maxhp
  3. end
复制代码


以及这个显示敌人血条的脚本是VA的
作者: Vison49    时间: 2019-7-21 17:59
百里_飞柳 发表于 2019-7-21 17:14
是没有这个方法,但是在你截图的判定里面就给出了这个方法的内容了,不过它里面只是局部变量,调用后就销毁 ...

好的,谢谢大神。我也不太清楚是VX还是VA的,不过这个脚本可以在VX上运行吗
作者: Vison49    时间: 2019-7-21 18:36
百里_飞柳 发表于 2019-7-21 17:14
是没有这个方法,但是在你截图的判定里面就给出了这个方法的内容了,不过它里面只是局部变量,调用后就销毁 ...

脚本可以运行了。但是在伤害判定之后,血条并没有变是怎么回事
作者: Vison49    时间: 2019-7-21 18:41
@百里_飞柳

QQ图片20190721183835.png (410.18 KB, 下载次数: 23)

QQ图片20190721183835.png

作者: Vison49    时间: 2019-7-21 18:52
可能是血条比率大了




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