幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 13022|回复: 12

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

[复制链接]

91

主题

3188

帖子

83986万

积分

荣誉群

传说中的Bunny大神~!

积分
839861514
QQ
发表于 2006-5-19 17:42:17 | 显示全部楼层 |阅读模式
估计大家将血条脚本“插入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。
然后就进入了重要部分。。。 [s:4]
具体的血条画法:
在之前已经有了
   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)
    #如果只是到这里就停止了,不妨让我们看看效果:  
    #黑色背景,和白色边框一样,也使用相同方法画出的,但是要稍微小一点。
    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(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)
    #现在再来看看效果:  
    #写上HP两个大字,这样就更完美了,哦活活活活。。。
    self.contents.draw_text(x,y,128,32,"我叫HP",1)
  end

这样就华丽的画完了,现在再来看看效果:  

在将这个复制一遍,然后造出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条后的最终效果:
  

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

今天再次优化了一下效果:
  

也可以这样,dcf大叔订做的:
  

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

RP附上范例。。。 [s:5]
  


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
其他所有的Bunny神都素我的部下XD~ 小教程范例收集 Orz感谢邪恶萝卜联盟!!!(原因自己去猜)
回复

使用道具 举报

255

主题

7092

帖子

330

积分

版主

人类总是重复同样的悲

Rank: 7Rank: 7Rank: 7

积分
330
QQ
发表于 2006-7-15 22:19:44 | 显示全部楼层
怎么没人回贴?
盗帅冬瓜
2006-05-19 0 370   2006-05-19 17:42
by: 盗帅冬瓜
我是化可能为不可能的男人!
回复 支持 反对

使用道具 举报

3

主题

8

帖子

79

积分

②入门

积分
79
发表于 2008-10-1 23:48:09 | 显示全部楼层
不错不错,没人回帖可能是因为你说的那样,大家都用惯了插入的,不过要像好点效果的话还是自己画好点。。。
谢谢了。。。。。。。
回复 支持 反对

使用道具 举报

4

主题

21

帖子

176

积分

③业余

积分
176
发表于 2009-3-3 10:44:21 | 显示全部楼层
哦哦 会做了 了解了  哈哈 非常感谢   
回复 支持 反对

使用道具 举报

6

主题

26

帖子

226

积分

③业余

积分
226
QQ
发表于 2009-3-11 19:33:10 | 显示全部楼层
还是看不太懂,努力吧
回复 支持 反对

使用道具 举报

4

主题

7

帖子

93

积分

②入门

积分
93
发表于 2009-4-29 11:30:52 | 显示全部楼层
我本身对脚本不是很熟悉,有谁可以帮帮忙教教我吧!
回复 支持 反对

使用道具 举报

40

主题

190

帖子

1635

积分

⑥精研

●~  ●~   ●

积分
1635
发表于 2009-6-24 10:06:40 | 显示全部楼层
怎么画在地图上?方法一样么?喜欢变窄版
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-6-24 10:14:46 | 显示全部楼层
在地图上就在Scene_Map中加一个窗口的变量。。。就可以了
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

8

积分

①新人

积分
8
发表于 2009-6-25 20:58:56 | 显示全部楼层
不错不错 偶学习一下····
回复 支持 反对

使用道具 举报

1

主题

17

帖子

180

积分

③业余

积分
180
发表于 2010-1-15 07:31:33 | 显示全部楼层
自己动手,丰衣足食。我喜欢自己做。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-28 19:09 , Processed in 0.029264 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表