查看: 2697|回复: 0

[原创发布] 【地图血条】地图中HP发生变化时显示血条和数字

[复制链接]
梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

发表于 2022-6-16 01:24:39 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 纯属小虫 于 2022-6-24 11:18 编辑

2022/06/16
因为做了许多跑酷躲暗器的地图
所以觉得受伤后还要打开菜单来检查队友们的血量很影响游戏流畅性
于是一鼓作气做了这个脚本
显血-1.gif 显血-2.gif 显血-3.gif 显血-4.gif

地图中,只要队伍角色的总血量发生了改变,血条就会出现并出现伤害或者恢复的数字
如:增减hp 完全回复 毒 这一类会最终改变HP的

血条和伤害描绘的是整个队伍的总血量的变化
所以:如果 角色A +50hp 的同时 角色B -50 hp 就不会描绘(应该不会有人在地图里做这种事吧)

代码前部分有各个参数的设置,可以自己DIY一些血条及数字的外观!
脚本小白,可能会有一些小BUG,欢迎试错!



2022/06/24
发现了内存泄露的问题....忘记bitmap.dispose了


附件下载:————仅供参考,文件内代码不是最新的,可能有些未修复BUG
HP变化地图显示.zip (206.32 KB, 下载次数: 43)

最新代码请复制这里:复制完请塞个糖~蟹蟹
[fold=代码][pre lang="ruby"]
=begin
#===========================================================================
      作者:纯属小虫
          该脚本只作用于地图上
          地图画面会实时监控队伍HP的变化
          只要发生了队伍HP总量的变化,就会触发这个效果
          (于是,像 A队员+50hp的同时,B队员-50hp 这种情况是不会显示的[doge])
          如【增减HP】【完全回复】【中毒】
          通常来说,换图或者打开菜单会让显示数字和血条消失
#===========================================================================
=end

module Xiao虫
  # 控制打开与否的总开关id   关闭为显示 打开为屏蔽 【←←请注意读这个开关的定义】
  Healthbar_total_Switchid = 1
  # 控制打开与否的伤害数字开关id    关闭为显示 打开为屏蔽  【←←请注意读这个开关的定义】
  Healthbar_number_Switchid = 2
  # 维持的时间-帧;(一定要是【→→】那个分母的整数倍)PS:血条变动的时间是这个的1/2
  Healthbar_time_1 = 40
  # 渐隐的时间-帧
  Healthbar_time_2 = 20
  # 长度(宽度)
  Healthbar_width = 200
  # 高度
  Healthbar_height = 10
  # 生命条颜色
  Healthbar_color = Color.new(20,255,100)
  # 生命条背景颜色
  Healthbar_backcolor = Color.new(100,10,10)
  # 生命条边框——外框颜色
  Healthbar_framecolor_1 = Color.new(0,0,0)
  # 生命条边框——内框颜色
  Healthbar_framecolor_2 = Color.new(150,150,150)
  # 增减生命值的字号
  Healthbar_text_size = 15
  # 增加生命的字体颜色
  Healthbar_text_up_color = Color.new(20,200,100)
  # 损失生命的字体颜色
  Healthbar_text_down_color = Color.new(200,20,20)
end
#===========================================================================
# 定义地图中血条的活动对象   需要在地图活动里为其新加一个 viewport 后文
#===========================================================================
class Xiaochong_Map_Healthbar < RPG::Sprite
  #--------------------------------------------------------------------------
  # 窗口初始化------------触发了增减HP的事件,就会呼出这个窗口
  def initialize(viewport,hp_before,hp_after)
    super(viewport)
    # 导入初始参数
    ini_data(hp_before,hp_after)
  end
  #--------------------------------------------------------------------------
  # 释放
  def dispose
    self.bitmap.dispose
    super
  end
  #--------------------------------------------------------------------------
  # 导入基础参数;获取增减生命的数值;  每次HP变化都得重新调用这些数值!
  def ini_data(hp_before,hp_after)
    # 导入控制开关
    @totoal_display_屏蔽 = Xiao虫::Healthbar_total_Switchid
    @number_display_屏蔽 = Xiao虫::Healthbar_number_Switchid
    # 导入持续、渐隐时间
    @hold_time = Xiao虫::Healthbar_time_1
    @disappear_time = Xiao虫::Healthbar_time_2
    # 导入计时器的时间,当计时器为0的时候,该对象消失
    @wait_time = @hold_time + @disappear_time
    # 导入大小尺寸
    @width = Xiao虫::Healthbar_width
    @height = Xiao虫::Healthbar_height
    self.x = $game_player.screen_x
    self.y = $game_player.screen_y
    # 导入生命条颜色
    @color_health = Xiao虫::Healthbar_color
    @color_back = Xiao虫::Healthbar_backcolor
    @color_frame_1 =  Xiao虫::Healthbar_framecolor_1
    @color_frame_2 =  Xiao虫::Healthbar_framecolor_2
    # 导入字体设置
    @text_size = Xiao虫::Healthbar_text_size
    @text_color_up = Xiao虫::Healthbar_text_up_color
    @text_color_down = Xiao虫::Healthbar_text_down_color
    # 导入角色们的总hp和当前总和的hp量   注意,这里是整个队伍的值
    maxhp = 0
    for i in 0..3
      maxhp += $game_party.actors.maxhp if $game_party.actors != nil
    end
    @hp_total = maxhp
    @hp_before = hp_before
    @hp_after = hp_after
    # 总体透明度
    @opacity = 0
    # 数值透明度
    @opacity_text = 0
  end
  #--------------------------------------------------------------------------
  # 更新
  def update
    # 如果描绘时间到了,则直接停止,并释放
    if @wait_time <= 0
      self.bitmap.dispose
      self.dispose
      return
    end
    # 计时器-1
    @wait_time -= 1
    # 血条应该显示的位置
    x = $game_player.screen_x - @width / 2
    y = $game_player.screen_y + 8
    # 血条原始尺寸
    width = @width
    height = @height
    # 【【【计算倍率】】】
    # 目标血量的倍率是固定的,之前血量的倍率会随时间变化;以此来描绘变化
    if @hp_total != 0
      # 增减的那一段的倍率,初始值固定,但后面会乘上时间倍率
      rate_change = @hp_after.to_f / @hp_total - @hp_before.to_f / @hp_total
      # 是初始的倍率
      rate_before = @hp_before.to_f / @hp_total
    else
      rate_change = 0
      rate_before = 0
    end
    # 根据已经持续的时间再计算倍率;只有hold_time前二分之一的时间,血条血量会变化
    if @wait_time >= @hold_time / 2 + @disappear_time
      # 计算已经过去的时间,并将其变为浮点数
      time_pass = ((@hold_time + @disappear_time)-@wait_time).to_f
      # 计算倍率的倍率——比较绕,其实就是rate_change随时间变化的比例
      rate_rate = time_pass.to_f / (@hold_time / 2)
      # rate_rate 随时间的变化为:[0, 0.1, 0.2, ..., 1]
      rate_change *= rate_rate.to_f
    end
    # 得出最终应该描绘的血条占总血条的比例
    rate_final = rate_before.to_f + rate_change.to_f
    rate_final
    # 计算随时间变化的血条透明度
    if @wait_time > @disappear_time
      opacity = 255
    else
      opacity = 255 * (@wait_time.to_f/@disappear_time)
    end
    # 【【【开始描绘血条】】】
    # 清空之前已有的对象
    self.bitmap.clear if self.bitmap != nil
    # 生成血条框对象
    self.bitmap = Bitmap.new(width,height)
    # 改变精灵的透明度
    self.opacity = opacity
    # 外框粗细
    a = 1
    # 内框粗细
    b = 1
    # 设定描绘的位置
    self.x = $game_player.screen_x - width / 2
    self.y = $game_player.screen_y
    # 下面的 0 坐标,也就是 self 的坐标
    # 外框
    self.bitmap.fill_rect(0, 0, width, height, @color_frame_1)
    # 内框
    self.bitmap.fill_rect(0 + a, 0 + a, width - a*2, height - a*2, @color_frame_2)
    # 底色
    self.bitmap.fill_rect(0 + (a+b), 0 + (a+b), width - (a+b)*2, height - (a+b)*2, @color_back)
    # 血条
    self.bitmap.fill_rect(0 + (a+b), 0 + (a+b), (width - (a+b)*2)*rate_final, height - (a+b)*2, @color_health)

  end
end
#===========================================================================
# 定义地图中 受伤后 飘血的数字的活动对象
#===========================================================================
class Xiaochong_Map_Healthbar_Text < RPG::Sprite
  #--------------------------------------------------------------------------
  # 初始化
  def initialize(viewport,hp_before,hp_after)
    super(viewport)
    # 字体显示会持续的时间 = 血条变动的时间
    @wait_time = Xiao虫::Healthbar_time_1 * 3 / 2
    # 计算hp变化量
    @number = hp_after - hp_before
    # 获取起始坐标
    self.x = $game_player.screen_x
    self.y = $game_player.screen_y
    draw_text(@number)
  end
  #--------------------------------------------------------------------------
  # 描绘文字(只会描绘一次)
  def draw_text(number)
    # 导入文字信息
    size = Xiao虫::Healthbar_text_size
    color1 = Xiao虫::Healthbar_text_up_color
    color2 = Xiao虫::Healthbar_text_down_color
    color0 = Color.new(255,255,255,150)
    # 分辨字的颜色
    if number > 0
      color = color1
    else
      color = color2
      number = number.to_s.split("-")[1]
    end
    text = number.to_s
    # 新的对象 ————————————后面这个数字可以调,以适应字号
    self.bitmap = Bitmap.new(350,200)
    # 文字信息
    self.bitmap.font.size = size
   
    # 描绘文字的矩形框框
    rect = Rect.new(0, 0, 400, size)
    rect_1 = Rect.new(2, 0, 400, size)
    rect_2 = Rect.new(-2, 0, 400, size)
    rect_3 = Rect.new(0, 2, 400, size)
    rect_4 = Rect.new(0, -2, 400, size)
    # 文字描绘----居中对齐
    self.bitmap.font.color = color0
    self.bitmap.draw_text(rect_1,text,1)
    self.bitmap.draw_text(rect_2,text,1)
    self.bitmap.draw_text(rect_3,text,1)
    self.bitmap.draw_text(rect_4,text,1)
    self.bitmap.font.color = color
    self.bitmap.draw_text(rect,text,1)
  end
  #--------------------------------------------------------------------------
  # 更新 更改字的位置以及透明度
  def update
    if @wait_time <= 0
      self.bitmap.dispose
      self.dispose
      return
    end
    @wait_time -= 1
    time_pass = Xiao虫::Healthbar_time_1 - @wait_time
    # 画面坐标更新
    self.x = $game_player.screen_x - 200
    self.y = $game_player.screen_y - 64 - time_pass * 0.5
    self.opacity = 255 * @wait_time / Xiao虫::Healthbar_time_1
  end
end

#===========================================================================
# 更改地图中 活动类的定义   因为显示伤害值 有多个对象,所以会用到$game_temp 临时变量
#===========================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  # 初始化
  alias initialize_old initialize
  def initialize
    @damage_num_shows = []
    # 获取当前队伍的hp
    @party_hp_now = 0
    for i in 0..3
      @party_hp_now += $game_party.actors.hp if $game_party.actors != nil
    end
    @_临时hp = 0
    @_临时hp += @party_hp_now
    @hp_bar = nil
    initialize_old
  end
  #--------------------------------------------------------------------------
  # 释放
  alias dispose_old dispose
  def dispose
    dispose_old
    @damage_num_shows.each{|a| a.dispose}
  end
  #--------------------------------------------------------------------------
  # 更新
  alias update_old update
  def update
    update_old
    update_hp_show
    @damage_num_shows.each{|a| a.update}
  end
  #--------------------------------------------------------------------------
  # HP 变化更新
  def update_hp_show
    # 更新当前队伍hp
    @party_hp_now = 0
    for i in 0..3
      @party_hp_now += $game_party.actors.hp if $game_party.actors != nil
    end
    # 如果临时hp发生了变化----则重新导入
    if @_临时hp != @party_hp_now
      hp_before = @_临时hp
      hp_after = @party_hp_now
      @_临时hp = @party_hp_now
      # 让血条出现——这里不需要让血条dispose 血条会自己dispose
      # 新的血条会直接覆盖旧的血条!
      if @hp_bar != nil
        @hp_bar.dispose
      end
      @hp_bar = Xiaochong_Map_Healthbar.new(@viewport3,hp_before,hp_after)
      # 添加新的伤害数值入组
      add_damage_num(hp_before,hp_after)
    end
    # 更新血条
    if @hp_bar != nil
      @hp_bar.update
    end
  end
  #--------------------------------------------------------------------------
  # 添加新的伤害数值入组   
  def add_damage_num(hp_before,hp_after)
    show = Xiaochong_Map_Healthbar_Text.new(@viewport3,hp_before,hp_after)
    @damage_num_shows << show
  end
end



[/pre][/fold]

评分

参与人数 3赞 +3 收起 理由
LaPluma0 + 1 塞糖
sakign + 1
y967 + 1 强大

查看全部评分

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

本版积分规则

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

在本版发帖返回顶部