查看: 2573|回复: 9

[已经解决] 如何让敌人有多个血条?

[复制链接]
梦石
0
星屑
536
在线时间
69 小时
注册时间
2016-5-5
回帖
16
发表于 2017-9-24 21:20:00 | 显示全部楼层 |阅读模式

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

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

×
有没有办法做到回合制中打完敌人一条血后
下一层是第二条血且不同颜色的 感谢
梦石
0
星屑
2457
在线时间
912 小时
注册时间
2014-10-14
回帖
1155

开拓者

发表于 2017-9-25 13:43:46 | 显示全部楼层
本帖最后由 j296196585 于 2017-9-25 13:45 编辑

跟DNF一样的血条?找小黄鸡定制啊

我XP 用的是事件脚本 可惜 论坛目前不能上传图片 帮不了你 88
------落尽红樱君不见,轻绘梨花泪沾衣。~~~
回复

使用道具 举报

梦石
0
星屑
1829
在线时间
80 小时
注册时间
2017-9-28
回帖
89
发表于 2017-9-28 17:47:08 | 显示全部楼层
我找到一个战斗时显示敌人血条的脚本,不过好像不能实现楼主想要的多层颜色血条,希望楼主能够采纳。
脚本原地址:
  1. rpg.blue/home.php?mod=space&uid=310500&do=blog&id=10840
复制代码

更多脚本地址:
  1. rpg.blue/forum.php?mod=viewthread&tid=252003&page=1
复制代码


脚本我已经复制在下面了
  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
  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
复制代码


回复

使用道具 举报

梦石
0
星屑
536
在线时间
69 小时
注册时间
2016-5-5
回帖
16
 楼主| 发表于 2017-9-28 22:48:37 | 显示全部楼层
心六 发表于 2017-9-28 17:47
我找到一个战斗时显示敌人血条的脚本,不过好像不能实现楼主想要的多层颜色血条,希望楼主能够采纳。
脚本 ...

45出错啊@@
回复

使用道具 举报

梦石
0
星屑
1829
在线时间
80 小时
注册时间
2017-9-28
回帖
89
发表于 2017-9-28 23:23:21 | 显示全部楼层

那么尝试一下这个脚本,先把之前的脚本删除掉,以免起冲突,然后把这个脚本复制进去,
敌人显血[pre lang="RGSS3"]# @taroxd metadata 1.0
# @id enemy_hp
# @display 敌人显血
# @require taroxd_core
# @require roll_gauge
# @help
#    如不想显示,可在敌人处备注 <hide hp>
#    可在敌人处备注 <hp width w>、<hp height h>、<hp dxy dx dy> 调整血槽。
#    其中 w 表示宽度、h 表示高度,dx、dy 表示坐标的偏移。

Taroxd::EnemyHP = true

class RPG::Enemy < RPG::BaseItem

  note_any :hp_dxy, [0, 0], /\s+(-?\d+)\s+(-?\d+)/, '[$1.to_i, $2.to_i]'
  note_i :hp_width, 80
  note_i :hp_height, 6
  note_bool :hide_hp?

  # 初始化并获取战斗图的尺寸
  def init_width_height
    bitmap = Bitmap.new("Graphics/Battlers/#{@battler_name}")
    @width = bitmap.width
    @height = bitmap.height
    bitmap.dispose
  end

  def width
    return @width if @width
    init_width_height
    @width
  end

  def height
    return @height if @height
    init_width_height
    @height
  end
end

class Sprite_EnemyHP < Sprite

  include Taroxd::RollGauge
  include Taroxd::DisposeBitmap

  HP_COLOR1 = Color.new(223, 127, 63)
  HP_COLOR2 = Color.new(239, 191, 63)
  BACK_COLOR = Color.new(31, 31, 63)

  def initialize(viewport, enemy)
    @enemy = enemy
    super(viewport)
    data = enemy.enemy
    @width = data.hp_width
    @height = data.hp_height
    self.bitmap = Bitmap.new(@width, @height)
    dx, dy = enemy.enemy.hp_dxy
    self.ox = @width / 2
    self.oy = @height
    self.x = enemy.screen_x + dx
    self.y = enemy.screen_y + dy
    self.z = enemy.screen_z + 10
    refresh
  end

  def make_gauge_transitions
    Transition.new(gauge_roll_times) do
      @enemy.hp.fdiv(@enemy.mhp)
    end
  end

  def update_gauge_transitions
    gauge_transitions.update
  end

  def refresh
    bitmap.clear
    rate = gauge_transitions.value
    return if rate.zero?
    fill_w = (bitmap.width * rate).to_i
    bitmap.fill_rect(fill_w, 0, @width - fill_w, @height, BACK_COLOR)
    bitmap.gradient_fill_rect(0, 0, fill_w, @height, HP_COLOR1, HP_COLOR2)
  end
end

class Spriteset_Battle

  # 导入精灵组
  def_after :create_enemies do
    @enemy_hp_sprites = $game_troop.members.map { |enemy|
      Sprite_EnemyHP.new(@viewport1, enemy) unless enemy.enemy.hide_hp?
    }.compact
  end

  def_after(:update_enemies)  { @enemy_hp_sprites.each(&:update)  }
  def_after(:dispose_enemies) { @enemy_hp_sprites.each(&:dispose) }
end[/pre]


不过使用敌人显血脚本必须同时使用Taroxd基础设置和动态值槽脚本以支援敌人显血脚本实行成功,切记一定要把这两个放在敌人显血脚本一栏的上面。
Taroxd基础设置
  1. # @taroxd metadata 1.0
  2. # @display Taroxd 基础设置
  3. # @id taroxd_core
  4. # @help
  5. #
  6. # 模块或类
  7. #   方法名(参数) { block } / 别名 -> 返回值的类型或介绍
  8. #     方法的介绍。
  9. #     如果返回值没有给出,表明返回值无意义或没有确定的类型。
  10. #
  11. # Module
  12. #   get_access_control(method_name) -> Symbol or nil
  13. #     获取方法的访问控制。返回 :public, :protected, :private 或 nil(未定义)
  14. #     method_name 为字符串或符号(Symbol),下同。
  15. #
  16. #   def_after(method_name) { |args| block } -> method_name
  17. #   def_after(method_name, hook) -> method_name
  18. #     重定义方法 method_name。
  19. #     第一种形式中,将 block 定义为方法,在原方法之后调用。
  20. #     第二种形式中,
  21. #     * 如果 hook 为符号或字符串,那么会在原方法之后调用对应的方法。
  22. #     * 如果 hook 可以响应方法 call,那么会在原方法之后调用 call。
  23. #     * 如果 hook 是 UnboundMethod,那么会将 hook 绑定到对象后调用。
  24. #
  25. #     不改变原方法的返回值和访问控制。
  26. #     无论哪种调用,参数都和原来的参数相同。
  27. #     以下 def_* 的所有方法均有这两种形式。为了方便起见只写出第一种。
  28. #
  29. #     例:
  30. #     class Game_Actor < Game_Battler
  31. #       def_after :initialize do |actor_id|
  32. #         @my_attribute = actor_id
  33. #       end
  34. #     end
  35. #
  36. #   def_after!(method_name) { |args| block } -> method_name
  37. #     与 def_after 类似,但改变原方法的返回值。
  38. #
  39. #   def_before(method_name) { |args| block } -> method_name
  40. #     与 def_after 类似,但在原方法之前调用。
  41. #
  42. #   def_with(method_name) { |old, args| block } -> method_name
  43. #     与 def_after! 类似,但参数不同。old 参数是原方法的返回值。
  44. #
  45. #   def_chain(method_name) { |old, args| block } -> method_name
  46. #     与 def_with 类似,但 old 参数为对应原方法的一个 Method 对象。
  47. #
  48. #   def_and(method_name) { |args| block } -> method_name
  49. #     与 def_after 类似,但仅当原方法的返回值为真时调用。
  50. #     仅当原方法的返回值为真时,才会改变原方法的返回值。
  51. #
  52. #   def_or(method_name) { |args| block } -> method_name
  53. #     与 def_after 类似,但仅当原方法的返回值为伪时调用。
  54. #     仅当原方法的返回值为假时,才会改变原方法的返回值。
  55. #
  56. #   def_if(method_name) { |args| block } -> method_name
  57. #     与 def_before 类似,但仅当调用结果为真时调用原方法。
  58. #     仅当调用的结果为假时,改变原方法的返回值为 nil。
  59. #
  60. #   def_unless(method_name) { |args| block } -> method_name
  61. #     与 def_before 类似,但仅当调用结果为假时调用原方法。
  62. #     仅当调用的结果为真时,改变原方法的返回值为 nil。
  63. #
  64. # Taroxd::ReadNote
  65. #   该模块由以下类 extend。
  66. #   RPG::BaseItem
  67. #   RPG::Map
  68. #   RPG::Event(将事件名称作为备注)
  69. #   RPG::Tileset
  70. #   RPG::Class::Learning
  71. #
  72. #   note_i(method_name, default = 0)
  73. #     定义方法 method_name,读取备注中 <method_name x> 形式的内容。其中 x 为整数。
  74. #     读取到的话,定义的方法会返回读取到的整数值,否则返回 default。
  75. #
  76. #   例:RPG::UsableItem.note_i :item_cost
  77. #
  78. #   note_f(method_name, default = 0.0)
  79. #     与 note_i 类似,但读取的是实数。
  80. #
  81. #   note_s(method_name, default = '')
  82. #     与 note_i 类似,但读取的是字符串。
  83. #
  84. #   note_bool(method_name)
  85. #     定义 method_name 方法,判断备注中是否存在 <method_name> 子字符串。
  86. #     特别地,若 method_name 以问号或感叹号结尾,读取内容中不需要包含问号、感叹号。
  87. #     (上面几个方法也是一样)
  88. #
  89. # Taroxd::DisposeBitmap
  90. #   dispose
  91. #     释放位图后调用父类的 dispose 方法。
  92. #
  93. # Spriteset_Map / Spriteset_Battle
  94. #   self.use_sprite(SpriteClass)
  95. #   self.use_sprite(SpriteClass) { block }
  96. #     在 Spriteset 中使用一个 SpriteClass 的精灵。
  97. #     如果给出 block,则生成精灵使用的参数是 block 在 Spriteset 的上下文中执行后的返回值。
  98. #     自动管理精灵的生成、更新、释放。
  99. #
  100. #    例:Spriteset_Map.use_sprite(Sprite_OnMap) { @viewport1 }
  101. #
  102. # Fixnum
  103. #   id -> self
  104. #     返回 self。这使得之后一些方法的参数既可以用数据库的数据,也可以用整数。
  105. #
  106. # Enumerable
  107. #   sum(base = 0) { |element| block }
  108. #     对所有元素 yield 后求和。base 为初始值。
  109. #     没有 block 参数时,对所有元素求和。
  110. #
  111. #   例:
  112. #   class Game_Unit
  113. #     def tgr_sum
  114. #       alive_members.sum(&:tgr)
  115. #     end
  116. #   end
  117. #
  118. #   pi(base = 1) { |element| block }
  119. #     与 sum 类似,但对所有元素求积。
  120. #
  121. # Game_BaseItem
  122. #   id / item_id -> Fixnum
  123. #     返回物品 id。
  124. #
  125. # Game_BattlerBase
  126. #   mtp -> Numeric
  127. #     返回 max_tp。
  128. #
  129. #   initialized? -> true
  130. #     返回 true。
  131. #
  132. # Game_Battler
  133. #   note_objects -> Enumerator
  134. #   note_objects { |obj| ... } -> self
  135. #     迭代战斗者拥有的所有带有备注的对象。
  136. #    (角色、职业、装备、技能、敌人、状态等)
  137. #     没有 block 给出时,返回 Enumerator 对象。
  138. #
  139. #   note -> String
  140. #     返回数据库对象的备注。
  141. #
  142. #   equips / weapons / armors -> []
  143. #     返回空数组。
  144. #
  145. #   skill?(skill) -> true / false
  146. #     判断是否拥有技能。skill 可以为技能 ID,也可以为 RPG::Skill 的实例。
  147. #
  148. #   skill_learn?(skill) -> true / false
  149. #     判断是否习得技能。skill 可以为技能 ID,也可以为 RPG::Skill 的实例。
  150. #
  151. # Game_Actor
  152. #   data_object -> RPG::Actor
  153. #     返回数据库对象,等价于 actor。
  154. #
  155. #   weapon?(item) / armor?(item) -> true / false
  156. #     检测是否装备对应的物品。item 可以为装备 ID,也可以为 RPG::EquipItem 的实例。
  157. #
  158. #   initialized? -> true / false
  159. #     判断角色是否已经初始化。
  160. #
  161. # Game_Enemy
  162. #   id -> Fixnum
  163. #     返回敌人 id。
  164. #
  165. #   data_object -> RPG::Enemy
  166. #     返回数据库对象,等价于 enemy。
  167. #
  168. #   skills -> Array
  169. #     返回敌人的所有技能实例的数组。
  170. #     skill? 方法判断是否拥有技能与该数组有关。
  171. #
  172. #   basic_skills -> Array
  173. #     返回敌人行动列表中的技能 ID 的数组(元素可以重复)。
  174. #     skill_learn? 方法判断是否学会技能与该数组有关。
  175. #
  176. # Game_Actors
  177. #   include Enumerable
  178. #
  179. #   each -> Enumerator
  180. #   each { |actor| block } -> self
  181. #     迭代已经初始化的每个角色。
  182. #     如果没有给出 block,返回一个 Enumerator 对象。
  183. #
  184. #   include?(actor)
  185. #     角色是否已经初始化。actor 可以为 Game_Actor / RPG::Actor 的对象或 ID。
  186. #
  187. # Game_Unit
  188. #   include Enumerable
  189. #
  190. #   each -> Enumerator
  191. #   each { |battler| block } -> self
  192. #     迭代队伍中的每个成员。
  193. #     如果没有给出 block,返回一个 Enumerator 对象。
  194. #     等价于 members.each。
  195. #
  196. #   each_member -> Enumerator / self
  197. #     each 的别名。
  198. #
  199. #   self[*args] / slice(*args) -> Game_Actor / Array / nil
  200. #     等价于 members[*args]
  201. #
  202. #   empty? -> true / false
  203. #     判断队伍是否为空。
  204. #
  205. #   size / length -> Integer
  206. #     返回队伍人数。
  207. #
  208. # Game_Party
  209. #   include?(actor) -> true / false
  210. #     队伍中是否存在角色。actor 可以为 Game_Actor / RPG::Actor 的对象或 ID。
  211. #
  212. # Game_Map
  213. #   id -> Fixnum
  214. #     返回地图 ID。
  215. #
  216. #   data_object -> RPG::Map
  217. #     返回数据库对象。
  218. #
  219. #   note -> String
  220. #     返回备注内容。
  221. #
  222. # Game_CharacterBase
  223. #   same_pos?(character) -> true / false
  224. #     判定是否处在相同位置。
  225. #     character 是任意能够响应方法 x 和 y 的对象。
  226. #     仅作为点(x, y)进行比较,不考虑 Game_Vehicle 的地图 ID 等问题。

  227. module Taroxd end

  228. module Taroxd::Def

  229.   Singleton = Module.new { Object.send :include, self }
  230.   Module.send :include, self

  231.   def get_access_control(sym)
  232.     return :public    if public_method_defined?    sym
  233.     return :protected if protected_method_defined? sym
  234.     return :private   if private_method_defined?   sym
  235.     nil
  236.   end

  237.   template = lambda do |singleton|
  238.     if singleton
  239.       klass = 'singleton_class'
  240.       get_method = 'method'
  241.       define = 'define_singleton_method'
  242.     else
  243.       klass = 'self'
  244.       get_method = 'instance_method'
  245.       define = 'define_method'
  246.     end
  247.     %(
  248.       def <name>(sym, hook = nil, &b)
  249.         access = #{klass}.get_access_control sym
  250.         old = #{get_method} sym
  251.         if b
  252.           #{define} sym, &b
  253.           hook = #{get_method} sym
  254.         end
  255.         if hook.respond_to? :to_sym
  256.           hook = hook.to_sym
  257.           #{define} sym do |*args, &block|
  258.             <pattern_sym>
  259.           end
  260.         elsif hook.respond_to? :call
  261.           #{define} sym do |*args, &block|
  262.             <pattern_call>
  263.           end
  264.         elsif hook.kind_of? UnboundMethod
  265.           #{define} sym do |*args, &block|
  266.             <pattern_unbound>
  267.           end
  268.         end
  269.         #{klass}.__send__ access, sym
  270.         sym
  271.       end
  272.     )
  273.   end

  274.   # 保存模板和替换 'hook(' 字符串的字符
  275.   template = {false => template.call(false), true => template.call(true)}

  276.   # 替换掉 pattern 中的语法
  277.   gsub_pattern = lambda do |pattern, singleton|
  278.     old = singleton ? 'old' : 'old.bind(self)'
  279.     pattern.gsub('*', '*args, &block')
  280.            .gsub(/old(\()?/) { $1 ? "#{old}.call(" : old }
  281.   end

  282.   # 存入代替 "hook(" 的字符串
  283.   template['sym']     = '__send__(hook, '
  284.   template['call']    = 'hook.call('
  285.   template['unbound'] = 'hook.bind(self).call('

  286.   # 获取定义方法内容的字符串
  287.   # 得到的代码较长,请输出查看
  288.   code = lambda do |name, pattern, singleton|
  289.     pattern = gsub_pattern.call(pattern, singleton)
  290.     template[singleton]
  291.       .sub('<name>', name)
  292.       .gsub(/<pattern_(\w+?)>/) { pattern.gsub('hook(', template[$1]) }
  293.   end

  294.   main = TOPLEVEL_BINDING.eval('self')

  295.   # 定义 def_ 系列方法的方法
  296.   define_singleton_method :def_ do |name, pattern|
  297.     name = "#{__method__}#{name}"
  298.     module_eval code.call(name, pattern, false)
  299.     Singleton.module_eval code.call("singleton_#{name}", pattern, true)
  300.     main.define_singleton_method name, &Kernel.method(name)
  301.   end

  302.   # 实际定义 def_ 系列的方法
  303.   def_ :after,  'ret = old(*); hook(*); ret'
  304.   def_ :after!, 'old(*); hook(*)'
  305.   def_ :before, 'hook(*); old(*)'
  306.   def_ :with,   'hook(old(*), *)'
  307.   def_ :chain,  'hook(old, *)'
  308.   def_ :and,    'old(*) && hook(*)'
  309.   def_ :or,     'old(*) || hook(*)'
  310.   def_ :if,     'old(*) if hook(*)'
  311.   def_ :unless, 'old(*) unless hook(*)'
  312. end

  313. module Taroxd::ReadNote

  314.   include RPG
  315.   BaseItem.extend        self
  316.   Map.extend             self
  317.   Event.extend           self
  318.   Tileset.extend         self
  319.   Class::Learning.extend self

  320.   # 获取 note 的方法
  321.   def note_method
  322.     :note
  323.   end

  324.   # 事件名称作为备注
  325.   def Event.note_method
  326.     :name
  327.   end

  328.   # 备注模板
  329.   def note_any(name, default, re, capture)
  330.     name = name.to_s
  331.     mark = name.slice!(/[?!]\Z/)
  332.     re = re.source if re.kind_of?(Regexp)
  333.     re = "/<#{name.gsub('_', '\s*')}#{re}>/i"
  334.     default = default.inspect
  335.     class_eval %{
  336.       def #{name}
  337.         return @#{name} if instance_variable_defined? :@#{name}
  338.         @#{name} = #{note_method} =~ #{re} ? (#{capture}) : (#{default})
  339.       end
  340.     }, __FILE__, __LINE__
  341.     alias_method name + mark, name if mark
  342.   end

  343.   def note_i(name, default = 0)
  344.     note_any(name, default, '\s*(-?\d+)', '$1.to_i')
  345.   end

  346.   def note_f(name, default = 0.0)
  347.     note_any(name, default, '\s*(-?\d+(?:\.\d+)?)', '$1.to_f')
  348.   end

  349.   def note_s(name, default = '')
  350.     note_any(name, default, '\s*(\S.*)', '$1')
  351.   end

  352.   def note_bool(name)
  353.     note_any(name, false, '', 'true')
  354.   end
  355. end

  356. module Taroxd::DisposeBitmap
  357.   def dispose
  358.     bitmap.dispose if bitmap
  359.     super
  360.   end
  361. end

  362. module Taroxd::SpritesetDSL

  363.   # 方法名
  364.   CREATE_METHOD_NAME  = :create_taroxd_sprites
  365.   UPDATE_METHOD_NAME  = :update_taroxd_sprites
  366.   DISPOSE_METHOD_NAME = :dispose_taroxd_sprites

  367.   # 定义管理精灵的方法
  368.   def self.extended(klass)
  369.     klass.class_eval do
  370.       sprites = nil

  371.       define_method CREATE_METHOD_NAME do
  372.         sprites = klass.sprite_list.map do |sprite_class, get_args|
  373.           if get_args
  374.             sprite_class.new(*instance_eval(&get_args))
  375.           else
  376.             sprite_class.new
  377.           end
  378.         end
  379.       end

  380.       define_method(UPDATE_METHOD_NAME)  { sprites.each(&:update)  }
  381.       define_method(DISPOSE_METHOD_NAME) { sprites.each(&:dispose) }
  382.     end
  383.   end

  384.   def use_sprite(klass, &get_args)
  385.     sprite_list.push [klass, get_args]
  386.   end

  387.   def sprite_list
  388.     @_taroxd_use_sprite ||= []
  389.   end

  390.   # 在一系列方法上触发钩子
  391.   def sprite_method_hook(name)
  392.     def_after :"create_#{name}",  CREATE_METHOD_NAME
  393.     def_after :"update_#{name}",  UPDATE_METHOD_NAME
  394.     def_after :"dispose_#{name}", DISPOSE_METHOD_NAME
  395.   end
  396. end

  397. class Fixnum < Integer
  398.   alias_method :id, :to_int
  399. end

  400. module Enumerable
  401.   def sum(base = 0)
  402.     block_given? ? inject(base) { |a, e| a + yield(e) } : inject(base, :+)
  403.   end

  404.   def pi(base = 1)
  405.     block_given? ? inject(base) { |a, e| a * yield(e) } : inject(base, :*)
  406.   end
  407. end

  408. class Game_BaseItem
  409.   attr_reader :item_id
  410.   alias_method :id, :item_id
  411. end

  412. class Game_BattlerBase

  413.   def initialized?
  414.     true
  415.   end

  416.   def mtp
  417.     max_tp
  418.   end
  419. end

  420. class Game_Battler < Game_BattlerBase

  421.   # 迭代拥有备注的对象
  422.   def note_objects
  423.     return to_enum(__method__) unless block_given?
  424.     states.each { |e| yield e }
  425.     equips.each { |e| yield e if e }
  426.     skills.each { |e| yield e }
  427.     yield data_object
  428.     yield self.class if actor?
  429.   end

  430.   def regenerate_tp
  431.     self.tp += max_tp * trg
  432.   end

  433.   def data_object
  434.     raise NotImplementedError
  435.   end

  436.   def note
  437.     data_object.note
  438.   end

  439.   def id
  440.     data_object.id
  441.   end

  442.   def skills
  443.     (basic_skills | added_skills).sort.map { |id| $data_skills[id] }
  444.   end

  445.   def equips
  446.     []
  447.   end
  448.   alias_method :weapons, :equips
  449.   alias_method :armors,  :equips
  450.   alias_method :basic_skills, :equips

  451.   def skill?(skill)
  452.     basic_skills.include?(skill.id) || added_skills.include?(skill.id)
  453.   end

  454.   def skill_learn?(skill)
  455.     basic_skills.include?(skill.id)
  456.   end
  457. end

  458. class Game_Actor < Game_Battler

  459.   alias_method :data_object, :actor

  460.   def weapon?(weapon)
  461.     @equips.any? { |item| item.id == weapon.id && item.is_weapon? }
  462.   end

  463.   def armor?(armor)
  464.     @equips.any? { |item| item.id == armor.id && item.is_armor? }
  465.   end

  466.   def initialized?
  467.     $game_actors.include?(self)
  468.   end

  469.   private

  470.   def basic_skills
  471.     @skills
  472.   end
  473. end

  474. class Game_Enemy < Game_Battler

  475.   alias_method :data_object, :enemy
  476.   alias_method :id, :enemy_id

  477.   def basic_skills
  478.     enemy.actions.map(&:skill_id)
  479.   end
  480. end

  481. class Game_Actors

  482.   include Enumerable

  483.   def each
  484.     return to_enum(__method__) unless block_given?
  485.     @data.each { |actor| yield actor if actor }
  486.     self
  487.   end

  488.   def include?(actor)
  489.     @data[actor.id]
  490.   end
  491. end

  492. class Game_Unit

  493.   include Enumerable

  494.   def to_a
  495.     members
  496.   end

  497.   def each
  498.     return to_enum(__method__) unless block_given?
  499.     members.each { |battler| yield battler }
  500.     self
  501.   end
  502.   alias_method :each_member, :each

  503.   def [](*args)
  504.     members[*args]
  505.   end
  506.   alias_method :slice, :[]

  507.   def empty?
  508.     members.empty?
  509.   end

  510.   def size
  511.     members.size
  512.   end
  513.   alias_method :length, :size
  514. end

  515. class Game_Party < Game_Unit
  516.   def include?(actor)
  517.     @actors.include?(actor.id)
  518.   end
  519. end

  520. class Game_Map

  521.   alias_method :id, :map_id

  522.   def data_object
  523.     @map
  524.   end

  525.   def note
  526.     @map.note
  527.   end
  528. end

  529. class Game_CharacterBase
  530.   def same_pos?(character)
  531.     @x == character.x && @y == character.y
  532.   end
  533. end

  534. class Spriteset_Map
  535.   extend Taroxd::SpritesetDSL
  536.   sprite_method_hook :timer
  537. end

  538. class Spriteset_Battle
  539.   extend Taroxd::SpritesetDSL
  540.   sprite_method_hook :timer
  541. end
复制代码


动态值槽
  1. # @taroxd metadata 1.0
  2. # @display 动态值槽
  3. # @require taroxd_core
  4. # @id roll_gauge
  5. # @help 给值槽增加动态的滚动效果
  6. class Taroxd::Transition

  7.   # value: 当前值。changing: 当前是否正在变化
  8.   attr_reader :value, :changing

  9.   # get_target.call 获取到变化的数据。可以使用 block 代替 get_target。
  10.   def initialize(duration, get_target = nil, &block)
  11.     @duration = duration
  12.     @get_target = get_target || block
  13.     @value = @target = @get_target.call
  14.     @d = 0
  15.   end

  16.   # 更新值槽的值。如果值槽发生变化,返回 true。
  17.   def update
  18.     @target = @get_target.call
  19.     @changing = @value != @target
  20.     update_transition if @changing
  21.     @changing
  22.   end

  23.   private

  24.   def update_transition
  25.     @d = @duration if @d.zero?
  26.     @d -= 1
  27.     @value = if @d.zero?
  28.       @target
  29.     else
  30.       (@value * @d + @target).fdiv(@d + 1)
  31.     end
  32.   end
  33. end

  34. # include 之后,可用 @gauge_transitions[actor][:hp] 等
  35. # 获取 Taroxd::Transition 的实例。
  36. module Taroxd::RollGauge

  37.   Transition = Taroxd::Transition

  38.   def initialize(*)
  39.     @gauge_transitions = make_gauge_transitions
  40.     @gauge_roll_count = 0
  41.     super
  42.   end

  43.   def update
  44.     super
  45.     if (@gauge_roll_count += 1) >= gauge_roll_interval
  46.       roll_all_gauge if update_gauge_transitions && visible
  47.       @gauge_roll_count = 0
  48.     end
  49.   end

  50.   def draw_actor_hp(actor, x, y, width = 124)
  51.     hp = @gauge_transitions[actor][:hp].value
  52.     rate = hp.fdiv(actor.mhp)
  53.     draw_gauge(x, y, width, rate, hp_gauge_color1, hp_gauge_color2)
  54.     change_color(system_color)
  55.     draw_text(x, y, 30, line_height, Vocab::hp_a)
  56.     draw_current_and_max_values(x, y, width, hp.to_i, actor.mhp,
  57.       hp_color(actor), normal_color)
  58.   end

  59.   def draw_actor_mp(actor, x, y, width = 124)
  60.     mp = @gauge_transitions[actor][:mp].value
  61.     mmp = actor.mmp
  62.     rate = mmp.zero? ? 0 : mp.fdiv(actor.mmp)
  63.     draw_gauge(x, y, width, rate, mp_gauge_color1, mp_gauge_color2)
  64.     change_color(system_color)
  65.     draw_text(x, y, 30, line_height, Vocab::mp_a)
  66.     draw_current_and_max_values(x, y, width, mp.to_i, actor.mmp,
  67.       mp_color(actor), normal_color)
  68.   end

  69.   def draw_actor_tp(actor, x, y, width = 124)
  70.     tp = @gauge_transitions[actor][:tp].value
  71.     rate = tp.fdiv(actor.max_tp)
  72.     draw_gauge(x, y, width, rate, tp_gauge_color1, tp_gauge_color2)
  73.     change_color(system_color)
  74.     draw_text(x, y, 30, line_height, Vocab::tp_a)
  75.     change_color(tp_color(actor))
  76.     draw_text(x + width - 42, y, 42, line_height, tp.to_i, 2)
  77.   end

  78.   private

  79.   # 获取 make_gauge_transitions 生成的对象
  80.   attr_reader :gauge_transitions

  81.   # 值槽滚动所需的帧数
  82.   def gauge_roll_frame
  83.     30
  84.   end

  85.   # 每隔多少帧更新一次值槽
  86.   def gauge_roll_interval
  87.     1
  88.   end

  89.   # 生成值槽变化的数据。可在子类重定义。
  90.   # 默认的定义中,可以通过 gauge_transitions[actor][:hp] 等方式获取数据。
  91.   def make_gauge_transitions
  92.     Hash.new { |hash, actor|
  93.       hash[actor] = Hash.new do |h, k|
  94.         h[k] = Transition.new(gauge_roll_times, actor.method(k))
  95.       end
  96.     }.compare_by_identity
  97.   end

  98.   # 更新渐变的值。
  99.   # 返回真值则触发一次刷新。
  100.   # 每 gauge_roll_interval 帧调用一次。
  101.   def update_gauge_transitions
  102.     need_roll = false
  103.     gauge_transitions.each_value do |hash|
  104.       hash.each_value do |t|
  105.         need_roll = true if t.update
  106.       end
  107.     end
  108.     need_roll
  109.   end

  110.   # 值槽滚动所需的次数。
  111.   def gauge_roll_times
  112.     gauge_roll_frame / gauge_roll_interval
  113.   end

  114.   # 滚动所有值槽。可在子类重定义。
  115.   def roll_all_gauge
  116.     refresh
  117.   end
  118. end

  119. class Window_BattleStatus
  120.   include Taroxd::RollGauge
  121. end

  122. class Window_MenuStatus < Window_Selectable

  123.   include Taroxd::RollGauge

  124.   def roll_all_gauge
  125.     item_max.times do |i|
  126.       actor = $game_party.members[i]
  127.       rect = item_rect(i)
  128.       rect.x += 108
  129.       rect.y += line_height / 2
  130.       contents.clear_rect(rect)
  131.       draw_actor_simple_status(actor, rect.x, rect.y)
  132.     end
  133.   end
  134. end
复制代码


倘若仍有什么问题欢迎追问

点评

不客气:D  发表于 2017-9-28 23:50
对了,这个脚本和第一个脚本一样不能实现楼主想要的多层颜色血条,忘了告诉你,真的非常抱歉。  发表于 2017-9-28 23:49
也罢,目前先搞定敌人血条就够了,感谢  发表于 2017-9-28 23:48
是不錯,但是第二血條去哪了?  发表于 2017-9-28 23:45
如果使用时有什么特别的要求,可以看看敌人显血的第7行到9行有些使用教程。  发表于 2017-9-28 23:27
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部