Project1

标题: 请教Enemy HP 战斗时敌人显示血槽脚本的问题 [打印本页]

作者: RM无节操小分队    时间: 2014-10-25 18:27
标题: 请教Enemy HP 战斗时敌人显示血槽脚本的问题
Enemy HP 这个脚本是在敌人被攻击的时候,才会显示血槽,请问修改那一句,可以让血槽始终显示?
还有,
能不能让人物头顶或脚下也显示这样的血槽?
下面是Enemy HP脚本
RUBY 代码复制
  1. #==============================================================================
  2. # +++ MOG - Enemy HP Meter  (v1.0) +++
  3. #==============================================================================
  4. # By Moghunter
  5. # [url]http://www.atelier-rgss.com/[/url]
  6. #==============================================================================
  7. # Apresenta um medidor animado com o HP do inimigo.
  8. #==============================================================================
  9. # Para ocultar o HP do inimigo use a TAG abaixo na caixa de notas.
  10. #
  11. # <Hide HP>
  12. #
  13. #==============================================================================
  14. # Serão necessários as imagens.
  15. #
  16. # Battle_Enemy_HP_Layout.png
  17. # Battle_Enemy_HP_Meter.png
  18. #
  19. #==============================================================================
  20. module MOG_ENEMY_HP
  21.    #Posição geral do medidor em relação ao battler.
  22.    POSITION_CORRECTION = [0,0]
  23.    #Posição do medidor de HP.
  24.    HP_METER_POSITION = [2,4]
  25.    #Prioridade do medidor na tela.
  26.    PRIORITY_Z = 101   
  27. end
  28.  
  29. #==============================================================================
  30. # ■ Game Enemy
  31. #==============================================================================
  32. class Game_Enemy < Game_Battler
  33.  
  34.   attr_accessor :hp_meter_active               
  35.  
  36.   #--------------------------------------------------------------------------
  37.   # ● Initialize
  38.   #--------------------------------------------------------------------------
  39.   alias mog_enemy_hp_initialize initialize
  40.   def initialize(index, enemy_id)
  41.       mog_enemy_hp_initialize(index, enemy_id)
  42.       hide = enemy.note =~ /<Hide HP>/i ? true : false
  43.       @hp_meter_active = [false,hide]
  44.   end  
  45.  
  46. end
  47.  
  48. #==============================================================================
  49. # ■ Game_Battler
  50. #==============================================================================
  51. class Game_Battler < Game_BattlerBase
  52.  
  53.   #--------------------------------------------------------------------------
  54.   # ● Item Apply
  55.   #--------------------------------------------------------------------------  
  56.    alias mog_enemy_hp_item_apply item_apply
  57.    def item_apply(user, item)
  58.        mog_enemy_hp_item_apply(user, item)
  59.        if self.is_a?(Game_Enemy)
  60.           self.hp_meter_active[0] = true if @result.hp_damage != 0
  61.        end
  62.    end
  63.  
  64.   #--------------------------------------------------------------------------
  65.   # ● Regenerate HP
  66.   #--------------------------------------------------------------------------
  67.   alias mog_enemy_hp_regenerate_hp regenerate_hp
  68.   def regenerate_hp
  69.       mog_enemy_hp_regenerate_hp
  70.       if self.is_a?(Game_Enemy)
  71.          self.hp_meter_active[0] = true if @result.hp_damage != 0      
  72.       end         
  73.   end
  74.  
  75. end
  76.  
  77.  
  78. #==============================================================================
  79. # ■ Battle_Hud
  80. #==============================================================================
  81. class Enemy_HP
  82.   include MOG_ENEMY_HP
  83.  
  84.   #--------------------------------------------------------------------------
  85.   # ● Initialize
  86.   #--------------------------------------------------------------------------   
  87.   def initialize(viewport = nil,enemy,image)
  88.       @enemy = enemy
  89.       @image = image
  90.       @fade_time = -1
  91.       create_layout   
  92.       create_hp_meter      
  93.       b_pos = [enemy.screen_x - (@layout.width / 2) + POSITION_CORRECTION[0], enemy.screen_y + POSITION_CORRECTION[1] - (@layout.height / 2)]
  94.       @layout.opacity = 0
  95.       @org_pos1 = [b_pos[0],b_pos[1]]
  96.       @layout.x = @org_pos1[0]
  97.       @layout.y = @org_pos1[1]
  98.       @layout.visible = false
  99.       @hp_meter.opacity = 0
  100.       @hp_meter.visible = false
  101.       @org_pos2 = [b_pos[0] + HP_METER_POSITION[0], b_pos[1] + HP_METER_POSITION[1]]
  102.       @hp_meter.x = @org_pos2[0]
  103.       @hp_meter.y = @org_pos2[1]
  104.       @hp_meter.viewport = viewport
  105.       @hp_meter.z = PRIORITY_Z
  106.       @layout.viewport = viewport
  107.       @layout.z = PRIORITY_Z
  108.       @enemy.hp_meter_active[0] = false
  109.       [url=home.php?mod=space&uid=94902]@Hide[/url] = @enemy.hp_meter_active[1]
  110.   end
  111.  
  112.   #--------------------------------------------------------------------------
  113.   # ● Create HP Meter
  114.   #--------------------------------------------------------------------------        
  115.   def create_layout
  116.       @layout = Sprite.new
  117.       @layout.bitmap = @image[0]
  118.   end
  119.  
  120.   #--------------------------------------------------------------------------
  121.   # ● Create HP Meter
  122.   #--------------------------------------------------------------------------      
  123.   def create_hp_meter
  124.       @meter_cw = @image[1].width
  125.       @meter_ch = @image[1].height / 2      
  126.       @hp_meter = Sprite.new
  127.       @hp_meter.bitmap = Bitmap.new(@meter_cw,@meter_ch)
  128.       @hp_width_old = @meter_cw * @enemy.hp / @enemy.mhp
  129.     end  
  130.  
  131.   #--------------------------------------------------------------------------
  132.   # ● Hp Flow Update
  133.   #--------------------------------------------------------------------------
  134.   def update_hp_flow
  135.       return if !@layout.visible     
  136.       hp_width = @meter_cw * @enemy.hp / @enemy.mhp
  137.       @hp_meter.bitmap.clear      
  138.       execute_damage_flow(hp_width)
  139.       hp_src_rect = Rect.new(0, 0,hp_width, @meter_ch)
  140.       @hp_meter.bitmap.blt(0,0, @image[1], hp_src_rect)
  141.   end
  142.  
  143.   #--------------------------------------------------------------------------
  144.   # ● Execute Damage Flow
  145.   #--------------------------------------------------------------------------
  146.   def execute_damage_flow(hp_width)
  147.       n = (@hp_width_old - hp_width).abs * 3 / 100
  148.       damage_flow = [[n, 2].min,0.5].max
  149.       @hp_width_old -= damage_flow
  150.       if @hp_width_old <= hp_width
  151.          @hp_width_old = hp_width
  152.       end   
  153.       src_rect_old = Rect.new(0,@meter_ch,@hp_width_old, @meter_ch)
  154.       @hp_meter.bitmap.blt(0,0, @image[1], src_rect_old)      
  155.   end   
  156.  
  157.   #--------------------------------------------------------------------------
  158.   # ● Dispose
  159.   #--------------------------------------------------------------------------      
  160.   def dispose
  161.       @layout.bitmap.dispose
  162.       @layout.dispose
  163.       @hp_meter.bitmap.dispose
  164.       @hp_meter.dispose
  165.   end
  166.  
  167.   #--------------------------------------------------------------------------
  168.   # ● Update
  169.   #--------------------------------------------------------------------------      
  170.   def update
  171.       return if @hide
  172.       update_fade   
  173.       update_visible
  174.       update_hp_flow
  175.       refresh if @enemy.hp_meter_active[0]
  176.   end  
  177.  
  178.   #--------------------------------------------------------------------------
  179.   # ● Update Fade
  180.   #--------------------------------------------------------------------------        
  181.   def update_fade
  182.       @fade_time -= 1 if @fade_time > 0
  183.       return if @fade_time != 0
  184.       @layout.opacity -= 10
  185.       @hp_meter.opacity -= 10
  186.       @layout.x += 1
  187.       @hp_meter.x += 1
  188.       @fade_time = -1 if @layout.opacity == 0
  189.   end  
  190.  
  191.   #--------------------------------------------------------------------------
  192.   # ● Update Visible
  193.   #--------------------------------------------------------------------------        
  194.   def update_visible
  195.       return if !@layout.visible
  196.       vis = can_visible?
  197.       @layout.visible = vis
  198.       @hp_meter.visible = vis
  199.   end
  200.  
  201.   #--------------------------------------------------------------------------
  202.   # ● Refresh
  203.   #--------------------------------------------------------------------------         
  204.   def refresh     
  205.       @enemy.hp_meter_active[0] = false
  206.       @layout.opacity = 255
  207.       @hp_meter.opacity = 255   
  208.       @layout.visible = true
  209.       @hp_meter.visible = true
  210.       @fade_time = 60
  211.       @layout.x = @org_pos1[0]
  212.       @layout.y = @org_pos1[1]
  213.       @hp_meter.x = @org_pos2[0]
  214.       @hp_meter.y = @org_pos2[1]      
  215.       hp_width = @meter_cw * @enemy.hp / @enemy.mhp
  216.       @hp_width_old = hp_width if @hp_width_old < hp_width
  217.       update_hp_flow
  218.   end
  219.  
  220.   #--------------------------------------------------------------------------
  221.   # ● Can Visible?
  222.   #--------------------------------------------------------------------------         
  223.   def can_visible?
  224.       return false if @layout.opacity == 0      
  225.       return true
  226.   end
  227.  
  228. end
  229.  
  230. #==============================================================================
  231. # ■ Spriteset Battle
  232. #==============================================================================
  233. class Spriteset_Battle
  234.  
  235.   #--------------------------------------------------------------------------
  236.   # ● Initialize
  237.   #--------------------------------------------------------------------------  
  238.   alias mog_enemy_hp_initialize initialize
  239.   def initialize
  240.       mog_enemy_hp_initialize
  241.       create_enemy_hp      
  242.   end
  243.  
  244.   #--------------------------------------------------------------------------
  245.   # ● Create Battle Hud
  246.   #--------------------------------------------------------------------------   
  247.   def create_enemy_hp   
  248.       ie1 = Cache.system("Battle_Enemy_HP_Layout")
  249.       ie2 = Cache.system("Battle_Enemy_HP_Meter")
  250.       @enemy_hp_images = [ie1,ie2]
  251.       @enemy_hp = []      
  252.       for i in $game_troop.members
  253.           @enemy_hp.push(Enemy_HP.new(@viewport1,i,@enemy_hp_images))
  254.       end
  255.   end
  256.  
  257.   #--------------------------------------------------------------------------
  258.   # ● Dispose
  259.   #--------------------------------------------------------------------------      
  260.   alias mog_enemy_hp_dispose dispose
  261.   def dispose
  262.       mog_enemy_hp_dispose
  263.       dispose_enemy_hp
  264.   end  
  265.  
  266.   #--------------------------------------------------------------------------
  267.   # ● Dispose Enemy HP
  268.   #--------------------------------------------------------------------------        
  269.   def dispose_enemy_hp
  270.       return if @enemy_hp_images == nil
  271.       @enemy_hp_images.each {|sprite| sprite.dispose }
  272.       @enemy_hp_images.clear
  273.       @enemy_hp.each {|sprite| sprite.dispose }
  274.       @enemy_hp.clear
  275.   end
  276.  
  277.   #--------------------------------------------------------------------------
  278.   # ● Update
  279.   #--------------------------------------------------------------------------        
  280.   alias mog_enemy_hp_update update
  281.   def update
  282.       mog_enemy_hp_update
  283.       update_enemy_hp
  284.   end
  285.  
  286.   #--------------------------------------------------------------------------
  287.   # ● Update Enemy HP
  288.   #--------------------------------------------------------------------------         
  289.   def update_enemy_hp
  290.       return if @enemy_hp_images == nil
  291.       @enemy_hp.each {|sprite| sprite.update }
  292.   end  
  293. end
  294.  
  295. $mog_rgss3_enemy_hp_meter = true

作者: VIPArcher    时间: 2014-10-26 00:23
本帖最后由 VIPArcher 于 2014-10-26 15:59 编辑
  1. class Enemy_HP
  2.   alias vip_20141025_init initialize
  3.   def initialize(viewport = nil,enemy,image)
  4.     vip_20141025_init(viewport,enemy,image)
  5.     @layout.opacity = 255
  6.     @hp_meter.opacity = 255
  7.     @layout.visible = true
  8.     @hp_meter.visible = true
  9.     @enemy.hp_meter_active[0] = true
  10.   end
  11.   alias vip_20141026_update_fade update_fade
  12.   def update_fade
  13.     return unless @enemy.death_state?
  14.     vip_20141026_update_fade
  15.   end
  16. end
复制代码
插在该脚本的下方。
======================更新了一下================
现在敌人死亡后血条会消失
作者: RM无节操小分队    时间: 2014-10-26 12:27
本帖最后由 RM无节操小分队 于 2014-10-26 12:31 编辑
VIPArcher 发表于 2014-10-26 00:23
插在该脚本的下方。


QQ截图20141026122236D:\QQ截图20141026122236.PNG
怪物死后还是留着血槽
作者: tseyik    时间: 2014-10-26 13:38
本帖最后由 tseyik 于 2014-10-26 13:41 编辑

http://petitrare.com/blog/?cat=22

放在Graphics\System
  1. #==============================================================================
  2. # ■ 敵のHP表示
  3. #   @version 0.9 14/06/23
  4. #   @author さば缶
  5. #------------------------------------------------------------------------------
  6. #  敵キャラの状態を表示します
  7. #   表示したくないステートは、メモ欄に
  8. #   <非表示>
  9. #   と入力してください
  10. #==============================================================================
  11. module Saba
  12.   module SesUi
  13.    
  14.     # テキストカラーやHPバーカラーにシステムカラーを使う場合、true に設定します。
  15.     USE_SYSTEM_COLOR = true
  16.    
  17.     # HP表示ボックスのy座標です。
  18.     CONTAINER_Y       = 265
  19.    
  20.     # 基準点の座標を敵の上部にする場合true に設定します
  21.     # デフォルトは敵の下部の座標
  22.     # その場合、↑の CONTAINER_Y の値分だけ下に表示されます
  23.     ANCHOR_TOP = false
  24.     # これ以上、上には表示されません
  25.     MIN_POS_Y         = 60
  26.    
  27.     # HPのy座標を敵の座標にあわせて変化させる場合true
  28.     # その場合、↑の CONTAINER_Y の値分だけ敵の下に表示されます
  29.     RELATIVE_POS      = false
  30.     # これ以上、下には表示されません
  31.     MAX_POS_Y         = 270
  32.    
  33.     #--------------------------------------------------------------------------
  34.     # ● テキスト関係
  35.     #--------------------------------------------------------------------------
  36.     # HPテキストを表示する場合true、表示しない場合false
  37.     SHOW_HP_TEXT      = false
  38.    
  39.    
  40.     # HPラベルのテキストです。
  41.     LABEL             = "HP"
  42.    
  43.     # HPラベルの色です。システムカラーを使う場合無視されます。
  44.     LABEL_COLOR  = Color.new(180, 180, 255)
  45.    
  46.     # HPラベルのフォントサイズです。
  47.     LABEL_FONT_SIZE   = 25
  48.    
  49.    
  50.     # HPの値の色です。システムカラーを使う場合無視されます。
  51.     VALUE_COLOR  = Color.new(255, 255, 255)
  52.    
  53.     # HPの値のフォントサイズです。
  54.     VALUE_FONT_SIZE   = 25
  55.    
  56.     # HPの値の基準点です。0=左揃え 1=中央揃え 2=右揃え
  57.     VALUE_ALIGN       = 1
  58.    
  59.    
  60.     # コンテナの中心からの、HPラベルのX座標の相対位置です。
  61.     TEXT_OFFSET_X  = -35
  62.    
  63.     # コンテナの中心からの、HPラベルのY座標の相対位置です。
  64.     TEXT_OFFSET_Y  = 0
  65.    
  66.     # HPラベルの横幅です。
  67.     TEXT_WIDTH     = 40
  68.    
  69.    
  70.     # コンテナの中心からの、HPの値のX座標の相対位置です。
  71.     VALUE_OFFSET_X = -5
  72.    
  73.     # コンテナの中心からの、HPの値のY座標の相対位置です。
  74.     VALUE_OFFSET_Y = 0
  75.    
  76.     # HPの値の横幅です。
  77.     VALUE_WIDTH    = 40
  78.    
  79.     #--------------------------------------------------------------------------
  80.     # ● HP MPバー関係
  81.     #--------------------------------------------------------------------------
  82.     # HPバーを表示する場合true、表示しない場合false
  83.     SHOW_HP_BAR      = true
  84.    
  85.     # MPバーを表示する場合true、表示しない場合false
  86.     SHOW_MP_BAR      = false
  87.     # 最大MPが0の敵のMPバーを表示する場合true、表示しない場合false
  88.     SHOW_MMP0_MP_BAR = false
  89.     # MPバーの座標
  90.     MP_OFFSET_Y      = 9
  91.    
  92.     # 背景に画像を使う場合 true に設定します。
  93.     # true の場合、Graphics/System/gauge_bg.png が使われます。
  94.     USE_BACKGROUND_IMAGE = true
  95.    
  96.     BACKGROUND_IMAGE_FILE = "gauge_bg"
  97.    
  98.     # 背景画像の、左端からゲージ本体までの幅です。
  99.     MARGIN_LEFT = 3
  100.    
  101.     # 背景画像の、右端からゲージ本体までの幅です。
  102.     MARGIN_RIGHT = 3
  103.    
  104.     # 背景画像の y の相対値です。
  105.     BG_OFFSET_Y = -3
  106.    
  107.     # Z深度です。この値が大きいほど、手前に表示されます。
  108.     Z_DEPTH = 10
  109.    
  110.     # HPバーの背景色です。システムカラーを使う場合無視されます。
  111.     BAR_BG_COLOR        = Color.new(50, 50, 50, 70)
  112.    
  113.     BAR_BORDER_COLOR    = Color.new(0, 0, 0)
  114.    
  115.     # HPバーの前景色です。システムカラーを使う場合無視されます。
  116.     BAR_FG_COLOR_1        = Color.new(155, 110, 30)
  117.    
  118.     # HPバーの前景色です。システムカラーを使う場合無視されます。
  119.     BAR_FG_COLOR_2        = Color.new(255, 200, 120)
  120.    
  121.     # MPバーの前景色です。システムカラーを使う場合無視されます。
  122.     BAR_FG_MP_COLOR_1     = Color.new(155, 110, 30)
  123.    
  124.     # MPバーの前景色です。システムカラーを使う場合無視されます。
  125.     BAR_FG_MP_COLOR_2     = Color.new(255, 200, 120)
  126.    

  127.     # コンテナの中心からの、HPバーのY座標の相対位置です。
  128.     BAR_OFFSET_Y  = 15
  129.    
  130.     # HPバーの横幅です。
  131.     BAR_WIDTH  = 80
  132.    
  133.     # HPバーの高さです。
  134.     BAR_HEIGHT  = 4
  135.    
  136.     # HPバーの最低の長さです。HPが1でも最低この長さが表示されます。
  137.     BAR_MIN_WIDTH = 2

  138.     # バーが重なっていた場合にずらす y の値です。
  139.     SHIFT_Y = -15
  140.    
  141.     #--------------------------------------------------------------------------
  142.     # ● ステート関係
  143.     #--------------------------------------------------------------------------
  144.     # ステートが2ページ以上にわたるとき、それが切り替わるフレーム数
  145.     STATE_PAGE_CHANGE_INTERVAL = 60
  146.     # ステートを表示する場合true、表示しない場合false
  147.     SHOW_STATE      = true
  148.     # ステートアイコンの最大表示数です。
  149.     MAX_NUM_STATE   = 4
  150.     # コンテナの中心からの、ステートのX座標の相対位置です。
  151.     STATE_OFFSET_X = -42
  152.     # コンテナの中心からの、ステートのY座標の相対位置です。
  153.     STATE_OFFSET_Y = -11
  154.   end
  155.   
  156.   module SesSys
  157.     # この文字列を敵のメモ欄に入れると、その敵のHPが表示されなくなります。
  158.     HIDE_HP_MARKER = "<HIDE_HP>"
  159.    
  160.     def define_note?(item, name)
  161.       return false if item == nil
  162.       return item.note.include?(HIDE_HP_MARKER)
  163.     end
  164.   end
  165. end



  166. #==============================================================================
  167. # ここから実装です。
  168. #==============================================================================
  169. $imported = {} if $imported == nil
  170. $imported["ShowEnemyStatus"] = true

  171. class Game_Temp
  172.   #--------------------------------------------------------------------------
  173.   # ● 公開インスタンス変数
  174.   #--------------------------------------------------------------------------
  175.   attr_accessor   :saba_lock_hp_view
  176.   #--------------------------------------------------------------------------
  177.   # ● オブジェクト初期化
  178.   #--------------------------------------------------------------------------
  179.   alias saba_enemyhp_initialize initialize
  180.   def initialize
  181.     saba_enemyhp_initialize
  182.     @saba_lock_hp_view = false
  183.   end
  184. end

  185. class Window_BattleLog
  186.   #--------------------------------------------------------------------------
  187.   # ● クリティカルヒットの表示
  188.   #--------------------------------------------------------------------------
  189.   alias saba_enemyhp_display_critical display_critical
  190.   def display_critical(target, item)
  191.     $game_temp.saba_lock_hp_view = true if target.result.critical
  192.     saba_enemyhp_display_critical(target, item)
  193.     $game_temp.saba_lock_hp_view = false
  194.   end
  195. end

  196. class Sprite_EnemyStatus < Sprite_Base
  197.   include Saba::SesSys
  198.   include Saba::SesUi
  199.   WLH = 24                  # 行の高さ基準値 (Window Line Height)
  200.   #--------------------------------------------------------------------------
  201.   # ● オブジェクト初期化
  202.   #     viewport : ビューポート
  203.   #--------------------------------------------------------------------------
  204.   def initialize(viewport, enemy_sprites)
  205.     super(viewport)
  206.     @enemy_sprites = enemy_sprites
  207.     @page_change_wait = 0
  208.     @page_count = 0
  209.     self.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  210.     self.bitmap.font.size = 25
  211.     @windowskin = Cache.system("Window")
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # ● 使用したリソースを解放します。
  215.   #--------------------------------------------------------------------------
  216.   def dispose
  217.     self.bitmap.dispose
  218.     super
  219.   end
  220.   #--------------------------------------------------------------------------
  221.   # ● ステータス情報を更新します。
  222.   #--------------------------------------------------------------------------
  223.   def update
  224.     super
  225.     return if $game_temp.saba_lock_hp_view
  226.    
  227.     if no_change?
  228.       @page_change_wait += 1
  229.       return if @page_change_wait < STATE_PAGE_CHANGE_INTERVAL
  230.       @page_change_wait = 0
  231.       @page_count += 1
  232.     else
  233.       @page_change_wait = 0
  234.     end
  235.     save_enemy_status
  236.     self.bitmap.clear
  237.     draw_status
  238.   end
  239.   #--------------------------------------------------------------------------
  240.   # ● ステートのページ数取得
  241.   #--------------------------------------------------------------------------
  242.   def state_page_count
  243.     n = 1
  244.     @enemy_sprites.size.times do |i|
  245.       n = [(@enemy_states[i].size + @enemy_buff_icons[i].size) / MAX_NUM_STATE, n].max
  246.     end
  247.     return n
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ● 敵のHPに変化があったかどうかを調べます。毎回描画するのを防ぐためです。
  251.   # [url=home.php?mod=space&uid=352621]@return[/url] 変化があった場合 true、なかった場合 false
  252.   #--------------------------------------------------------------------------
  253.   def no_change?
  254.     return false if @enemy_hps == nil
  255.     @enemy_sprites.size.times do |i|
  256.       enemy = @enemy_sprites[i].battler
  257.       return false unless @enemy_hps[i] == enemy.hp
  258.       return false unless @enemy_mps[i] == enemy.mp
  259.       return false unless @enemy_exists[i] == enemy.exist?
  260.       return false unless @enemy_states[i] == enemy.states
  261.       return false unless @enemy_buff_icons[i] == enemy.buff_icons
  262.     end
  263.     return true
  264.   end
  265.   #--------------------------------------------------------------------------
  266.   # ● 敵のHPと状態を覚えておきます。
  267.   #--------------------------------------------------------------------------
  268.   def save_enemy_status
  269.     @enemy_hps ||= []
  270.     @enemy_mps ||= []
  271.     @enemy_exists ||= []
  272.     @enemy_states ||= []
  273.     @enemy_buff_icons ||= []
  274.     @enemy_sprites.size.times do |i|
  275.       enemy = @enemy_sprites[i].battler
  276.       @enemy_hps[i] = enemy.hp
  277.       @enemy_mps[i] = enemy.mp
  278.       @enemy_exists[i] = enemy.exist?
  279.       @enemy_states[i] = enemy.states
  280.       @enemy_buff_icons[i] = enemy.buff_icons
  281.     end
  282.   end
  283.   #--------------------------------------------------------------------------
  284.   # ● ステータス情報を描画します。
  285.   #--------------------------------------------------------------------------
  286.   def draw_status
  287.     old_x = 0
  288.     can_shift = false
  289.     enemies = @enemy_sprites.clone.sort{|a, b| a.x <=> b.x}
  290.     enemies.size.times do |index|
  291.       enemy_sprite = enemies[index]
  292.       next_enemy = enemies[index + 1]
  293.       next_enemy_x = next_enemy == nil ? 1000 : next_enemy.x
  294.       enemy = enemy_sprite.battler
  295.       
  296.       if (! enemy.exist?) || enemy.dead?
  297.         old_x = enemy_sprite.x
  298.         can_shift = ! can_shift
  299.         next
  300.       end
  301.       next if define_note?(enemy.enemy, HIDE_HP_MARKER)

  302.       shift = false
  303.       if SHOW_HP_BAR || SHOW_MP_BAR
  304.         shift = draw_hp_mp_bar(enemy_sprite, old_x, next_enemy_x, can_shift)
  305.       end
  306.       if SHOW_STATE
  307.         draw_state(enemy_sprite, shift)
  308.       end
  309.       if SHOW_HP_TEXT
  310.         draw_hp_label(enemy_sprite)
  311.         draw_hp_value(enemy_sprite)
  312.       end
  313.       
  314.       old_x = enemy_sprite.x
  315.       can_shift = ! can_shift
  316.     end
  317.   end
  318.   def container_y(enemy_sprite)
  319.     if RELATIVE_POS
  320.       return [CONTAINER_Y + enemy_sprite.y, MAX_POS_Y].min
  321.     elsif ANCHOR_TOP

  322.       return [CONTAINER_Y + enemy_sprite.y - enemy_sprite.height, MIN_POS_Y].max
  323.     else
  324.       return CONTAINER_Y
  325.     end
  326.   end
  327.   #--------------------------------------------------------------------------
  328.   # ● 指定のエネミーのHPラベルを描画します。
  329.   #    Sprite enemy_sprite : HPラベルを描画するエネミースプライト
  330.   #--------------------------------------------------------------------------
  331.   def draw_hp_label(enemy_sprite)
  332.     x = enemy_sprite.x
  333.     y = container_y(enemy_sprite)
  334.     offset_x = Saba::SesUi::TEXT_OFFSET_X
  335.     offset_y = Saba::SesUi::TEXT_OFFSET_Y
  336.     x += offset_x
  337.     y += offset_y
  338.     width = Saba::SesUi::TEXT_WIDTH
  339.    
  340.     self.bitmap.font.size = Saba::SesUi::LABEL_FONT_SIZE
  341.     self.bitmap.font.color = label_color
  342.     label = Saba::SesUi::LABEL
  343.     self.bitmap.draw_text(x, y, width, WLH, label)
  344.   end
  345.   #--------------------------------------------------------------------------
  346.   # ● 指定のエネミーのHPの値を描画します。
  347.   #    Sprite enemy_sprite : HPの値を描画するエネミースプライト
  348.   #--------------------------------------------------------------------------
  349.   def draw_hp_value(enemy_sprite)
  350.     x = enemy_sprite.x
  351.     y = container_y(enemy_sprite)
  352.     offset_x = Saba::SesUi::VALUE_OFFSET_X
  353.     offset_y = Saba::SesUi::VALUE_OFFSET_Y
  354.     x += offset_x
  355.     y += offset_y
  356.     width = Saba::SesUi::VALUE_WIDTH
  357.    
  358.     self.bitmap.font.size = VALUE_FONT_SIZE
  359.     self.bitmap.font.color = value_color
  360.     enemy = enemy_sprite.battler
  361.     align = Saba::SesUi::VALUE_ALIGN
  362.     self.bitmap.draw_text(x, y, width, WLH, enemy.hp.to_s, align)
  363.   end
  364.   #--------------------------------------------------------------------------
  365.   # ● 指定のエネミーのHPとMPのバーを描画します。
  366.   #    Sprite enemy_sprite : HPのバーを描画するエネミースプライト
  367.   #--------------------------------------------------------------------------
  368.   def draw_hp_mp_bar(enemy_sprite, old_x, next_x, can_shift)
  369.     x = enemy_sprite.x
  370.     y = container_y(enemy_sprite)
  371.     width = BAR_WIDTH
  372.     offset_x = -width / 2
  373.     offset_y = BAR_OFFSET_Y
  374.       
  375.     if can_shift
  376.       if USE_BACKGROUND_IMAGE
  377.         margin = MARGIN_LEFT + MARGIN_RIGHT
  378.       else
  379.         margin = 4
  380.       end
  381.       if x + width + margin > next_x || old_x + width + margin > x
  382.         y += SHIFT_Y
  383.         shift = true
  384.       end
  385.     else
  386.       shift = false
  387.     end

  388.     x += offset_x
  389.     y += offset_y
  390.     height = BAR_HEIGHT
  391.     enemy = enemy_sprite.battler
  392.    
  393.     if SHOW_HP_BAR
  394.       draw_background(x, y, width, height)
  395.    
  396.       width = width * enemy.hp / enemy.mhp
  397.       width = BAR_MIN_WIDTH if width < BAR_MIN_WIDTH
  398.       self.bitmap.gradient_fill_rect(x, y, width, height, hp_gauge_color1, hp_gauge_color2)
  399.     end
  400.    
  401.     if SHOW_MP_BAR
  402.       if enemy.mmp == 0 && ! SHOW_MMP0_MP_BAR
  403.         return shift
  404.       end
  405.       y += MP_OFFSET_Y
  406.       width = BAR_WIDTH
  407.       draw_background(x, y, width, height)
  408.    
  409.       if enemy.mmp > 0
  410.         width = width * enemy.mp / enemy.mmp
  411.       else
  412.         width = 0
  413.       end
  414.       self.bitmap.gradient_fill_rect(x, y, width, height, mp_gauge_color1, mp_gauge_color2)
  415.     end
  416.     return shift
  417.   end
  418.   def draw_state(enemy_sprite, shift)
  419.     x = enemy_sprite.x
  420.     y = container_y(enemy_sprite)
  421.     offset_x = Saba::SesUi::STATE_OFFSET_X
  422.     offset_y = Saba::SesUi::STATE_OFFSET_Y
  423.     x += offset_x
  424.     y += offset_y
  425.     enemy_battler = enemy_sprite.battler
  426.     max_page = (enemy_battler.states.size + enemy_battler.buff_icons.size-1) / MAX_NUM_STATE + 1
  427.     max_page = [max_page, 1].max
  428.     page = @page_count % max_page
  429.     start = page * MAX_NUM_STATE
  430.     index = 0
  431.     count = 0
  432.     y += SHIFT_Y if shift
  433.     for state in enemy_battler.states
  434.       next if state.saba_invisible?
  435.       return if count == MAX_NUM_STATE
  436.       if index < start
  437.         index += 1
  438.         next
  439.       end
  440.       draw_icon(state.icon_index, x + 21 * count, y)
  441.       count += 1
  442.     end
  443.     for buff in enemy_battler.buff_icons
  444.       return if count == MAX_NUM_STATE
  445.       if index < start
  446.         index += 1
  447.         next
  448.       end
  449.       draw_icon(buff, x + 21 * count, y)
  450.       count += 1
  451.     end
  452.   end
  453.   #--------------------------------------------------------------------------
  454.   # ● アイコンの描画
  455.   #     icon_index : アイコン番号
  456.   #     x          : 描画先 X 座標
  457.   #     y          : 描画先 Y 座標
  458.   #     enabled    : 有効フラグ。false のとき半透明で描画
  459.   #--------------------------------------------------------------------------
  460.   def draw_icon(icon_index, x, y, enabled = true)
  461.     bitmap = Cache.system("Iconset")
  462.     rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
  463.     self.bitmap.blt(x, y, bitmap, rect, enabled ? 255 : 128)
  464.   end
  465.   def draw_background(x, y, width, height)
  466.    
  467.     if Saba::SesUi::USE_BACKGROUND_IMAGE
  468.       margin_l = Saba::SesUi::MARGIN_LEFT
  469.       margin_r = Saba::SesUi::MARGIN_RIGHT
  470.       x -= margin_l
  471.       y += Saba::SesUi::BG_OFFSET_Y
  472.       image = Cache.system(Saba::SesUi::BACKGROUND_IMAGE_FILE)
  473.       self.bitmap.blt(x, y, image, Rect.new(0, 0, margin_l, image.height))
  474.       self.bitmap.stretch_blt(Rect.new(x + margin_l, y, width, image.height), image, Rect.new(margin_l, 0, image.width - margin_l - margin_r, image.height))
  475.       self.bitmap.blt(x + width + margin_l, y, image, Rect.new(image.width - margin_r, 0, margin_r, image.height))
  476.     else
  477.       color = Saba::SesUi::BAR_BORDER_COLOR
  478.       self.bitmap.fill_rect(x - 1, y - 1, width + 2, height + 2, color)

  479.       color = Saba::SesUi::BAR_BG_COLOR
  480.       self.bitmap.fill_rect(x, y, width, height, color)
  481.     end
  482.   end
  483.   #--------------------------------------------------------------------------
  484.   # ● HP ゲージの色 1 を返します。
  485.   #--------------------------------------------------------------------------
  486.   def hp_gauge_color1
  487.     if USE_SYSTEM_COLOR
  488.       return text_color(20)
  489.     else
  490.       return BAR_FG_COLOR_1
  491.     end
  492.   end
  493.   #--------------------------------------------------------------------------
  494.   # ● HP ゲージの色 2 を返します。
  495.   #--------------------------------------------------------------------------
  496.   def hp_gauge_color2

  497.     if USE_SYSTEM_COLOR
  498.       return text_color(21)
  499.     else
  500.       return BAR_FG_COLOR_2
  501.     end
  502.   end
  503.   #--------------------------------------------------------------------------
  504.   # ● MP ゲージの色 1 を返します。
  505.   #--------------------------------------------------------------------------
  506.   def mp_gauge_color1
  507.     if USE_SYSTEM_COLOR
  508.       return text_color(22)
  509.     else
  510.       return BAR_FG_MP_COLOR_1
  511.     end
  512.   end
  513.   #--------------------------------------------------------------------------
  514.   # ● MP ゲージの色 2 を返します。
  515.   #--------------------------------------------------------------------------
  516.   def mp_gauge_color2

  517.     if USE_SYSTEM_COLOR
  518.       return text_color(23)
  519.     else
  520.       return BAR_FG_MP_COLOR_2
  521.     end
  522.   end
  523.   #--------------------------------------------------------------------------
  524.   # ● HPラベルの文字色を返します。
  525.   #--------------------------------------------------------------------------
  526.   def label_color
  527.     if Saba::SesUi::USE_SYSTEM_COLOR
  528.       return text_color(16)
  529.     else
  530.       return Saba::SesUi::LABEL_COLOR
  531.     end
  532.   end
  533.   #--------------------------------------------------------------------------
  534.   # ● HPの値の文字色を返します。
  535.   #--------------------------------------------------------------------------
  536.   def value_color
  537.     if Saba::SesUi::USE_SYSTEM_COLOR
  538.       return text_color(0)
  539.     else
  540.       return Saba::SesUi::VALUE_COLOR
  541.     end
  542.   end
  543.   #--------------------------------------------------------------------------
  544.   # ● 文字色を返します。
  545.   #     n : 文字色番号 (0~31)
  546.   #--------------------------------------------------------------------------
  547.   def text_color(n)
  548.     x = 64 + (n % 8) * 8
  549.     y = 96 + (n / 8) * 8
  550.     return @windowskin.get_pixel(x, y)
  551.   end
  552. end


  553. #==============================================================================
  554. # Sprite_EnemyStatusを使うように設定
  555. #==============================================================================
  556. class Spriteset_Battle
  557.   #--------------------------------------------------------------------------
  558.   # ● エネミーステータススプライトを作成します。
  559.   #  createEnemies と update の間に呼ばれる必要があるため、
  560.   #  タイマー作成時に一緒に作成しています。
  561.   #--------------------------------------------------------------------------
  562.   alias create_timer_SabaEnemyStatus create_timer
  563.   def create_timer
  564.     @saba_enemyStatusSprite = Sprite_EnemyStatus.new(@saba_enemyStatusViewport, @enemy_sprites)
  565.     create_timer_SabaEnemyStatus
  566.   end
  567.   #--------------------------------------------------------------------------
  568.   # ● エネミーステータススプライトを破棄します。
  569.   #  同じくタイマー破棄時に一緒に破棄しています。
  570.   #--------------------------------------------------------------------------
  571.   alias dispose_timer_SabaEnemyStatus dispose_timer
  572.   def dispose_timer
  573.     @saba_enemyStatusSprite.dispose
  574.     dispose_timer_SabaEnemyStatus
  575.   end
  576.   #--------------------------------------------------------------------------
  577.   # ● エネミーステータスビューポートを作成します。
  578.   #--------------------------------------------------------------------------
  579.   alias create_viewports_SabaEnemyStatus create_viewports
  580.   def create_viewports
  581.     @saba_enemyStatusViewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
  582.     @saba_enemyStatusViewport.z = Saba::SesUi::Z_DEPTH
  583.     create_viewports_SabaEnemyStatus
  584.   end
  585.   #--------------------------------------------------------------------------
  586.   # ● エネミーステータスビューポートを破棄します。
  587.   #--------------------------------------------------------------------------
  588.   alias dispose_viewports_SabaEnemyStatus dispose_viewports
  589.   def dispose_viewports
  590.     dispose_viewports_SabaEnemyStatus
  591.     @saba_enemyStatusViewport.dispose
  592.   end
  593.   #--------------------------------------------------------------------------
  594.   # ● エネミーステータスを更新します。
  595.   #--------------------------------------------------------------------------
  596.   alias update_viewports_SabaEnemyStatus update_viewports
  597.   def update_viewports
  598.     update_viewports_SabaEnemyStatus
  599.     @saba_enemyStatusSprite.update
  600.   end
  601.   #--------------------------------------------------------------------------
  602.   # ● ビューポートの更新
  603.   #--------------------------------------------------------------------------
  604.   alias saba_hp_update_viewports update_viewports
  605.   def update_viewports
  606.     saba_hp_update_viewports
  607.     @saba_enemyStatusSprite.ox = $game_troop.screen.shake
  608.   end
  609. end

  610. class RPG::State
  611.   def saba_invisible?
  612.     @saba_invisible ||= self.note.include?("<非表示>")
  613.   end
  614. end
复制代码





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