社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 道具中心
主题 : 画敌人HP/SP条的方法(教程+范例)。
盗帅冬瓜 离线
级别: 荣誉群
显示用户信息 
0  发表于: 2006-05-19   
来源于 其他教程 分类

画敌人HP/SP条的方法(教程+范例)。

估计大家将血条脚本“插入Main前”都用惯了,所以我估计这个教程可能对部分人没有什么意义,这个算是想学的人可以学,不想学的人就不学的那种。。。(PS:其实拿范例工程里面的Window_Help直接覆盖原来的即可得到效果)不过我个人认为,了解血条的画法很重要,而且也不难。这次就拿画敌人HP/SP条为例(我自己也是刚学会不久的,所以有什么问题请提醒我纠正)。

因为是要在显示敌人名字的窗口显示,所以应该在脚本Window_Help那里改。
在脚本Window_Help第49行,有如下内容:
  #--------------------------------------------------------------------------
  # ● 设置敌人
  #    enemy : 要显示名字和状态的敌人
  #--------------------------------------------------------------------------
  def set_enemy(enemy)
    text = enemy.name
    state_text = make_battler_state_text(enemy, 112, false)
    if state_text != ""
      text += "  " + state_text
    end
    set_text(text, 1)
  end
end

将这个重新定义为:
  def set_enemy(actor)
    self.contents.clear
    draw_actor_name(actor, 4, 0)
    draw_actor_state(actor, 140, 0)
    draw_hp_bar(actor, 284, 0)#HP显示
    draw_sp_bar(actor, 460, 0)#SP显示
    @text = nil
    self.visible = true
  end

这样子设定其实是仿造第33行设置角色的方法,这样才可以办到显示HP/SP。
然后就进入了重要部分。。。
具体的血条画法:
在之前已经有了
  draw_hp_bar(actor, 284, 0)
    draw_sp_bar(actor, 460, 0)

这段内容,就是定义血条的画法,就先拿HP条的画法来举例吧。
这个是画成之后的脚本,各个部分的作用都已经注明:
def draw_hp_bar(actor,x,y)
    width = 128#定义血条的长度
    white = Color.new(255,255,255,200)#定义白色,这是为了方便以后的运用。
    black = Color.new(0,0,0,200)#定义黑色,这也是为了方便以后的运用。
    w = width * actor.hp / actor.maxhp#定义宽度的算法,当然是按HP百分比计算。
    self.contents.font.color = Color.new(255, 255, 0, 255)#字体颜色,我设为黄色。
    #白色边框(其实应该是背景色),这里要说明的是其实各种形状的血条都是由
  #self.contents.fill_rect(之前定义的x坐标, 之前定义的y坐标, 血条长度, 血条高度, 颜色)
    #这个指令画出来的,不同形状的血条也是根据许多这样的一行行指令做成的。
  self.contents.fill_rect(x+1, y+11, width-2, 1, white)
    self.contents.fill_rect(x, y+12, width, 1, white)
    self.contents.fill_rect(x-1, y+13, width+2, 9, white)
    self.contents.fill_rect(x, y+22, width, 1, white)
    self.contents.fill_rect(x+1, y+23, width-2, 1, white)
    #如果只是到这里就停止了,不妨让我们看看效果:[attachment=11017] 
    #黑色背景,和白色边框一样,也使用相同方法画出的,但是要稍微小一点。
    self.contents.fill_rect(x+2, y+12, width-4, 1, black)
    self.contents.fill_rect(x+1, y+13, width-2, 1, black)
    self.contents.fill_rect(x, y+14, width, 7, black)
    self.contents.fill_rect(x+1, y+21, width-2, 1, black)
    self.contents.fill_rect(x+2, y+22, width-4, 1, black)
    #现在再看看效果:[attachment=11018]
    #其实从这里已经可以看出,血条的画法其实是有很多层颜色套在一起合成,越后写的越优先。
    #RP颜色计算法,这个是非常重要的地方,这样你的血条才有颜色。
    val = 255 * ((actor.hp*100)/actor.maxhp)#颜色变化算法
    green = 255 - val/100#这里主要变化的是绿色,血越少,绿色越多,这样导致血条颜色变化。
    color = Color.new(225,green,0,200)#颜色
    top_color = Color.new(255,green+32,96,200)#顶上的颜色,作为渐变色出现(好看)。
    bottom_color = Color.new(172,green,0,200)#底下的颜色,作为渐变色出现(好看)。
    #画血条,算完颜色后总要把血条画上吧?
    self.contents.fill_rect(x+2, y+12, w-4, 1, top_color)
    self.contents.fill_rect(x+1, y+13, w-2, 1, top_color)
    self.contents.fill_rect(x, y+14, w, 7, color)
    self.contents.fill_rect(x+1, y+21, w-2, 1, color)
    self.contents.fill_rect(x+2, y+22, w-4, 1, bottom_color)
    #现在再来看看效果: [attachment=11019]
    #写上HP两个大字,这样就更完美了,哦活活活活。。。
    self.contents.draw_text(x,y,128,32,"我叫HP",1)
  end

这样就华丽的画完了,现在再来看看效果: [attachment=11020]

在将这个复制一遍,然后造出SP条(其实就是把所有hp改成sp,再改改颜色算法):
  def draw_sp_bar(actor,x,y)
    width = 128
    white = Color.new(255,255,255,200)
    black = Color.new(0,0,0,200)
    w = width * actor.sp / actor.maxsp
    self.contents.font.color = Color.new(255, 255, 0, 255)
    #白色边框
    self.contents.fill_rect(x+1, y+11, width-2, 1, white)
    self.contents.fill_rect(x, y+12, width, 1, white)
    self.contents.fill_rect(x-1, y+13, width+2, 9, white)
    self.contents.fill_rect(x, y+22, width, 1, white)
    self.contents.fill_rect(x+1, y+23, width-2, 1, white)
    #黑色背景
    self.contents.fill_rect(x+2, y+12, width-4, 1, black)
    self.contents.fill_rect(x+1, y+13, width-2, 1, black)
    self.contents.fill_rect(x, y+14, width, 7, black)
    self.contents.fill_rect(x+1, y+21, width-2, 1, black)
    self.contents.fill_rect(x+2, y+22, width-4, 1, black)
    #RP颜色计算法
    val = 255 * ((actor.hp*100)/actor.maxhp)
    green = 255 - val/100
    color = Color.new(0,green,255,200)
    top_color = Color.new(96,green+32,255,200)
    bottom_color = Color.new(0,green,172,200)
    #画气条
    self.contents.fill_rect(x+2, y+12, w-4, 1, top_color)
    self.contents.fill_rect(x+1, y+13, w-2, 1, top_color)
    self.contents.fill_rect(x, y+14, w, 7, color)
    self.contents.fill_rect(x+1, y+21, w-2, 1, color)
    self.contents.fill_rect(x+2, y+22, w-4, 1, bottom_color)
    #写上SP两个大字
    self.contents.draw_text(x,y,128,32,"我叫SP",1)
  end
end#最后别忘记end这个脚本,不然要出错。

完美的画完了HP/SP条后的最终效果:
[attachment=11026]

也可以套用樱雅在土的画法,画出横向渐变色的HP/SP条,画法稍有差异,效果:
横向渐变色版


今天再次优化了一下效果:
横向渐变色版(较好看)


也可以这样,dcf大叔订做的:
横向渐变色版(中间变窄)


好了,全部完成了,这个画血条的方法也能用在许多窗口里,只要灵活变通改坐标即可。

RP附上范例。。。
[attachment=11025]
敌人血条范例(横向渐变色).rar (190 K) 下载次数:131
敌人血条范例(横向渐变色).rar (191 K) 下载次数:379
敌人血条范例(中间变窄).rar (191 K) 下载次数:173
[ 此贴被化冻在2007-07-28 10:59重新编辑 ]
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
其他所有的Bunny神都素我的部下XD~

小教程范例收集
Orz感谢邪恶萝卜联盟!!!(原因自己去猜)
霜之哀伤 离线
级别: 分版主
显示用户信息 
1  发表于: 2006-07-15   
怎么没人回贴?
盗帅冬瓜
2006-05-19 0 370   2006-05-19 17:42
by: 盗帅冬瓜
我是化可能为不可能的男人!
lhbadsl 离线
级别: ①新人
显示用户信息 
2  发表于: 2008-10-01   
不错不错,没人回帖可能是因为你说的那样,大家都用惯了插入的,不过要像好点效果的话还是自己画好点。。。
谢谢了。。。。。。。
y516940914 离线
级别: ②入门
显示用户信息 
3  发表于: 2009-03-03   
哦哦 会做了 了解了  哈哈 非常感谢   
cgl8532 离线
级别: ②入门
显示用户信息 
4  发表于: 2009-03-11   
还是看不太懂,努力吧
babyxiang 离线
级别: ①新人
显示用户信息 
5  发表于: 2009-04-29   
我本身对脚本不是很熟悉,有谁可以帮帮忙教教我吧!
幻耶 离线
级别: ③业余
显示用户信息 
6  发表于: 2009-06-24   
怎么画在地图上?方法一样么?喜欢变窄版
secondsen 离线
级别: 总版主
显示用户信息 
7  发表于: 2009-06-24   
在地图上就在Scene_Map中加一个窗口的变量。。。就可以了
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
449091 离线
级别: ①新人
显示用户信息 
8  发表于: 2009-06-25   
不错不错 偶学习一下····
libinsf 离线
级别: ②入门
显示用户信息 
9  发表于: 2010-01-15   
自己动手,丰衣足食。我喜欢自己做。
描述
快速回复

认证码:

验证问题:
22-5=?,答案:17 正确答案:17
按"Ctrl+Enter"直接提交