Project1

标题: 窗口属性 fill_rect 的用法详解 [打印本页]

作者: 失去的记忆    时间: 2011-5-27 10:24
标题: 窗口属性 fill_rect 的用法详解
本帖最后由 失去的记忆 于 2011-6-4 08:39 编辑

fill_rect:一个功能强大的描绘窗口属性的方法,可以帮助我门实现血条的绘制等等,
现在我想问一下这个fill_rect的具体用法...
比如
在一个窗口中这样写:
  1. bitmap = Bitmap.new("Graphics/Icons/状态框")
  2.       self.contents.blt(0,0,bitmap ,bitmap.rect)
  3.       self..contents.fill_rect(0,0,20,200,Color.new(0,0,0,255))
复制代码
那么会在图片上面出现一个 20X20的黑框,现在我想让这个黑框消失,我的方法是:
  1. self..contents.fill_rect(0,0,20,200,Color.new(0,0,0,0))/   //描绘一个透明的矩形
  2.       bitmap = Bitmap.new("Graphics/Icons/状态框")   //重新描绘图片
  3.       self.contents.blt(0,0,bitmap ,bitmap.rect)
复制代码
这个方法可真够.......现在我想知道有没有方法不重新描绘图片,就可以让这个矩形消失呢?
作者: 禾西    时间: 2011-5-27 11:13
蒙板,或者fill個透明色(不過貌似fill兩次z值會有偏移,從而出現痕跡,沒有RM不好測試)
作者: kinguanghua    时间: 2011-5-27 11:57
本帖最后由 kinguanghua 于 2011-5-27 12:49 编辑

楼主最好载个图 因为不清楚楼主说的黑框是什么
补充:
好吧 我解释一下我问这个问题的意图
因为楼主的是直接用Graphics/Icons/状态框当背景
所以我不太清楚 如果单纯是为了更新的时候去掉原来描绘过的血槽 我一般是这么写的
用fill_rect描绘一个血槽总大小的无色框 然后重新描绘血槽
另一种方法就是把bitmap的一部分描绘到原有血槽部分然后重新描绘血槽
  1. #假设血槽的最大宽度和高度是w和h坐标为x,y
  2. bitmap = Bitmap.new("Graphics/Icons/状态框")
  3. self.contents.blt(0,0,bitmap,Rect.new(x,y,w,h))
  4. #以下描绘血槽
复制代码
还有就是sprite的方法了
这个就不需要重新描绘背景什么的 直接血槽描绘在一个新的sprite里 更新也是更新这个新的sprite

再补充一下 这是我最近写血条的风格 不知道对楼主是否有帮助
  1.   #--------------------------------------------------------------------------
  2.   # ● 描绘HP
  3.   # x,y 血条坐标
  4.   # limit_w,limit_h 血条最大宽和高
  5.   # refreshed 判断是否是从refresh中调用 所以在refresh里调用这个函数的时候应该传true
  6.   #--------------------------------------------------------------------------
  7.   def draw_hsp(x,y,limit_w,limit_h,actor,refreshed=false)
  8.     rect = Rect.new(x,y,limit_w,limit_h)
  9.     # 清楚原有名字
  10.     unless refreshed
  11.       back_bitmap = RPG::Cache.pic("状态栏背景")
  12.       self.contents.blt(x,y,back_bitmap,rect)
  13.     end
  14.     # 描绘血槽背景 当然 也可以是用血槽背景图片代替
  15.     #self.contents.fill_rect(x,y,limit_w,limit_h,black_color)
  16.     # 描绘槽
  17.     w = actor.hp.to_f*limit_w/actor.maxhp.to_f
  18.     w = [[w,0].max,limit_w].min   
  19.     # 这里w为现在要描述的血槽的宽
  20.     self.contents.fill_rect(x,y,w,h,Color.new(255,0,0))
  21.     # 描绘数值
  22.     rect = Rect.new(x+54,y-11,32,16)   
  23.     self.contents.draw_text(rect, actor.hp.to_s,2)
  24.   end
复制代码
PS:建议楼主多试试用图片表示血槽什么的 会比默认的华丽很多
作者: Wind2010    时间: 2011-5-27 12:08
在该窗口范围内多新建一个Bitmap用来描绘血条 嗯
作者: fux2    时间: 2011-5-27 12:25
Sprite,一了百了。
作者: 失去的记忆    时间: 2011-5-27 12:29
Wind2010 发表于 2011-5-27 12:08
在该窗口范围内多新建一个Bitmap用来描绘血条 嗯

哈哈,我是这样想过啦,但是血条上面还要写下HP数字的...
如果是这样的话,那么数字就没了...
PS:我测试过的....
作者: 失去的记忆    时间: 2011-5-27 14:23
失去的记忆 发表于 2011-5-27 12:29
哈哈,我是这样想过啦,但是血条上面还要写下HP数字的...
如果是这样的话,那么数字就没了...
PS:我测试 ...

.........
这个虽然如此做应该可以,但是我想问一下:
在一个窗口中建立一个Bitmap,能够是这个Bitmap的Z坐标小于本窗口吗?
PS:Sprite除外!!!!
作者: 忧雪の伤    时间: 2011-5-27 19:57
  1. self.contents.fill_rect(bitmap.rect, Color.new(0, 0, 0, 0))
复制代码
楼主格式注意一下?
作者: 失去的记忆    时间: 2011-5-28 12:58
谢谢大家的回复..其实用Sprite我也知道.
但是就是想知道有没有将你描绘的一个透明矩形取消掉!!
PS:重新描绘覆盖它的不算!
作者: 失去的记忆    时间: 2011-5-28 12:59
kinguanghua 发表于 2011-5-27 11:57
楼主最好载个图 因为不清楚楼主说的黑框是什么
补充:
好吧 我解释一下我问这个问题的意图

第一种方法: 能不能不重新描绘图片?这样很耗内存的...
第二种方法:这个方法我也知道,但是可能造成FPS下降...
作者: ky52879    时间: 2011-5-30 17:44
本帖最后由 ky52879 于 2011-5-31 07:25 编辑

?????????????????????????
作者: wbsy8241    时间: 2011-5-30 20:03
ky52879 发表于 2011-5-30 17:44
悲剧..自定一个,看看还有新的想法没..

Bitmap 存进RPG::Cache

用 blt 来重绘被覆盖过的这1小块




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1