Project1

标题: 修改显示敌人HP/MP百分比的血槽 [打印本页]

作者: 柳飛鷹    时间: 2009-8-21 14:03
标题: 修改显示敌人HP/MP百分比的血槽
  1. # ————————————————————————————————————
  2. # 本脚本来自www.66rpg.com,转载请保留此信息
  3. # ————————————————————————————————————

  4. #==============================================================================
  5. # ■ Window_Help
  6. #------------------------------------------------------------------------------
  7. # 可以显示敌人的HP\MP百分比
  8. #==============================================================================

  9. class Window_Help < Window_Base
  10.   def set_enemy(actor)
  11.     self.windowskin = RPG::Cache.windowskin("仿xp皮肤")
  12.     self.contents.clear
  13.     draw_actor_name(actor, 4, 0)
  14.     draw_actor_state(actor, 140, 0)
  15.     carol3_draw_hp_bar(actor, 284, 0)
  16.     carol3_draw_sp_bar(actor, 460, 0)
  17.     @text = nil
  18.     self.visible = true
  19.   end
  20.   def carol3_draw_hp_bar(actor, x, y, width = 128) #宽度可调
  21.     self.contents.font.color = system_color
  22.     self.contents.fill_rect(x-1, y+17, width+2,6, Color.new(0, 0, 0, 255))
  23.     w = width * actor.hp / actor.maxhp
  24.     self.contents.fill_rect(x, y+18, w,1, Color.new(255, 96, 96, 255))
  25.     self.contents.fill_rect(x, y+19, w,1, Color.new(255, 0, 0, 255))
  26.     self.contents.fill_rect(x, y+20, w,1, Color.new(128, 0, 0, 255))
  27.     self.contents.fill_rect(x, y+21, w,1, Color.new(0, 0, 0, 255))
  28.     self.contents.draw_text(x,y,128,32,$data_system.words.hp,1)
  29.     self.contents.font.color = normal_color
  30.   end
  31.   def carol3_draw_sp_bar(actor, x, y, width = 128)
  32.     self.contents.font.color = system_color
  33.     self.contents.fill_rect(x-1, y+17, width+2,6, Color.new(0, 0, 0, 255))
  34.     w = width * actor.sp / actor.maxsp
  35.     self.contents.fill_rect(x, y+18, w,1, Color.new(128, 255, 255, 255))
  36.     self.contents.fill_rect(x, y+19, w,1, Color.new(0, 255, 255, 255))
  37.     self.contents.fill_rect(x, y+20, w,1, Color.new(0, 192, 192, 255))
  38.     self.contents.fill_rect(x, y+21, w,1, Color.new(0, 128, 128, 255))
  39.     self.contents.draw_text(x,y,128,32,$data_system.words.sp,1)
  40.     self.contents.font.color = normal_color
  41.   end
  42. end
复制代码
可不可以将血槽样式改为RTAB的
作者: 悠悠炸弹    时间: 2009-8-21 14:37
本帖最后由 悠悠炸弹 于 2009-8-23 14:11 编辑

不懂脚本的人路过....
self.windowskin = RPG::Cache.windowskin("仿xp皮肤")
这一句跟RTAB冲突了.去掉应该可以了.
其实这就是柳大的显示血条而已......
http://rpg.blue/web/index.php?doc-view-4132
作者: cfancy    时间: 2009-8-21 15:32
http://rpg.blue/web/htm/list_news23.htm
看看有没有你要找的~~~~有个血条绘制教学是天干宝典庚卷里的~~~
作者:

盗帅冬瓜 ♂



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



原贴转自:http://bbs.rpgchina.com/read-htm-tid-18189.html

画敌人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)
  #如果只是到这里就停止了,不妨让我们看看效果:白色边框

  #黑色背景,和白色边框一样,也使用相同方法画出的,但是要稍微小一点。
  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)
  #现在再来看看效果: RP血条

  #写上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大叔订做的:
横向渐变色版(中间变窄)


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


作者: 柳飛鷹    时间: 2009-8-22 12:57
本帖最后由 柳飛鷹 于 2009-8-22 13:03 编辑

谢谢LS……但是我不会绘制血条
可否帮忙一下,给上修改好的
2L的……理解错误啦……我是说我想把这个血槽脚本的血槽样式改为RTAB式的
原来我也可以评分的!
作者: well    时间: 2009-8-23 05:01
没有RATB的原脚本,就空想着说一下。
搜索有你喜欢的血槽样式的脚本。关键词是“draw”“hp”“sp”之类的组合。找到之前有“def”的。其后有许多“self.contents.fill_rect(...)”,也就是定义描绘血槽气槽的方法。把其中内容覆盖你要改那个脚本里的“def carol3_draw_hp_bar”和“def carol3_draw_sp_bar”。注意括号里那些变量名称和复制过来的内容里相应的名称统一。或者连方法名称也覆盖掉,在其他调用“carol3_draw_hp_bar”和“carol3_draw_sp_bar”的地方改为你修改的名称。
如果是用图片显示的。那么方法里没有“self.contents.fill_rect(...)”,但名字里关键词总少不了那三个。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
绘制血条是比较简单的。有很多教程。LZ留意一下注释就会知道怎么改。自己修改不是更到位吗。
作者: 柳飛鷹    时间: 2009-8-24 10:00
  1. # ————————————————————————————————————

  2. # HP/SP/EXPゲージ表示スクリプト Ver 1.00
  3. # 配布元・サポートURL
  4. # http://members.jcom.home.ne.jp/cogwheel/

  5. #==============================================================================
  6. # ■ Game_Actor
  7. #------------------------------------------------------------------------------
  8. #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
  9. # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
  10. #==============================================================================

  11. class Game_Actor < Game_Battler
  12.   def now_exp
  13.     return @exp - @exp_list[@level]
  14.   end
  15.   def next_exp
  16.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  17.   end
  18. end

  19. #==============================================================================
  20. # ■ Window_Base
  21. #------------------------------------------------------------------------------
  22. #  ゲーム中のすべてのウィンドウのスーパークラスです。
  23. #==============================================================================

  24. class Window_Base < Window
  25.   #--------------------------------------------------------------------------
  26.   # ● HP ゲージの描画
  27.   #--------------------------------------------------------------------------
  28.   # オリジナルのHP描画を draw_actor_hp_original と名前変更
  29.   alias :draw_actor_hp_original :draw_actor_hp
  30.   def draw_actor_hp(actor, x, y, width = 144)
  31.     # 変数rateに 現在のHP/MHPを代入
  32.     if actor.maxhp != 0
  33.       rate = actor.hp.to_f / actor.maxhp
  34.     else
  35.       rate = 0
  36.     end
  37.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  38.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  39.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  40.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  41.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  42.     plus_x = 0
  43.     rate_x = 0
  44.     plus_y = 25
  45.     plus_width = 0
  46.     rate_width = 100
  47.     height = 10
  48.     align1 = 1
  49.     align2 = 2
  50.     align3 = 0
  51.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  52.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  53.     grade1 = 1
  54.     grade2 = 0
  55.     # 色設定。color1:外枠,color2:中枠
  56.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  57.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  58.     color1 = Color.new(0, 0, 0, 192)
  59.     color2 = Color.new(255, 255, 192, 192)
  60.     color3 = Color.new(0, 0, 0, 192)
  61.     color4 = Color.new(64, 0, 0, 192)
  62.     color5 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  63.     color6 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  64.     # 変数spに描画するゲージの幅を代入
  65.     if actor.maxhp != 0
  66.       hp = (width + plus_width) * actor.hp * rate_width / 100 / actor.maxhp
  67.     else
  68.       hp = 0
  69.     end
  70.     # ゲージの描画
  71.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  72.                 width, plus_width + width * rate_width / 100,
  73.                 height, hp, align1, align2, align3,
  74.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  75.     # オリジナルのHP描画処理を呼び出し
  76.     draw_actor_hp_original(actor, x, y, width)
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● SP ゲージの描画
  80.   #--------------------------------------------------------------------------
  81.   # オリジナルのSP描画を draw_actor_sp_original と名前変更
  82.   alias :draw_actor_sp_original :draw_actor_sp
  83.   def draw_actor_sp(actor, x, y, width = 144)
  84.     # 変数rateに 現在のSP/MSPを代入
  85.     if actor.maxsp != 0
  86.       rate = actor.sp.to_f / actor.maxsp
  87.     else
  88.       rate = 1
  89.     end
  90.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  91.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  92.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  93.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  94.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  95.     plus_x = 0
  96.     rate_x = 0
  97.     plus_y = 25
  98.     plus_width = 0
  99.     rate_width = 100
  100.     height = 10
  101.     align1 = 1
  102.     align2 = 2
  103.     align3 = 0
  104.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  105.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  106.     grade1 = 1
  107.     grade2 = 0
  108.     # 色設定。color1:外枠,color2:中枠
  109.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  110.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  111.     color1 = Color.new(0, 0, 0, 192)
  112.     color2 = Color.new(255, 255, 192, 192)
  113.     color3 = Color.new(0, 0, 0, 192)
  114.     color4 = Color.new(0, 64, 0, 192)
  115.     color5 = Color.new(14 * rate, 80 - 24 * rate, 80 * rate, 192)
  116.     color6 = Color.new(62 * rate, 240 - 72 * rate, 240 * rate, 192)
  117.     # 変数spに描画するゲージの幅を代入
  118.     if actor.maxsp != 0
  119.       sp = (width + plus_width) * actor.sp * rate_width / 100 / actor.maxsp
  120.     else
  121.       sp = (width + plus_width) * rate_width / 100
  122.     end
  123.     # ゲージの描画
  124.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  125.                 width, plus_width + width * rate_width / 100,
  126.                 height, sp, align1, align2, align3,
  127.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  128.     # オリジナルのSP描画処理を呼び出し
  129.     draw_actor_sp_original(actor, x, y, width)
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # ● EXP ゲージの描画
  133.   #--------------------------------------------------------------------------
  134.   # オリジナルのEXP描画を draw_actor_sp_original と名前変更
  135.   alias :draw_actor_exp_original :draw_actor_exp
  136.   def draw_actor_exp(actor, x, y, width = 204)
  137.     # 変数rateに 現在のexp/nextexpを代入
  138.     if actor.next_exp != 0
  139.       rate = actor.now_exp.to_f / actor.next_exp
  140.     else
  141.       rate = 1
  142.     end
  143.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  144.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  145.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  146.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  147.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  148.     plus_x = 0
  149.     rate_x = 0
  150.     plus_y = 25
  151.     plus_width = 0
  152.     rate_width = 100
  153.     height = 10
  154.     align1 = 1
  155.     align2 = 2
  156.     align3 = 0
  157.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  158.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  159.     grade1 = 1
  160.     grade2 = 0
  161.     # 色設定。color1:外枠,color2:中枠
  162.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  163.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  164.     color1 = Color.new(0, 0, 0, 192)
  165.     color2 = Color.new(255, 255, 192, 192)
  166.     color3 = Color.new(0, 0, 0, 192)
  167.     color4 = Color.new(64, 0, 0, 192)
  168.     color5 = Color.new(80 * rate, 80 - 80 * rate ** 2, 80 - 80 * rate, 192)
  169.     color6 = Color.new(240 * rate, 240 - 240 * rate ** 2, 240 - 240 * rate, 192)
  170.     # 変数expに描画するゲージの幅を代入
  171.     if actor.next_exp != 0
  172.       exp = (width + plus_width) * actor.now_exp * rate_width /
  173.                                                           100 / actor.next_exp
  174.     else
  175.       exp = (width + plus_width) * rate_width / 100
  176.     end
  177.     # ゲージの描画
  178.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  179.                 width, plus_width + width * rate_width / 100,
  180.                 height, exp, align1, align2, align3,
  181.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  182.     # オリジナルのEXP描画処理を呼び出し
  183.     draw_actor_exp_original(actor, x, y)
  184.   end
  185.   #--------------------------------------------------------------------------
  186.   # ● EXP_STATE描画
  187.   #--------------------------------------------------------------------------
  188.   def draw_actor_exp_state(actor, x, y,width = 204)
  189.     #——不好意思,偷懒一个~呵呵~~
  190.     if actor.next_exp != 0
  191.       rate = actor.now_exp.to_f / actor.next_exp
  192.     else
  193.       rate = 1
  194.     end
  195.     plus_x = 0
  196.     rate_x = 0
  197.     plus_y = 25
  198.     plus_width = 0
  199.     rate_width = 100
  200.     height = 10
  201.     align1 = 1
  202.     align2 = 2
  203.     align3 = 0
  204.     grade1 = 1
  205.     grade2 = 0
  206.     color1 = Color.new(0, 0, 0, 192)
  207.     color2 = Color.new(255, 255, 192, 192)
  208.     color3 = Color.new(0, 0, 0, 192)
  209.     color4 = Color.new(64, 0, 0, 192)
  210.     color5 = Color.new(80 * rate, 80 - 80 * rate ** 2, 80 - 80 * rate, 192)
  211.     color6 = Color.new(240 * rate, 240 - 240 * rate ** 2, 240 - 240 * rate, 192)
  212.     if actor.next_exp != 0
  213.       exp = (width + plus_width) * actor.now_exp * rate_width /
  214.                                                           100 / actor.next_exp
  215.     else
  216.       exp = (width + plus_width) * rate_width / 100
  217.     end
  218.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  219.                 width, plus_width + width * rate_width / 100,
  220.                 height, exp, align1, align2, align3,
  221.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  222.     self.contents.font.color = system_color
  223.     self.contents.draw_text(x, y, 64, 32, "当前经历")
  224.     self.contents.font.color = normal_color
  225.     self.contents.draw_text(x + 6, y, 84, 32, actor.now_exp.to_s, 2)
  226.     self.contents.draw_text(x + 90, y, 12, 32, "/", 1)
  227.     self.contents.draw_text(x + 102, y, 84, 32, actor.next_exp.to_s)
  228.   end
  229.   #--------------------------------------------------------------------------
  230.   # ● parameter_state描画
  231.   #--------------------------------------------------------------------------
  232.   def draw_actor_parameter_state(actor, x, y, type)
  233.     case type
  234.     when 0
  235.       parameter_name = $data_system.words.atk
  236.       parameter_value = actor.atk
  237.     when 1
  238.       parameter_name = $data_system.words.pdef
  239.       parameter_value = actor.pdef
  240.     when 2
  241.       parameter_name = $data_system.words.mdef
  242.       parameter_value = actor.mdef
  243.     when 3
  244.       parameter_name = $data_system.words.str
  245.       parameter_value = actor.str
  246.     when 4
  247.       parameter_name = $data_system.words.dex
  248.       parameter_value = actor.dex
  249.     when 5
  250.       parameter_name = $data_system.words.agi
  251.       parameter_value = actor.agi
  252.     when 6
  253.       parameter_name = $data_system.words.int
  254.       parameter_value = actor.int
  255.     end
  256.     self.contents.font.color = system_color
  257.     self.contents.draw_text(x, y, 120, 32, parameter_name)
  258.     self.contents.font.color = normal_color
  259.     self.contents.draw_text(x + 80, y, 36, 32, parameter_value.to_s, 2)
  260.   end
  261.   #--------------------------------------------------------------------------
  262.   # ● ゲージの描画
  263.   #--------------------------------------------------------------------------
  264.   def gauge_rect(x, y, rect_width, width, height, gauge, align1, align2, align3,
  265.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  266.     case align1
  267.     when 1
  268.       x += (rect_width - width) / 2
  269.     when 2
  270.       x += rect_width - width
  271.     end
  272.     case align2
  273.     when 1
  274.       y -= height / 2
  275.     when 2
  276.       y -= height
  277.     end
  278.     # 枠描画
  279.     self.contents.fill_rect(x, y, width, height, color1)
  280.     self.contents.fill_rect(x + 1, y + 1, width - 2, height - 2, color2)
  281.     if align3 == 0
  282.       if grade1 == 2
  283.         grade1 = 3
  284.       end
  285.       if grade2 == 2
  286.         grade2 = 3
  287.       end
  288.     end
  289.     if (align3 == 1 and grade1 == 0) or grade1 > 0
  290.       color = color3
  291.       color3 = color4
  292.       color4 = color
  293.     end
  294.     if (align3 == 1 and grade2 == 0) or grade2 > 0
  295.       color = color5
  296.       color5 = color6
  297.       color6 = color
  298.     end
  299.     # 空ゲージの描画
  300.     self.contents.gradation_rect(x + 2, y + 2, width - 4, height - 4,
  301.                                   color3, color4, grade1)
  302.     if align3 == 1
  303.       x += width - gauge
  304.     end
  305.     # 実ゲージの描画
  306.     self.contents.gradation_rect(x + 2, y + 2, gauge - 4, height - 4,
  307.                                   color5, color6, grade2)
  308.   end
  309. end

  310. #------------------------------------------------------------------------------
  311. #  Bitmapクラスに新たな機能を追加します。
  312. #==============================================================================

  313. class Bitmap
  314.   #--------------------------------------------------------------------------
  315.   # ● 矩形をグラデーション表示
  316.   #     color1 : スタートカラー
  317.   #     color2 : エンドカラー
  318.   #     align  :  0:横にグラデーション
  319.   #               1:縦にグラデーション
  320.   #               2:斜めにグラデーション(激重につき注意)
  321.   #--------------------------------------------------------------------------
  322.   def gradation_rect(x, y, width, height, color1, color2, align = 0)
  323.     if align == 0
  324.       for i in x...x + width
  325.         red   = color1.red + (color2.red - color1.red) * (i - x) / (width - 1)
  326.         green = color1.green +
  327.                 (color2.green - color1.green) * (i - x) / (width - 1)
  328.         blue  = color1.blue +
  329.                 (color2.blue - color1.blue) * (i - x) / (width - 1)
  330.         alpha = color1.alpha +
  331.                 (color2.alpha - color1.alpha) * (i - x) / (width - 1)
  332.         color = Color.new(red, green, blue, alpha)
  333.         fill_rect(i, y, 1, height, color)
  334.       end
  335.     elsif align == 1
  336.       for i in y...y + height
  337.         red   = color1.red +
  338.                 (color2.red - color1.red) * (i - y) / (height - 1)
  339.         green = color1.green +
  340.                 (color2.green - color1.green) * (i - y) / (height - 1)
  341.         blue  = color1.blue +
  342.                 (color2.blue - color1.blue) * (i - y) / (height - 1)
  343.         alpha = color1.alpha +
  344.                 (color2.alpha - color1.alpha) * (i - y) / (height - 1)
  345.         color = Color.new(red, green, blue, alpha)
  346.         fill_rect(x, i, width, 1, color)
  347.       end
  348.     elsif align == 2
  349.       for i in x...x + width
  350.         for j in y...y + height
  351.           red   = color1.red + (color2.red - color1.red) *
  352.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  353.           green = color1.green + (color2.green - color1.green) *
  354.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  355.           blue  = color1.blue + (color2.blue - color1.blue) *
  356.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  357.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  358.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  359.           color = Color.new(red, green, blue, alpha)
  360.           set_pixel(i, j, color)
  361.         end
  362.       end
  363.     elsif align == 3
  364.       for i in x...x + width
  365.         for j in y...y + height
  366.           red   = color1.red + (color2.red - color1.red) *
  367.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  368.           green = color1.green + (color2.green - color1.green) *
  369.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  370.           blue  = color1.blue + (color2.blue - color1.blue) *
  371.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  372.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  373.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  374.           color = Color.new(red, green, blue, alpha)
  375.           set_pixel(i, j, color)
  376.         end
  377.       end
  378.     end
  379.   end
  380. end

  381. #==============================================================================
  382. # ■ Spriteモジュール
  383. #------------------------------------------------------------------------------
  384. #  アニメーションの管理を行うモジュールです。
  385. #==============================================================================

  386. module RPG
  387.   class Sprite < ::Sprite
  388.     def damage(value, critical)
  389.       dispose_damage
  390.       if value.is_a?(Numeric)
  391.         damage_string = value.abs.to_s
  392.       else
  393.         damage_string = value.to_s
  394.       end
  395.       bitmap = Bitmap.new(160, 48)
  396.       bitmap.font.name = "Arial Black"
  397.       bitmap.font.size = 32
  398.       bitmap.font.color.set(0, 0, 0)
  399.       bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  400.       bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  401.       bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  402.       bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  403.       if value.is_a?(Numeric) and value < 0
  404.         bitmap.font.color.set(176, 255, 144)
  405.       else
  406.         bitmap.font.color.set(255, 255, 255)
  407.       end
  408.       bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  409.       if critical
  410.         bitmap.font.size = 20
  411.         bitmap.font.color.set(0, 0, 0)
  412.         bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
  413.         bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
  414.         bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
  415.         bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
  416.         bitmap.font.color.set(255, 255, 255)
  417.         bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
  418.       end
  419.       @_damage_sprite = ::Sprite.new
  420.       @_damage_sprite.bitmap = bitmap
  421.       @_damage_sprite.ox = 80 + self.viewport.ox
  422.       @_damage_sprite.oy = 20 + self.viewport.oy
  423.       @_damage_sprite.x = self.x + self.viewport.rect.x
  424.       @_damage_sprite.y = self.y - self.oy / 2 + self.viewport.rect.y
  425.       @_damage_sprite.z = 3000
  426.       @_damage_duration = 40
  427.     end
  428.     def animation(animation, hit)
  429.       dispose_animation
  430.       @_animation = animation
  431.       return if @_animation == nil
  432.       @_animation_hit = hit
  433.       @_animation_duration = @_animation.frame_max
  434.       animation_name = @_animation.animation_name
  435.       animation_hue = @_animation.animation_hue
  436.       bitmap = RPG::Cache.animation(animation_name, animation_hue)
  437.       if @@_reference_count.include?(bitmap)
  438.         @@_reference_count[bitmap] += 1
  439.       else
  440.         @@_reference_count[bitmap] = 1
  441.       end
  442.       @_animation_sprites = []
  443.       if @_animation.position != 3 or not @@_animations.include?(animation)
  444.         for i in 0..15
  445.           sprite = ::Sprite.new
  446.           sprite.bitmap = bitmap
  447.           sprite.visible = false
  448.           @_animation_sprites.push(sprite)
  449.         end
  450.         unless @@_animations.include?(animation)
  451.           @@_animations.push(animation)
  452.         end
  453.       end
  454.       update_animation
  455.     end
  456.     def loop_animation(animation)
  457.       return if animation == @_loop_animation
  458.       dispose_loop_animation
  459.       @_loop_animation = animation
  460.       return if @_loop_animation == nil
  461.       @_loop_animation_index = 0
  462.       animation_name = @_loop_animation.animation_name
  463.       animation_hue = @_loop_animation.animation_hue
  464.       bitmap = RPG::Cache.animation(animation_name, animation_hue)
  465.       if @@_reference_count.include?(bitmap)
  466.         @@_reference_count[bitmap] += 1
  467.       else
  468.         @@_reference_count[bitmap] = 1
  469.       end
  470.       @_loop_animation_sprites = []
  471.       for i in 0..15
  472.         sprite = ::Sprite.new
  473.         sprite.bitmap = bitmap
  474.         sprite.visible = false
  475.         @_loop_animation_sprites.push(sprite)
  476.       end
  477.       update_loop_animation
  478.     end
  479.     def animation_set_sprites(sprites, cell_data, position)
  480.       for i in 0..15
  481.         sprite = sprites[i]
  482.         pattern = cell_data[i, 0]
  483.         if sprite == nil or pattern == nil or pattern == -1
  484.           sprite.visible = false if sprite != nil
  485.           next
  486.         end
  487.         sprite.visible = true
  488.         sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
  489.         if position == 3
  490.           if self.viewport != nil
  491.             sprite.x = self.viewport.rect.width / 2
  492.             sprite.y = self.viewport.rect.height - 160
  493.           else
  494.             sprite.x = 320
  495.             sprite.y = 240
  496.           end
  497.         else
  498.           sprite.x = self.x + self.viewport.rect.x -
  499.                       self.ox + self.src_rect.width / 2
  500.           sprite.y = self.y + self.viewport.rect.y -
  501.                       self.oy + self.src_rect.height / 2
  502.           sprite.y -= self.src_rect.height / 4 if position == 0
  503.           sprite.y += self.src_rect.height / 4 if position == 2
  504.         end
  505.         sprite.x += cell_data[i, 1]
  506.         sprite.y += cell_data[i, 2]
  507.         sprite.z = 2999
  508.         sprite.ox = 96
  509.         sprite.oy = 96
  510.         sprite.zoom_x = cell_data[i, 3] / 100.0
  511.         sprite.zoom_y = cell_data[i, 3] / 100.0
  512.         sprite.angle = cell_data[i, 4]
  513.         sprite.mirror = (cell_data[i, 5] == 1)
  514.         sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  515.         sprite.blend_type = cell_data[i, 7]
  516.       end
  517.     end
  518.   end
  519. end
复制代码
RTAB脚本太长了……
我暂时没有这样的脚本能力
作者: liuzhen8246    时间: 2009-8-24 10:03
只是部分冲突而已。
作者: 柳飛鷹    时间: 2009-8-24 10:10
LS又理解错误了……
不是冲突问题~是美化问题
怎么每个人都认为是冲突问题
作者: 风中承诺    时间: 2009-8-24 11:49
你可以使用自定血条……
#==============================================================================
# ■ Window_BattleStatus
#------------------------------------------------------------------------------
#  显示战斗画面同伴状态的窗口。
#==============================================================================

class Window_BattleStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, 320, 640, 160)
    self.contents = Bitmap.new(width - 32, height - 32)
    @level_up_flags = [false, false, false, false]
    #........................................................................
    self.opacity = 0
    @sta_back = []
    @sta_output = []
    @cp_output = []
    @hp_bitmap = RPG::Cache.picture("../system/battle/hmcp/hp_bar.png")
    @mp_bitmap = RPG::Cache.picture("../system/battle/hmcp/mp_bar.png")
    @cp_bitmap = RPG::Cache.picture("../system/battle/hmcp/cp_bar.png")
    @cp_output = []
    @cp_back_bar = Sprite.new
    @cp_back_bar.bitmap = Bitmap.new("Graphics/system/battle/hmcp/cp_back_bar")
    @cp_back_bar.x = 450
    @cp_back_bar.y = 25
    @cp_back_bar.z = self.z + 1
    @actor_cp_sprite = []
    @actor_cp_sprite_back = []
    for actor in $game_party.actors
      @actor_cp_sprite[actor.index] = Sprite.new
      @actor_cp_sprite[actor.index].bitmap = Bitmap.new("Graphics/system/battle/hmcp/sprite/" + actor.name)
      @actor_cp_sprite[actor.index].x = 450
      @actor_cp_sprite[actor.index].y = 25 - 20
      @actor_cp_sprite[actor.index].z = 102
      @actor_cp_sprite_back[actor.index] = Sprite.new
      @actor_cp_sprite_back[actor.index].bitmap = Bitmap.new("Graphics/system/battle/hmcp/cp_sprite")
      @actor_cp_sprite_back[actor.index].x = 450
      @actor_cp_sprite_back[actor.index].y = 25
      @actor_cp_sprite_back[actor.index].z = 102
    end
    for actor_index in 1..$game_party.actors.size
      @cp_output[actor_index] = Sprite.new
      @cp_output[actor_index].bitmap = Bitmap.new(156, 78)
      @cp_output[actor_index].x = 0 + (actor_index - 1) * 156
      @cp_output[actor_index].y = 468 - 78 - 10
      @cp_output[actor_index].z = self.z + 2
      @cp_output[actor_index].bitmap.clear
      @sta_back[actor_index] = Sprite.new
      @sta_back[actor_index].bitmap = Bitmap.new("Graphics/System/Battle/sta_back/" + $game_party.actors[actor_index - 1].name + "_sta.png")
      @sta_back[actor_index].x = 6 + (actor_index - 1) * 156
      @sta_back[actor_index].y = 444 - 78 - 10
      @sta_back[actor_index].z = self.z + 1
      @sta_output[actor_index] = Sprite.new
      @sta_output[actor_index].bitmap = Bitmap.new(156, 78)
      @sta_output[actor_index].x = 6 + (actor_index - 1) * 156
      @sta_output[actor_index].y = 444 - 78 - 10
      @sta_output[actor_index].z = self.z + 2
      @sta_output[actor_index].bitmap.clear
      @sta_output[actor_index].bitmap.font.size = 10
      @sta_output[actor_index].bitmap.font.name = "黑体"
      hp_width = $game_party.actors[actor_index - 1].hp * @hp_bitmap.width/$game_party.actors[actor_index - 1].maxhp
      hp_rect = Rect.new(0, 0, hp_width, 3)
      mp_width = $game_party.actors[actor_index - 1].sp * @mp_bitmap.width/$game_party.actors[actor_index - 1].maxsp
      mp_rect = Rect.new(0, 0, mp_width, 3)
      @sta_output[actor_index].bitmap.blt(71, 36, @hp_bitmap, hp_rect)
      @sta_output[actor_index].bitmap.blt(71, 56, @mp_bitmap, mp_rect)
      @sta_output[actor_index].bitmap.font.color.set(255, 0, 0)
      @sta_output[actor_index].bitmap.draw_text(100, 25, 78, 11,$game_party.actors[actor_index - 1].hp.to_s + "/" + $game_party.actors[actor_index - 1].maxhp.to_s)
      @sta_output[actor_index].bitmap.font.color.set(0, 0, 255)
      @sta_output[actor_index].bitmap.draw_text(100, 45, 78, 11,$game_party.actors[actor_index - 1].sp.to_s + "/" + $game_party.actors[actor_index - 1].maxsp.to_s)
    end
    #........................................................................
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    super
    @hp_bitmap.bitmap.dispose
    @hp_bitmap.dispose
    @mp_bitmap.bitmap.dispose
    @mp_bitmap.dispose
    @cp_bitmap.bitmap.dispose
    @cp_bitmap.dispose
    for actor_index in 1..$game_party.actors.size
      @sta_back[actor_index].bitmap.dispose
      @sta_back[actor_index].dispose
      @sta_output[actor_index].bitmap.dispose
      @sta_output[actor_index].dispose
      @cp_output[actor_index].bitmap.dispose
      @cp_output[actor_index].dispose
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置升级标志
  #     actor_index : 角色索引
  #--------------------------------------------------------------------------
  def level_up(actor_index)
    @level_up_flags[actor_index] = true
  end
  #......................................................................
  #--------------------------------------------------------------------------
  # ● 设置正在攻击标志
  #     actor_index : 角色索引
  #--------------------------------------------------------------------------
  def in_atk(actor_index)
    @sta_back[actor_index + 1].bitmap = Bitmap.new("Graphics/System/Battle/sta_back/" + $game_party.actors[actor_index].name + "_sta_atk.png")
  end
  #--------------------------------------------------------------------------
  # ● 设置不在攻击标志
  #     actor_index : 角色索引
  #--------------------------------------------------------------------------
  def out_atk(actor_index)
    @sta_back[actor_index + 1].bitmap = Bitmap.new("Graphics/System/Battle/sta_back/" + $game_party.actors[actor_index].name + "_sta.png")
  end
  #......................................................................
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @item_max = $game_party.actors.size
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      #......................................................................
      actor_x = i * 160 + 4
      @sta_output[i + 1].bitmap.clear
      hp_width = $game_party.actors[i].hp * @hp_bitmap.width/$game_party.actors[i].maxhp
      hp_rect = Rect.new(0, 0, hp_width, 3)
      mp_width = $game_party.actors[i].sp * @mp_bitmap.width/$game_party.actors[i].maxsp
      mp_rect = Rect.new(0, 0, mp_width, 3)
      @sta_output[i + 1].bitmap.blt(71, 36, @hp_bitmap, hp_rect)
      @sta_output[i + 1].bitmap.blt(71, 56, @mp_bitmap, mp_rect)
      @sta_output[i + 1].bitmap.font.color.set(255, 0, 0)
      @sta_output[i + 1].bitmap.draw_text(100, 25, 77, 11,$game_party.actors[i].hp.to_s + "/" + $game_party.actors[i].maxhp.to_s)
      @sta_output[i + 1].bitmap.font.color.set(0, 0, 255)
      @sta_output[i + 1].bitmap.draw_text(100, 45, 77, 11,$game_party.actors[i].sp.to_s + "/" + $game_party.actors[i].maxsp.to_s)
      #......................................................................
      if @level_up_flags[i]
        self.contents.font.color = Color.new(255, 0, 0)
        self.contents.draw_text(actor_x, 96, 120, 32, "阅历增加!")
      else
        draw_actor_state(actor, actor_x, 96)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 主界面的不透明度下降
    if $game_temp.battle_main_phase
      self.contents_opacity -= 4 if self.contents_opacity > 1
    else
      self.contents_opacity += 4 if self.contents_opacity < 255
    end
  end
end
如果不需要CP,把有关的注释掉。
作者: well    时间: 2009-8-25 03:56
虽然长,可是每部分做什么用不是写得非常清楚吗?
29~135行,HP、SP部位加上血槽气槽
266~314行 血槽描绘方法
320~387行 渐变的描绘方法
这三块摘出来,插在main前。应该就可以了
作者: fofolee    时间: 2009-8-25 10:59
我同意LSS的,你可以自已画一个血槽,什么样式都随你啦,用自定义的血槽的方法很简单,Window_Base里定义一下def draw_picture_hp(actor, x, y)
    bitmap=Bitmap.new("Graphics/System/Battle_status/精")#这里就是你血槽图片啦,什么样式随你
    cw =   bitmap.width * actor.hp / actor.maxhp  
    ch = bitmap.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x - bitmap.width/20, y - bitmap.height, bitmap, src_rect)
    self.contents.font.size = 15
    self.contents.draw_text(x-50, y-25, 48, 32, actor.hp.to_s,2)
  end
恩,这只是一个会随血量减少的血槽,当然还要一个空穴槽做底图,方法是一样的
还有,偶不太清楚RATB是咋样的,是不是和主站上清爽血条一样的样式,如果是的话,COPY脚本来
carol3_draw_hp_bar(actor, 284, 0)
carol3_draw_sp_bar(actor, 460, 0)改成draw_actor_hp(actor, 284, 0)
和draw_actor_sp(actor, 284, 0)
下面 def carol3_draw_hp_bar(actor, x, y, width = 128) #宽度可调
其实就是定义了血槽样式
作者: 柳飛鷹    时间: 2009-8-25 13:03
本帖最后由 柳飛鷹 于 2009-8-25 13:11 编辑

谢谢楼上!
问题已解决 谢谢各位




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