Project1

标题: 请问有没有和横版相兼容的显示敌方hp的脚本 [打印本页]

作者: asdwds    时间: 2013-6-22 18:58
标题: 请问有没有和横版相兼容的显示敌方hp的脚本
横版的内容为 显示伤害,显示对友对敌的动画,就这2个

使用window做的显示敌方hp脚本会报错说@hpwindow.dispose的dispose是空的

所以我想问下有没有办法解决?或者有没有兼容那种横版的显示敌方hp的脚本?

---------------
或者说有没有办法让
@hpwindow.dispose动作添加到战斗逃跑的前一刻?
我发现只要不是Sprite_Battler的def dispose连带的@hpwindow.dispose就不会报错
实际上在update里,判断敌方全死后的@hpwindow.dispose不会报错
所以如果逃跑时的前一刻,加上脚本的话,就应该可以兼容了
作者: a827594998    时间: 2013-6-22 23:08
#==============================================================================
# +++ MOG - Enemy HP Meter  (v1.0) +++
#==============================================================================
# By Moghunter
# http://www.atelier-rgss.com/
#==============================================================================
# Apresenta um medidor animado com o HP do inimigo.
#==============================================================================
# Para ocultar o HP do inimigo use a TAG abaixo na caixa de notas.
#
# <Hide HP>
#
#==============================================================================
# Serão necessários as imagens.
#
# Battle_Enemy_HP_Layout.png
# Battle_Enemy_HP_Meter.png
#
#==============================================================================
module MOG_ENEMY_HP
   #Posição geral do medidor em relação ao battler.
   POSITION_CORRECTION = [0,0]
   #Posição do medidor de HP.
   HP_METER_POSITION = [2,4]
   #Prioridade do medidor na tela.
   PRIORITY_Z = 90   
end

#==============================================================================
# ■ Game Enemy
#==============================================================================
class Game_Enemy < Game_Battler

  attr_accessor :hp_meter_active               
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------
  alias mog_enemy_hp_initialize initialize
  def initialize(index, enemy_id)
      mog_enemy_hp_initialize(index, enemy_id)
      hide = enemy.note =~ /<Hide HP>/i ? true : false
      @hp_meter_active = [false,hide]
  end  

end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
  
  #--------------------------------------------------------------------------
  # ● Item Apply
  #--------------------------------------------------------------------------  
   alias mog_enemy_hp_item_apply item_apply
   def item_apply(user, item)
       mog_enemy_hp_item_apply(user, item)
       if self.is_a?(Game_Enemy)
          self.hp_meter_active[0] = true if @result.hp_damage != 0
       end
   end

  #--------------------------------------------------------------------------
  # ● Regenerate HP
  #--------------------------------------------------------------------------
  alias mog_enemy_hp_regenerate_hp regenerate_hp
  def regenerate_hp
      mog_enemy_hp_regenerate_hp
      if self.is_a?(Game_Enemy)
         self.hp_meter_active[0] = true if @result.hp_damage != 0      
      end         
  end
   
end
  

#==============================================================================
# ■ Battle_Hud
#==============================================================================
class Enemy_HP
  include MOG_ENEMY_HP
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------   
  def initialize(viewport = nil,enemy,image)
      @enemy = enemy
      @image = image
      @fade_time = -1
      create_layout   
      create_hp_meter      
      b_pos = [enemy.screen_x - (@layout.width / 2) + POSITION_CORRECTION[0], enemy.screen_y + POSITION_CORRECTION[1] - (@layout.height / 2)]
      @layout.opacity = 0
      @org_pos1 = [b_pos[0],b_pos[1]]
      @layout.x = @org_pos1[0]
      @layout.y = @org_pos1[1]
      @layout.visible = false
      @hp_meter.opacity = 0
      @hp_meter.visible = false
      @org_pos2 = [b_pos[0] + HP_METER_POSITION[0], b_pos[1] + HP_METER_POSITION[1]]
      @hp_meter.x = @org_pos2[0]
      @hp_meter.y = @org_pos2[1]
      @hp_meter.viewport = viewport
      @hp_meter.z = PRIORITY_Z
      @layout.viewport = viewport
      @layout.z = PRIORITY_Z
      @enemy.hp_meter_active[0] = false
      @Hide = @enemy.hp_meter_active[1]
  end
  
  #--------------------------------------------------------------------------
  # ● Create HP Meter
  #--------------------------------------------------------------------------        
  def create_layout
      @layout = Sprite.new
      @layout.bitmap = @image[0]
  end
   
  #--------------------------------------------------------------------------
  # ● Create HP Meter
  #--------------------------------------------------------------------------      
  def create_hp_meter
      @meter_cw = @image[1].width
      @meter_ch = @image[1].height / 2      
      @hp_meter = Sprite.new
      @hp_meter.bitmap = Bitmap.new(@meter_cw,@meter_ch)
      @hp_width_old = @meter_cw * @enemy.hp / @enemy.mhp
    end  
  
  #--------------------------------------------------------------------------
  # ● Hp Flow Update
  #--------------------------------------------------------------------------
  def update_hp_flow
      return if [email protected]     
      hp_width = @meter_cw * @enemy.hp / @enemy.mhp
      @hp_meter.bitmap.clear      
      execute_damage_flow(hp_width)
      hp_src_rect = Rect.new(0, 0,hp_width, @meter_ch)
      @hp_meter.bitmap.blt(0,0, @image[1], hp_src_rect)
  end
   
  #--------------------------------------------------------------------------
  # ● Execute Damage Flow
  #--------------------------------------------------------------------------
  def execute_damage_flow(hp_width)
      n = (@hp_width_old - hp_width).abs * 3 / 100
      damage_flow = [[n, 2].min,0.5].max
      @hp_width_old -= damage_flow
      if @hp_width_old <= hp_width
         @hp_width_old = hp_width
      end   
      src_rect_old = Rect.new(0,@meter_ch,@hp_width_old, @meter_ch)
      @hp_meter.bitmap.blt(0,0, @image[1], src_rect_old)      
  end   
  
  #--------------------------------------------------------------------------
  # ● Dispose
  #--------------------------------------------------------------------------      
  def dispose
      @layout.bitmap.dispose
      @layout.dispose
      @hp_meter.bitmap.dispose
      @hp_meter.dispose
  end
  
  #--------------------------------------------------------------------------
  # ● Update
  #--------------------------------------------------------------------------      
  def update
      return if @hide
      update_fade   
      update_visible
      update_hp_flow
      refresh if @enemy.hp_meter_active[0]
  end  
  
  #--------------------------------------------------------------------------
  # ● Update Fade
  #--------------------------------------------------------------------------        
  def update_fade
      @fade_time -= 1 if @fade_time > 0
      return if @fade_time != 0
      @layout.opacity -= 10
      @hp_meter.opacity -= 10
      @layout.x += 1
      @hp_meter.x += 1
      @fade_time = -1 if @layout.opacity == 0
  end  
  
  #--------------------------------------------------------------------------
  # ● Update Visible
  #--------------------------------------------------------------------------        
  def update_visible
      return if [email protected]
      vis = can_visible?
      @layout.visible = vis
      @hp_meter.visible = vis
  end
  
  #--------------------------------------------------------------------------
  # ● Refresh
  #--------------------------------------------------------------------------         
  def refresh     
      @enemy.hp_meter_active[0] = false
      @layout.opacity = 255
      @hp_meter.opacity = 255   
      @layout.visible = true
      @hp_meter.visible = true
      @fade_time = 60
      @layout.x = @org_pos1[0]
      @layout.y = @org_pos1[1]
      @hp_meter.x = @org_pos2[0]
      @hp_meter.y = @org_pos2[1]      
      hp_width = @meter_cw * @enemy.hp / @enemy.mhp
      @hp_width_old = hp_width if @hp_width_old < hp_width
      update_hp_flow
  end
  
  #--------------------------------------------------------------------------
  # ● Can Visible?
  #--------------------------------------------------------------------------         
  def can_visible?
      return false if @layout.opacity == 0      
      return true
  end
   
end

#==============================================================================
# ■ Spriteset Battle
#==============================================================================
class Spriteset_Battle
  
  #--------------------------------------------------------------------------
  # ● Initialize
  #--------------------------------------------------------------------------  
  alias mog_enemy_hp_initialize initialize
  def initialize
      mog_enemy_hp_initialize
      create_enemy_hp      
  end
  
  #--------------------------------------------------------------------------
  # ● Create Battle Hud
  #--------------------------------------------------------------------------   
  def create_enemy_hp   
      ie1 = Cache.system("Battle_Enemy_HP_Layout")
      ie2 = Cache.system("Battle_Enemy_HP_Meter")
      @enemy_hp_images = [ie1,ie2]
      @enemy_hp = []      
      for i in $game_troop.members
          @enemy_hp.push(Enemy_HP.new(@viewport1,i,@enemy_hp_images))
      end
  end
  
  #--------------------------------------------------------------------------
  # ● Dispose
  #--------------------------------------------------------------------------      
  alias mog_enemy_hp_dispose dispose
  def dispose
      mog_enemy_hp_dispose
      dispose_enemy_hp
  end  
  
  #--------------------------------------------------------------------------
  # ● Dispose Enemy HP
  #--------------------------------------------------------------------------        
  def dispose_enemy_hp
      return if @enemy_hp_images == nil
      @enemy_hp_images.each {|sprite| sprite.dispose }
      @enemy_hp_images.clear
      @enemy_hp.each {|sprite| sprite.dispose }
      @enemy_hp.clear
  end
  
  #--------------------------------------------------------------------------
  # ● Update
  #--------------------------------------------------------------------------        
  alias mog_enemy_hp_update update
  def update
      mog_enemy_hp_update
      update_enemy_hp
  end
  
  #--------------------------------------------------------------------------
  # ● Update Enemy HP
  #--------------------------------------------------------------------------         
  def update_enemy_hp
      return if @enemy_hp_images == nil
      @enemy_hp.each {|sprite| sprite.update }
  end  
end

$mog_rgss3_enemy_hp_meter = true
作者: a827594998    时间: 2013-6-22 23:09
这个是兼容的
作者: asdwds    时间: 2013-6-23 11:50
a827594998 发表于 2013-6-22 23:08
#==============================================================================
# +++ MOG - Enemy HP ...

果然来这个了吗。关键是我不知道怎么做条的png,请问如何制作Battle_Enemy_HP_Meter.png和Battle_Enemy_HP_Layout.png呢?
有什么要求吗?
作者: fux2‎‎‎‎    时间: 2013-6-23 12:01
http://rpg.blue/home.php?mod=spa ... o=blog&id=10840
这个脚本是可以用的(好像在某些情况下图层Z值过低,调高才可见
作者: asdwds    时间: 2013-6-23 13:11
fux2‎‎‎‎ 发表于 2013-6-23 12:01
http://rpg.blue/home.php?mod=space&uid=310500&do=blog&id=10840
这个脚本是可以用的(好像在某些情 ...



如此他报错了,是为什么?
作者: asdwds    时间: 2013-6-23 13:16
fux2‎‎‎‎ 发表于 2013-6-23 12:01
http://rpg.blue/home.php?mod=space&uid=310500&do=blog&id=10840
这个脚本是可以用的(好像在某些情 ...

Freya的定义,是分成了哪些?Gauge4种分类的内容是什么?
作者: 芙蕾娅    时间: 2013-6-23 15:37
asdwds 发表于 2013-6-23 13:16
Freya的定义,是分成了哪些?Gauge4种分类的内容是什么?

如果要用在横版战斗的话下面这个版本才对,并配合F01 - 细节美化使用(如果不想配合这脚本的话请告诉我,我改一改
RUBY 代码复制
  1. #==============================================================================
  2. # F08 - 战斗敌人显示血条·改 - By芙蕾娅
  3. #    对应横板战斗版本
  4. #------------------------------------------------------------------------------
  5. #  ★ - 新增  ☆ - 修改  ■ - 删除 ● - 无变更
  6. #==============================================================================
  7. module Freya
  8.   # 隐藏HP的文本
  9.   HideGaugeText = "Hide_Gauge"
  10.   # 血条颜色
  11.   EnemyHPGaugeColor1 = Color.new(64,128,96)
  12.   EnemyHPGaugeColor2 = Color.new(96,192,160)
  13. end
  14. #==============================================================================
  15. # ■ Sprite_Battler_HP
  16. #------------------------------------------------------------------------------
  17. #  显示战斗者的生命在战斗者的精灵下面。
  18. #==============================================================================
  19. class Sprite_Battler_HP < Sprite
  20.   #--------------------------------------------------------------------------
  21.   # ● 初始化对象
  22.   #--------------------------------------------------------------------------
  23.   def initialize(viewport,battler)
  24.     super(viewport)
  25.     [url=home.php?mod=space&uid=133701]@battler[/url] = battler
  26.     @last_hp = 0
  27.     create_bitmap
  28.     update
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● 释放
  32.   #--------------------------------------------------------------------------
  33.   def dispose
  34.     self.bitmap.dispose
  35.     super
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 生成位图
  39.   #--------------------------------------------------------------------------
  40.   def create_bitmap
  41.     @last_hp = @battler.hp
  42.     bw = 96
  43.     bh = 6
  44.     self.bitmap = Bitmap.new(bw, bh)
  45.     self.bitmap.fill_rect(0, 0, bw, bh, Color.new(32,32,64))
  46.     if Freya::Gauge_Type.nil? or Freya::Gauge_Type == 0
  47.       hp = ((bw) * @battler.hp_rate).to_i
  48.       self.bitmap.gradient_fill_rect(0, 0, hp, bh, Freya::EnemyHPGaugeColor1, Freya::EnemyHPGaugeColor2)
  49.     elsif Freya::Gauge_Type == 1
  50.       hp = ((width - 2) * @battler.hp_rate).to_i
  51.       self.bitmap.gradient_fill_rect(1, 1, hp, bh - 2, Freya::EnemyHPGaugeColor1, Freya::EnemyHPGaugeColor2)
  52.     elsif Freya::Gauge_Type == 2
  53.       hp = ((width) * @battler.hp_rate).to_i
  54.       self.bitmap.gradient_fill_rect(0, 0, hp / 2, bh, Freya::EnemyHPGaugeColor1, Freya::EnemyHPGaugeColor2)
  55.       self.bitmap.gradient_fill_rect(hp / 2, 0, hp / 2, bh, Freya::EnemyHPGaugeColor2, Freya::EnemyHPGaugeColor1)
  56.     elsif Freya::Gauge_Type == 3
  57.       hp = ((width - 2) * @battler.hp_rate).to_i
  58.       self.bitmap.gradient_fill_rect(1, 1, hp / 2, bh - 2, Freya::EnemyHPGaugeColor1, Freya::EnemyHPGaugeColor2)
  59.       self.bitmap.gradient_fill_rect((hp / 2) + 1, 1, hp / 2, bh - 2, Freya::EnemyHPGaugeColor2, Freya::EnemyHPGaugeColor1)
  60.     end
  61.   end
  62.   #--------------------------------------------------------------------------
  63.   # ● 更新画面
  64.   #--------------------------------------------------------------------------
  65.   def update
  66.     super
  67.     unless self.bitmap.nil?
  68.       self.z = @battler.sv.z + 20
  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. #==============================================================================
  81. # ■ Sprite_Battler
  82. #------------------------------------------------------------------------------
  83. #  显示战斗者的精灵。根据 Game_Battler 类的实例自动变化。
  84. #==============================================================================
  85. class Sprite_Battler < Sprite_Base
  86.   #--------------------------------------------------------------------------
  87.   # ☆ 初始化对象
  88.   #--------------------------------------------------------------------------
  89.   alias initialize_freya_enemy_hp initialize
  90.   def initialize(viewport, battler = nil)
  91.     initialize_freya_enemy_hp(viewport, battler)
  92.     if @battler.is_a?(Game_Enemy)
  93.       @hp_gauge = Sprite_Battler_HP.new(viewport, battler)
  94.     end
  95.   end
  96.   #--------------------------------------------------------------------------
  97.   # ☆ 释放
  98.   #--------------------------------------------------------------------------
  99.   alias dispose_freya_enemy_hp dispose
  100.   def dispose
  101.     dispose_freya_enemy_hp
  102.     unless @hp_gauge.nil?
  103.       @hp_gauge.dispose
  104.     end
  105.   end
  106.   #--------------------------------------------------------------------------
  107.   # ☆ 更新画面
  108.   #--------------------------------------------------------------------------
  109.   alias update_freya_enemy_hp update
  110.   def update
  111.     update_freya_enemy_hp
  112.     @hp_gauge.update unless @hp_gauge.nil?
  113.   end
  114.   alias update_freya_position update_position
  115.   def update_position
  116.     update_freya_position
  117.     @hp_gauge.x = self.x - 48 unless @hp_gauge.nil?
  118.     @hp_gauge.y = self.y unless @hp_gauge.nil?
  119.   end
  120. end

作者: asdwds    时间: 2013-6-23 15:48
芙蕾娅 发表于 2013-6-23 15:37
如果要用在横版战斗的话下面这个版本才对,并配合F01 - 细节美化使用(如果不想配合这脚本的话请告诉我, ...

非常感谢,我只是不太清楚血条的4个种类都是些什么而已,看了F01之后我已经大致理解了。

只要Freya允许的话,我自己改改就足够用了




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