查看: 10775|回复: 17

[已经解决] 怎么做环条式血条

[复制链接]
梦石
0
星屑
3114
在线时间
662 小时
注册时间
2012-6-17
回帖
516

MZ评测员

发表于 2021-3-10 17:44:10 | 显示全部楼层 |阅读模式

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

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

×
如图。本意是半环,hp和mp。站上搜索环式没有,有见过这样的血条脚本吗,或提供下思路
无标题.png

问渠那得清如许vs插件群:592798519  百鬼异闻录:887907636
为有源头活水来点击这里试玩
梦石
2
星屑
13779
在线时间
2319 小时
注册时间
2011-6-4
回帖
586
发表于 2021-3-10 17:51:26 | 显示全部楼层
自己在自己的坑里实现过类似的,但是又改回长条了。和长条血条实现的方式差不多
BUG反馈请加QQ 529283039
水友群 917854767

回复

使用道具 举报

梦石
0
星屑
8003
在线时间
1184 小时
注册时间
2007-7-29
回帖
2014
发表于 2021-3-10 18:24:29 | 显示全部楼层
老实说,这种血条在rmxp不常看到主要两个原因。
1. 曲型血条真的不好画,需要对一些几何方程+rmxp bitmap熟悉才画得出,不像线性那么明了。
2. 用rmxp画几何图那性能本就惨不忍睹,不过后来有外挂DLL解决了这个问题,我以前帮天圣写图鉴脚本时就用到了该脚本,具体什么名称我真忘记了。

在以上两大限制的情况下,只能走一种古老可是不得不说能成的方法,那就是准备左右各101张血条,分别是0到100%,然后根据hp和mp的数值%显示对应的图。

点评

cos(a)^2 + sin(a)^2 = 1,然后y/x = tan(a),就这两个公式全部解决  发表于 2021-3-11 02:14
回复

使用道具 举报

梦石
0
星屑
3114
在线时间
662 小时
注册时间
2012-6-17
回帖
516

MZ评测员

 楼主| 发表于 2021-3-10 18:45:26 | 显示全部楼层
真·可乐 发表于 2021-3-10 17:51
自己在自己的坑里实现过类似的,但是又改回长条了。和长条血条实现的方式差不多 ...

本身bitmap没有画圆形的方法啊。怎么差不多?能分享一下吗

问渠那得清如许vs插件群:592798519  百鬼异闻录:887907636
为有源头活水来点击这里试玩
回复

使用道具 举报

梦石
0
星屑
3114
在线时间
662 小时
注册时间
2012-6-17
回帖
516

MZ评测员

 楼主| 发表于 2021-3-10 18:49:01 | 显示全部楼层
enghao_lim 发表于 2021-3-10 18:24
老实说,这种血条在rmxp不常看到主要两个原因。
1. 曲型血条真的不好画,需要对一些几何方程+rmxp bitmap熟 ...

谢谢思路。虽然也不用图片的方法,但理解了方向。

问渠那得清如许vs插件群:592798519  百鬼异闻录:887907636
为有源头活水来点击这里试玩
回复

使用道具 举报

梦石
0
星屑
26087
在线时间
1595 小时
注册时间
2016-1-6
回帖
3441

超评测参与极短28参与极短27参与极短26参与极短25参与

发表于 2021-3-10 19:17:36 | 显示全部楼层
我想到一个方法,就是用图片显示,假设把 0%~100% 分成11张图片(分的有点粗),当前 hp 和 mp 符合哪个比例就显示哪张图片,楼主你看这个方法行得通吗?
回复

使用道具 举报

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
回帖
205
发表于 2021-3-10 20:46:41 | 显示全部楼层
大概的思路

纯脚本绘制话,估计win32api,太难了;直接rgss的话,效率……

一张图片(如你给出的图)的话,看你是 简单的横截线 还是经过的圆心的线
横截线就如条形一样 算比例 直接blt

经过圆心的线的话,以角度表示血量多少
先算下圆环外员的交点,blt需要的矩形(自交点以下),这时会多出个很小的三角形的区域
clear_rect(就是填充透明色) 数学问题  清除掉多余的三角形区域

另类的方法
圆环旋转,只适用单色背景
首先大圆环 左边红 右边背景色 分成2张图片
小圆环 右边蓝 左边背景色 也是分成2张图片
红蓝blt
背景色的2张图,分别生成sprite
根据血量、蓝量旋转覆盖红环、蓝环


回复

使用道具 举报

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

发表于 2021-3-11 01:59:49 | 显示全部楼层
本帖最后由 SailCat 于 2021-3-11 02:20 编辑

RMXP的bitmap处理效率不比RMVA差的,这个我很明确的测试过并得出结论
RMXP每帧纯做set_pixel能做8000次,你觉得你的血条里会有8000个像素点吗?就算有,能有16000个像素点吗?血不会每帧更新,刷血条时损失1帧又不是什么大不了的事。要知道不论RMXP还是RMVA,draw_text都是个奇慢的操作,你还经常一帧做几十次呢。

所以觉得RGSS直接做不了的,都是算法问题

有简易实现和完美实现两个办法
简易实现:特点是速度快,缺点是血条的水面是平的,不是正对圆心角的斜线。

首先制作2个空血条bitmap,作为底图传送成精灵,ox, oy设在圆心(也就是两个bitmap的左中点和右中点)(假设环直径100,底图都是50X100大小,例为血(50,50)和蓝(0,50)))
把它们的x, y设置在一起,显示出来就拼起来了
然后制作2个满血条bitmap,作为面图(z更高)传送成精灵,ox, oy,x,y也一起和前面的重合
然后根据你的血量蓝量百分比,改变两面图精灵的src_rect为高度的百分比,从底端算起,比如22%血,就传送(0,78,50,22)为血,40%蓝,就传送(0,60,50,40)为蓝
完毕了。

完美实现,底图一样,可简单用精灵做
面图的bitmap需要自己绘制:
血条直径100的话,需要执行至多100次bitmap#fill_rect(由于水平做比垂直做快,建议水平做)
以下改的是Window_Menustatus
总之不算难,效率也不差,水平做fill_rect一帧极限我记得是720次。垂直120次
这里有些复杂的三角函数运算,实际没那么多,反正在菜单中帧数大概36-37左右(我能说是被draw_text拖的么)

[pre lang="ruby"]  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @item_max = $game_party.actors.size
    for i in 0...$game_party.actors.size
      x = 64
      y = i * 116
      actor = $game_party.actors
      draw_actor_graphic(actor, x - 40, y + 80)
      draw_actor_name(actor, x, y)
      draw_actor_class(actor, x + 144, y)
      draw_actor_level(actor, x, y + 32)
      draw_actor_state(actor, x + 90, y + 32)
      draw_actor_exp(actor, x, y + 64)
      draw_actor_hp(actor, x + 236, y + 32)
      draw_actor_sp(actor, x + 236, y + 64)
      outer = 50 # 外径
      inner = 40 # 内径
      ox = 300 # 血条ox
      oy = i * 116 + 50 # 血条oy
      hp_rate = actor.hp * 100.0 / actor.maxhp # HP 比例
      sp_rate = actor.sp * 100.0 / actor.maxsp # SP 比例
      hx_rate = hp_rate == 50 ? 0.0 :
        Math.tan((0.5 + hp_rate * 0.01) * Math::PI)
      sx_rate = sp_rate == 50 ? 0.0 :
        Math.tan((0.5 - sp_rate * 0.01) * Math::PI)
      hp_color = Color.new(232,90,90,255)
      sp_color = Color.new(90,90,232,255)
      outer.downto(-outer) do |by|
        fy = by.to_f
        x_in = (fy.abs >= inner ? 0 : inner * Math.sqrt([1 - (fy / inner) ** 2,
          0].max)+0.5).to_i
        x_out = (outer * Math.sqrt([1 - (fy / outer) ** 2, 0].max)+0.5).to_i
        if by == 0
          if hp_rate >= 50
            contents.fill_rect(ox - x_out, oy, x_out - x_in, 1, hp_color)
          end
          if sp_rate >= 50
            contents.fill_rect(ox + x_in, oy, x_out - x_in, 1, sp_color)
          end
          next
        end
        hx = hx_rate == 0.0 ? -999 * by : (fy / hx_rate).to_i
        sx = sx_rate == 0.0 ? 999 * by : (fy / sx_rate).to_i
        if hx.between?(-x_out, -x_in)
          if hp_rate >= 50
            contents.fill_rect(ox - x_out, oy + by, hx + x_out, 1,  hp_color)
          else
            contents.fill_rect(ox + hx, oy + by, -x_in - hx, 1, hp_color)
          end
        elsif (hx > -x_in) ^ (hp_rate <= 50)
          contents.fill_rect(ox - x_out, oy + by, x_out - x_in, 1, hp_color)
        end
        if sx.between?(x_in, x_out)
          if sp_rate >= 50
            contents.fill_rect(ox + sx, oy + by, x_out - sx, 1,  sp_color)
          else
            contents.fill_rect(ox + x_in, oy + by, sx - x_in, 1, sp_color)
          end
        elsif (sx < x_in) ^ (sp_rate <= 50)
          contents.fill_rect(ox + x_in, oy + by, x_out - x_in, 1, sp_color)
        end
      end
    end
  end[/pre]


多说两句,如果真嫌慢(实际上是伪命题,卡的话查其他地方),做0% 50% 100%三个基础环图,然后根据hp的比例在上面加加减减的fill_rect打补丁,因为补丁最多需要工作1/4的区间(平均期望1/8),故此能再快1/2左右,而且我现在这个算法是HP越满绘制量越高,正常玩家没有谁会放着黄血一直长时间不管的吧……但是实话说其实没啥继续优化的必要
Project7 - 40 FPS 2021_3_11 1_58_51.png

评分

参与人数 5星屑 +150 赞 +4 收起 理由
RyanBern + 150 认可答案
1390959782 + 1 绝对高手,直呼牛逼,大佬
阿尔卑斯 + 1 棒棒棒
enghao_lim + 1 不赞不行 XD
89444640 + 1 塞糖

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2021-3-11 15:08:39 | 显示全部楼层
sprite可以旋转,然后viewport不会绘制sprite超出的部分,那是不是可以做个半圆形的素材,旋转一下,超出的部分会被viewport干掉。

点评

感觉viewport没啥性能开销吧  发表于 2021-3-11 16:20
4个人8个viewport?  发表于 2021-3-11 15:18

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 这脑洞,可

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
14720
在线时间
2175 小时
注册时间
2016-9-20
回帖
777
发表于 2021-3-11 15:51:36 | 显示全部楼层
这么麻烦要是我就直接弄垂直血条
贴子只供参考我贴子内容有很多只是我自己标识的内容代指不是原来意思,偏向发贴当时的想法(后来回看贴发现有很多错误,会造成误导 ),如果想靠谱点应 找相关正确的文章   -- 2025/4/19
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部