Project1

标题: 关于沉影大大发的显示敌人血条的问题 [打印本页]

作者: 005020671    时间: 2010-11-26 14:01
标题: 关于沉影大大发的显示敌人血条的问题
本帖最后由 005020671 于 2010-11-28 18:19 编辑

下面是脚本,请问这个怎么用到Sideview横版系统里呢,沉影大大说"Sprite_Battler这部分,把我的内容搬到sideview脚本Sprite_Battler同名方法里...",哪位老大能说的具体一点呢???谢谢拉...
这是原帖地址http://rpg.blue/forum.php?mod=viewthread&tid=134556&highlight=%E8%A1%80%E6%9D%A1
  1. #==============================================================================
  2. # ■ 显示敌人血条 by 沉影不器
  3. #------------------------------------------------------------------------------
  4. # 功能描述:
  5. #     ① 战斗时让敌人显示血条,宽度可定制
  6. #     ② 可选功能: 显示具体生命值 显示敌人名称
  7. # 使用说明:
  8. #     ① 脚本插入到Main之前
  9. #     ② 脚本第19行设定血条的默认宽度
  10. #        为个别敌人指定血条宽度是"数据库-敌角色-备注栏"填写"hp_width=数值"
  11. #     ③ 脚本第20行选择是否显示具体生命值
  12. #     ④ 脚本第21行选择是否显示敌人名称
  13. #     ⑤ 其它参数设定详见脚本
  14. #     ⑥ 此脚本需要基础脚本[读取rmvx备注栏指定字段]
  15. #==============================================================================
  16. # ■ 参数设定
  17. #==============================================================================
  18. module Enemy_HP
  19.   HP_WIDTH    = 64                    # 血条的默认宽度
  20.   SHOW_VALUE = false                  # 是否显示敌人生命值
  21.   SHOW_NAME = true                    # 是否显示敌人名称
  22.   NAME_SIZE = 16                      # 敌人名称字体大小
  23.   NAME_COLOR = 0                      # 敌人名称字体颜色
  24. end
  25. #==============================================================================
  26. # ■ RPG
  27. #==============================================================================
  28. module RPG
  29.   class Enemy
  30.     def hp_width
  31.       return self.read_note('hp_width')
  32.     end
  33.   end
  34. end
  35. #==============================================================================
  36. # ■ Game_Enemy
  37. #==============================================================================
  38. class Game_Enemy < Game_Battler
  39.   #--------------------------------------------------------------------------
  40.   # ○ 血条宽度
  41.   #--------------------------------------------------------------------------
  42.   def hp_width
  43.     return $data_enemies[@enemy_id].hp_width
  44.   end
  45. end
  46. #==============================================================================
  47. # ■ Sprite_Battler
  48. #==============================================================================
  49. class Sprite_Battler < Sprite_Base
  50.   #--------------------------------------------------------------------------
  51.   # ◎ 初始化对象
  52.   #     viewport : 视区
  53.   #     battler  : 战斗者 (Game_Battler)
  54.   #--------------------------------------------------------------------------
  55.   def initialize(viewport, battler = nil)
  56.     super(viewport)
  57.     @battler = battler
  58.     @battler_visible = false
  59.     @effect_type = 0            # 效果种类
  60.     @effect_duration = 0        # 效果剩余时间
  61.     if @battler.is_a?(Game_Enemy)
  62.       width = hp_width + 32
  63.       height = 24 + 32
  64.       x = @battler.screen_x - width/2
  65.       y = @battler.screen_y - height/2
  66.       # 调节名称位置
  67.       if Enemy_HP::SHOW_NAME
  68.         height += Enemy_HP::NAME_SIZE + 2
  69.         y -= Enemy_HP::NAME_SIZE + 2
  70.       end
  71.       # 生成血条窗体
  72.       @enemy_hp_window = Window_Base.new(x, y, width, height)
  73.       @enemy_hp_window.opacity = 0
  74.       @enemy_hp_window.contents_opacity = 0
  75.       @enemy_hp_window.contents = Bitmap.new(width - 32, height - 32)
  76.       @enemy_hp_window.draw_enemy_info(@battler, 0, 0, width - 32)
  77.       # 保存旧血量(控制刷新)
  78.       @old_hp = -1
  79.     end
  80.   end
  81.   #--------------------------------------------------------------------------
  82.   # ◎ 释放
  83.   #--------------------------------------------------------------------------
  84.   def dispose
  85.     if self.bitmap != nil
  86.       self.bitmap.dispose
  87.       @enemy_hp_window.dispose
  88.     end
  89.     super
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ◎ 释放敌人活动块
  93.   #--------------------------------------------------------------------------
  94.   def dispose_enemies
  95.     for sprite in @enemy_sprites
  96.       sprite.dispose
  97.       @enemy_hp_window.dispose
  98.     end
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ◎ 更新画面
  102.   #--------------------------------------------------------------------------
  103.   def update
  104.     super
  105.     if @battler == nil
  106.       self.bitmap = nil
  107.     else
  108.       @use_sprite = @battler.use_sprite?
  109.       if @use_sprite
  110.         self.x = @battler.screen_x
  111.         self.y = @battler.screen_y
  112.         self.z = @battler.screen_z
  113.         update_battler_bitmap
  114.       end
  115.       setup_new_effect
  116.       update_effect
  117.       # 更新血条窗体
  118.       if @enemy_hp_window != nil and @old_hp != @battler.hp
  119.         @enemy_hp_window.contents.clear
  120.         @enemy_hp_window.draw_enemy_info(@battler, 0, 0, hp_width)
  121.         @old_hp = @battler.hp
  122.       end
  123.     end
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ◎ 更新出现效果
  127.   #--------------------------------------------------------------------------
  128.   def update_appear
  129.     self.blend_type = 0
  130.     self.color.set(0, 0, 0, 0)
  131.     self.opacity = (16 - @effect_duration) * 16
  132.     # 对象非敌人时返回
  133.     return unless @battler.is_a?(Game_Enemy)
  134.     @enemy_hp_window.contents_opacity = self.opacity
  135.   end
  136.   #--------------------------------------------------------------------------
  137.   # ◎ 更新消失效果
  138.   #--------------------------------------------------------------------------
  139.   def update_disappear
  140.     self.blend_type = 0
  141.     self.color.set(0, 0, 0, 0)
  142.     self.opacity = 256 - (32 - @effect_duration) * 10
  143.     # 对象非敌人时返回
  144.     return unless @battler.is_a?(Game_Enemy)
  145.     @enemy_hp_window.contents_opacity = self.opacity
  146.   end
  147.   #--------------------------------------------------------------------------
  148.   # ◎ 更新崩溃效果
  149.   #--------------------------------------------------------------------------
  150.   def update_collapse
  151.     self.blend_type = 1
  152.     self.color.set(255, 128, 128, 128)
  153.     self.opacity = 256 - (48 - @effect_duration) * 6
  154.     # 对象非敌人时返回
  155.     return unless @battler.is_a?(Game_Enemy)
  156.     @enemy_hp_window.contents_opacity = self.opacity
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # ○ 血条宽度
  160.   #--------------------------------------------------------------------------
  161.   def hp_width
  162.     result = Enemy_HP::HP_WIDTH
  163.     if @battler.is_a?(Game_Enemy)
  164.       if @battler.hp_width.to_i == 0
  165.         result = Enemy_HP::HP_WIDTH
  166.       else
  167.         result = @battler.hp_width.to_i
  168.       end
  169.     end
  170.     return result
  171.   end
  172. end
  173. #==============================================================================
  174. # ■ Window_Base
  175. #==============================================================================
  176. class Window_Base < Window
  177.   #--------------------------------------------------------------------------
  178.   # ○ 描绘敌人信息
  179.   #     enemy : 角色
  180.   #     x     : 描绘目标 X 坐标
  181.   #     y     : 描绘目标 Y 坐标
  182.   #     width : 宽
  183.   #--------------------------------------------------------------------------
  184.   def draw_enemy_info(enemy, x, y, width = 64)
  185.     # 为字体阴影内缩1像素
  186.     width -= 1
  187.     # 显示名称
  188.     if Enemy_HP::SHOW_NAME
  189.       self.contents.font.color = text_color(Enemy_HP::NAME_COLOR)
  190.       self.contents.font.size = Enemy_HP::NAME_SIZE
  191.       self.contents.draw_text(x, y, width, WLH, enemy.name, 1)
  192.       self.contents.font.size = Font.default_size
  193.       y += Enemy_HP::NAME_SIZE + 2
  194.     end
  195.     # 描绘血槽
  196.     draw_actor_hp_gauge(enemy, x, y, width)
  197.     # 描绘生命符号
  198.     self.contents.font.color = system_color
  199.     self.contents.draw_text(x, y, 30, WLH, Vocab::hp_a)
  200.     # 描绘具体生命值
  201.     return unless Enemy_HP::SHOW_VALUE
  202.     self.contents.font.color = hp_color(enemy)
  203.     xr = x + width
  204.     self.contents.draw_text(xr - 40, y, 40, WLH, enemy.hp, 2)
  205.   end
  206. end
复制代码

作者: 005020671    时间: 2010-11-26 18:29
一箭烂YiJL 兄,你给的那个是没有冲突,可是我想要的效果是战斗时敌人脚下直接能显示血条,而不是只有当指向它时才显示,不过还是谢谢你啦。。。
还有不知道有什么办法能让Sideview横版系统战斗时下方不显示我方血条蓝条,而在我方脚下现实呢,xp就有相关脚本。。。
作者: 一箭烂YiJL    时间: 2010-11-26 22:32
回复 005020671 的帖子

我猜应该是指把上面的编码放进“Sprite_Battler”的代码页中,详见:
横版有三个编码页,把上面的脚本按照每一个函数(def XXX项)
插入叫“Sprite_Battler”的横版的编码页的对照函数里。(重复多余的删掉)
就像这个脚本里的def initialize插进横版“Sprite_Battler”的def initialize,对照下去
(这只是估计而已,最好请到沉大来解答)
作者: Rion幻音    时间: 2010-11-27 10:31
那就试试这脚本……
  1. #==============================================================================
  2. # ★RGSS2
  3. # STR15_Enemy HP Gauge v1.1a
  4. # By star:http://strcatyou.u-abel.net/
  5. # Translated by Mr. Bubble
  6. #
  7. # ・Show HP gauge of enemies when hit.
  8. # ・You can hide a specified enemy's HP gauge by adding "HIDEHP" to
  9. # the enemy's Notes field in the Database.
  10. # ・Updated with a back attack fix by Moonlight.  Use this version ONLY with the
  11. #  ATB+SBS scripts.
  12. #------------------------------------------------------------------------------

  13. #==============================================================================
  14. # ★このスクリプトの機能を有効にする
  15. if true
  16. #==============================================================================
  17. # ■ Sprite_Battler
  18. #==============================================================================
  19. class Sprite_Battler < Sprite_Base
  20.   # Word used in enemy Notes field to hide HP gauge
  21.   GAUGE_M = "HIDEHP"
  22.   # Gauge back color [Border color, Inside color]
  23.   GAUGE_BC = [Color.new(0,0,0), Color.new(32,48,64)]
  24.   # Color gradient [Left, Right]
  25.   GAUGE_GC = [Color.new(64,128,96), Color.new(96,192,160)]
  26.   #
  27.   GAUGE_W = 96 # Gauge width
  28.   GAUGE_H = 6 # Gauge height
  29.   GAUGE_S = 8 # Gauge speed (more than 2)
  30.   GAUGE_T = 640 # Gauge display length (more 510)
  31.   GAUGE_O = 16 # Gauge opacity
  32.   #
  33.   GAUGE_V = false # STR cursor appears when damaged. Requires STRxx Cursor.                  # ※XP風バトルを導入してない場合は有効にしないでください
  34.   #--------------------------------------------------------------------------
  35.   # ● ゲージスプライト作成(追加)
  36.   #--------------------------------------------------------------------------
  37.   def create_enhpgauge
  38.     g_width = GAUGE_W  # 幅
  39.     g_height = GAUGE_H # 高さ
  40.     f_color = GAUGE_BC # ゲージバックカラー
  41.     g_color = GAUGE_GC # ゲージカラー
  42.     # ビットマップ作成
  43.     bitmap = Bitmap.new(g_width, g_height * 2)
  44.     # 上半分:ゲージバック
  45.     bitmap.fill_rect(0, 0, g_width, g_height, f_color[0])         # 枠外
  46.     bitmap.fill_rect(1, 1, g_width - 2, g_height - 2, f_color[1]) # 枠内
  47.     # 下半分:グラデゲージ
  48.     bitmap.gradient_fill_rect(1, g_height + 1, g_width - 2, g_height - 2,
  49.                               g_color[0], g_color[1])             # グラデ
  50.     # スプライト作成 # [0] = ゲージバック; [1] = ゲージ
  51.     @hp_gauge = [Sprite.new, Sprite.new]
  52.     for i in 0..1
  53.       sprite = @hp_gauge[i]
  54.       sprite.viewport = self.viewport
  55.       sprite.bitmap = bitmap
  56.       sprite.src_rect.set(0, 0, g_width, g_height)
  57.       sprite.src_rect.y = g_height if i == 1
  58.       if $back_attack && N01::BACK_ATTACK && N01::BACK_ATTACK_NON_BACK_MIRROR
  59.         sprite.x = Graphics.width - @battler.screen_x
  60.       else
  61.         sprite.x = @battler.screen_x
  62.       end
  63.       sprite.y = @battler.screen_y - 8
  64.       sprite.ox = g_width / 2
  65.       sprite.oy = g_height / 2
  66.       sprite.z = 200
  67.       sprite.z += 20 if i == 1
  68.       sprite.opacity = 0
  69.     end
  70.     # いろいろ
  71.     @enid = @battler.enemy_id
  72.     @hp = @battler.hp
  73.     @gauge_width = GAUGE_W + 1
  74.     @gauge_opacity = 0
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ● ゲージ更新(追加)
  78.   #--------------------------------------------------------------------------
  79.   def enhpgauge_update
  80.     # エネミーIDが変動していたらメモの内容を再取得・可視状態も更新
  81.     if @enid != @battler.enemy_id
  82.       @enid = @battler.enemy_id
  83.       @gauge_visible = true
  84.       @gauge_visible = false if $data_enemies[@enid].note.include?(GAUGE_M)
  85.       for i in @hp_gauge do i.visible = @gauge_visible end
  86.       end
  87.     return unless @gauge_visible
  88.     # ゲージ更新
  89.     if @hp != @battler.hp
  90.       g_width = (@battler.hp / (@battler.maxhp * 1.0))
  91.       @gauge_width = ((GAUGE_W * g_width) + 1).truncate
  92.       @gauge_opacity = GAUGE_T
  93.       @hp = @battler.hp
  94.     end
  95.     # 幅
  96.     g_width = @hp_gauge[1].src_rect.width
  97.     speed = GAUGE_S
  98.     rect = @hp_gauge[1].src_rect
  99.     rect.width = (@gauge_width + (g_width * (speed - 1))) / speed
  100.     if rect.width != @gauge_width
  101.       if rect.width > @gauge_width
  102.         rect.width -= 1
  103.       else
  104.         rect.width += 1
  105.       end
  106.     end
  107.     rect.width = 2 if rect.width <= 1 and @hp > 0
  108.     # 透明度
  109.     if GAUGE_V and @battler.cursor_flash
  110.       @gauge_opacity += GAUGE_O * 2 if @gauge_opacity <= GAUGE_T / 2
  111.     else
  112.       @gauge_opacity -= GAUGE_O if @gauge_opacity > 0
  113.     end
  114.     # 透明度適用
  115.     for i in @hp_gauge do i.opacity = @gauge_opacity end
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● オブジェクト初期化(エイリアス)
  119.   #--------------------------------------------------------------------------
  120.   alias initialize_str15 initialize
  121.   def initialize(viewport, battler = nil)
  122.     initialize_str15(viewport, battler)
  123.     if @battler.is_a?(Game_Enemy)
  124.       create_enhpgauge
  125.       @gauge_visible = true
  126.       @gauge_visible = false if $data_enemies[@enid].note.include?(GAUGE_M)
  127.       for i in @hp_gauge do i.visible = @gauge_visible end
  128.     end
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 解放(エイリアス)
  132.   #--------------------------------------------------------------------------
  133.   alias dispose_str15 dispose
  134.   def dispose
  135.     dispose_str15
  136.     if @battler.is_a?(Game_Enemy)
  137.       @hp_gauge[0].bitmap.dispose
  138.       @hp_gauge[0].dispose
  139.       @hp_gauge[1].dispose
  140.     end
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● フレーム更新(エイリアス)
  144.   #--------------------------------------------------------------------------
  145.   alias update_str15 update
  146.   def update
  147.     update_str15
  148.     enhpgauge_update if @battler.is_a?(Game_Enemy)
  149.   end
  150. end
  151. #
  152. end
复制代码

作者: 一箭烂YiJL    时间: 2010-11-27 10:51
回复 Rion幻音 的帖子

试过后什么都没有。。。。。。楼主要的是和横版不会冲突的。
若是最普通的战斗系统,还要等到斩下去的一刻才有一条青绿色的带子。。。。。。
是我的问题吗?。。。。。。。
作者: 一箭烂YiJL    时间: 2010-11-27 11:41
首先,多谢幻音前辈的脚本
我把它翻译了,还调教了一些有关颜色(让它更好看)了
  1. #==============================================================================
  2. # ★要启用这个脚本
  3. if true
  4. #==============================================================================
  5. # ■ Sprite_Battler
  6. #==============================================================================

  7. class Sprite_Battler < Sprite_Base
  8.   # Word used in enemy Notes field to hide HP gauge
  9.   GAUGE_M = "HIDEHP"
  10.   # 背景色 [边框颜色, 内部颜色]
  11.   GAUGE_BC = [Color.new(0,0,0), Color.new(155,205,155)]
  12.   # 面层色(渐变效果) [左端, 右端]
  13.   GAUGE_GC = [Color.new(255,10,0), Color.new(255,154,0)]
  14.   #
  15.   GAUGE_W = 96 # 宽度
  16.   GAUGE_H = 6 # 高度
  17.   GAUGE_S = 8 # 扣减速度(超过2)
  18.   GAUGE_T = 650 # 显示帧数 (多于 510)(最多999999999)
  19.   GAUGE_O = 16 # 不透明度
  20.   #
  21.   GAUGE_V = false # 当光标出现可疑损坏。需要STRxx光标。
  22.   #--------------------------------------------------------------------------
  23.   # ● 绘画血条
  24.   #--------------------------------------------------------------------------
  25.   def create_enhpgauge
  26.     g_width = GAUGE_W  # 长
  27.     g_height = GAUGE_H # 高
  28.     f_color = GAUGE_BC # 背景色
  29.     g_color = GAUGE_GC # 面层色
  30.     # 图画绘制
  31.     bitmap = Bitmap.new(g_width, g_height * 2)
  32.     # 上半部分:图画定义,背景色
  33.     bitmap.fill_rect(0, 0, g_width, g_height, f_color[0])         # 外框
  34.     bitmap.fill_rect(1, 1, g_width - 2, g_height - 2, f_color[1]) # 内部
  35.     # 上半部分:图画定义,面层色
  36.     bitmap.gradient_fill_rect(1, g_height + 1, g_width - 2, g_height - 2,
  37.                               g_color[0], g_color[1])             # 层次
  38.     # 血条建立 # [0] = 背景色 ; [1] = 面层色
  39.     @hp_gauge = [Sprite.new, Sprite.new]
  40.     for i in 0..1
  41.       sprite = @hp_gauge[i]
  42.       sprite.viewport = self.viewport
  43.       sprite.bitmap = bitmap
  44.       sprite.src_rect.set(0, 0, g_width, g_height)
  45.       sprite.src_rect.y = g_height if i == 1
  46.       if $back_attack && N01::BACK_ATTACK && N01::BACK_ATTACK_NON_BACK_MIRROR
  47.         sprite.x = Graphics.width - @battler.screen_x
  48.       else
  49.         sprite.x = @battler.screen_x
  50.       end
  51.       sprite.y = @battler.screen_y - 8
  52.       sprite.ox = g_width / 2
  53.       sprite.oy = g_height / 2
  54.       sprite.z = 200
  55.       sprite.z += 20 if i == 1
  56.       sprite.opacity = 0
  57.     end
  58.     # 各种
  59.     @enid = @battler.enemy_id
  60.     @hp = @battler.hp
  61.     @gauge_width = GAUGE_W + 1
  62.     @gauge_opacity = 0
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ● 血条更新
  66.   #--------------------------------------------------------------------------
  67.   def enhpgauge_update
  68.     # 如果对应ID敌人被伤害的时候需要显示
  69.     if @enid != @battler.enemy_id
  70.       @enid = @battler.enemy_id
  71.       @gauge_visible = true
  72.       @gauge_visible = false if $data_enemies[@enid].note.include?(GAUGE_M)
  73.       for i in @hp_gauge do i.visible = @gauge_visible end
  74.       end
  75.     return unless @gauge_visible
  76.     # 计算更新
  77.     if @hp != @battler.hp
  78.       g_width = (@battler.hp / (@battler.maxhp * 1.0))
  79.       @gauge_width = ((GAUGE_W * g_width) + 1).truncate
  80.       @gauge_opacity = GAUGE_T
  81.       @hp = @battler.hp
  82.     end
  83.     # 长
  84.     g_width = @hp_gauge[1].src_rect.width
  85.     speed = GAUGE_S
  86.     rect = @hp_gauge[1].src_rect
  87.     rect.width = (@gauge_width + (g_width * (speed - 1))) / speed
  88.     if rect.width != @gauge_width
  89.       if rect.width > @gauge_width
  90.         rect.width -= 1
  91.       else
  92.         rect.width += 1
  93.       end
  94.     end
  95.     rect.width = 2 if rect.width <= 1 and @hp > 0
  96.     # 透明度
  97.     if GAUGE_V and @battler.cursor_flash
  98.       @gauge_opacity += GAUGE_O * 2 if @gauge_opacity <= GAUGE_T / 2
  99.     else
  100.       @gauge_opacity -= GAUGE_O if @gauge_opacity > 0
  101.     end
  102.     # 透明度適用
  103.     for i in @hp_gauge do i.opacity = @gauge_opacity end
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ● 对象初始化
  107.   #--------------------------------------------------------------------------
  108.   alias initialize_str15 initialize
  109.   def initialize(viewport, battler = nil)
  110.     initialize_str15(viewport, battler)
  111.     if @battler.is_a?(Game_Enemy)
  112.       create_enhpgauge
  113.       @gauge_visible = true
  114.       @gauge_visible = false if $data_enemies[@enid].note.include?(GAUGE_M)
  115.       for i in @hp_gauge do i.visible = @gauge_visible end
  116.     end
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # ● 解放(dispose)
  120.   #--------------------------------------------------------------------------
  121.   alias dispose_str15 dispose
  122.   def dispose
  123.     dispose_str15
  124.     if @battler.is_a?(Game_Enemy)
  125.       @hp_gauge[0].bitmap.dispose
  126.       @hp_gauge[0].dispose
  127.       @hp_gauge[1].dispose
  128.     end
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 帧更新
  132.   #--------------------------------------------------------------------------
  133.   alias update_str15 update
  134.   def update
  135.     update_str15
  136.     enhpgauge_update if @battler.is_a?(Game_Enemy)
  137.   end
  138. end
  139. #
  140. end
复制代码

作者: 005020671    时间: 2010-11-28 18:18
回复 Rion幻音 的帖子

谢谢啦。。。
作者: storm74    时间: 2011-8-22 19:11
首先,多谢幻音前辈的脚本
我把它翻译了,还调教了一些有关颜色(让它更好看)了

小白 用了前辈的翻译的 脚本 想知道怎么才能不用挨打就从战斗一开始就显示敌人的血条呢?




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