设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2653|回复: 12
打印 上一主题 下一主题

[已经过期] 如何在游戏中再定义一个血条

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
跳转到指定楼层
1
发表于 2016-5-19 08:58:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 452234679 于 2016-5-19 23:24 编辑

游戏内置的生命(HP)、魔法(SP),我想再定义一个体力(现在的想法是用一个变量代替它),但是如何在状态页面也能显示,像HP和SP那样都有一个血条?

附:状态页面血条美化脚本
RUBY 代码复制
  1. #===============================================================
  2. # ■ Game_Actor
  3. #--------------------------------------------------------
  4. #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
  5. # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
  6. #==============================================================
  7.  
  8. class Game_Actor < Game_Battler
  9.   def now_exp
  10.     return @exp - @exp_list[@level]
  11.   end
  12.   def next_exp
  13.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  14.   end
  15. end
  16.  
  17. #==========================================================
  18. # ■ Window_Base
  19. #------------------------------------------------------------
  20. #  ゲーム中のすべてのウィンドウのスーパークラスです。
  21. #============================================================
  22.  
  23. class Window_Base < Window
  24.   #--------------------------------------------------------
  25.   # ● HP ゲージの描画
  26.   #--------------------------------------------------
  27.   # オリジナルのHP描画を draw_actor_hp_original と名前変更
  28.   alias :draw_actor_hp_original :draw_actor_hp
  29.   def draw_actor_hp(actor, x, y, width = 144)
  30.     # 変数rateに 現在のHP/MHPを代入
  31.     if actor.maxhp != 0
  32.       rate = actor.hp.to_f / actor.maxhp
  33.     else
  34.       rate = 0
  35.     end
  36.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  37.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  38.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  39.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  40.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  41.     plus_x = 0
  42.     rate_x = 0
  43.     plus_y = 25
  44.     plus_width = 0
  45.     rate_width = 100
  46.     height = 10
  47.     align1 = 1
  48.     align2 = 2
  49.     align3 = 0
  50.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  51.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  52.     grade1 = 1
  53.     grade2 = 0
  54.     # 色設定。color1:外枠,color2:中枠
  55.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  56.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  57.     color1 = Color.new(0, 0, 0, 192)
  58.     color2 = Color.new(255, 255, 192, 192)
  59.     color3 = Color.new(0, 0, 0, 192)
  60.     color4 = Color.new(64, 0, 0, 192)
  61.     color5 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  62.     color6 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  63.     # 変数spに描画するゲージの幅を代入
  64.     if actor.maxhp != 0
  65.       hp = (width + plus_width) * actor.hp * rate_width / 100 / actor.maxhp
  66.     else
  67.       hp = 0
  68.     end
  69.     # ゲージの描画
  70.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  71.                 width, plus_width + width * rate_width / 100,
  72.                 height, hp, align1, align2, align3,
  73.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  74.     # オリジナルのHP描画処理を呼び出し
  75.     draw_actor_hp_original(actor, x, y, width)
  76.   end
  77.   #--------------------------------------------------------------
  78.   # ● SP ゲージの描画
  79.   #------------------------------------------------------------
  80.   # オリジナルのSP描画を draw_actor_sp_original と名前変更
  81.   alias :draw_actor_sp_original :draw_actor_sp
  82.   def draw_actor_sp(actor, x, y, width = 144)
  83.     # 変数rateに 現在のSP/MSPを代入
  84.     if actor.maxsp != 0
  85.       rate = actor.sp.to_f / actor.maxsp
  86.     else
  87.       rate = 1
  88.     end
  89.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  90.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  91.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  92.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  93.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  94.     plus_x = 0
  95.     rate_x = 0
  96.     plus_y = 25
  97.     plus_width = 0
  98.     rate_width = 100
  99.     height = 10
  100.     align1 = 1
  101.     align2 = 2
  102.     align3 = 0
  103.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  104.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  105.     grade1 = 1
  106.     grade2 = 0
  107.     # 色設定。color1:外枠,color2:中枠
  108.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  109.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  110.     color1 = Color.new(0, 0, 0, 192)
  111.     color2 = Color.new(255, 255, 192, 192)
  112.     color3 = Color.new(0, 0, 0, 192)
  113.     color4 = Color.new(0, 64, 0, 192)
  114.     color5 = Color.new(14 * rate, 80 - 24 * rate, 80 * rate, 192)
  115.     color6 = Color.new(62 * rate, 240 - 72 * rate, 240 * rate, 192)
  116.     # 変数spに描画するゲージの幅を代入
  117.     if actor.maxsp != 0
  118.       sp = (width + plus_width) * actor.sp * rate_width / 100 / actor.maxsp
  119.     else
  120.       sp = (width + plus_width) * rate_width / 100
  121.     end
  122.     # ゲージの描画
  123.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  124.                 width, plus_width + width * rate_width / 100,
  125.                 height, sp, align1, align2, align3,
  126.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  127.     # オリジナルのSP描画処理を呼び出し
  128.     draw_actor_sp_original(actor, x, y, width)
  129.   end
  130.   #--------------------------------------------------------
  131.   # ● EXP ゲージの描画
  132.   #----------------------------------------------------------
  133.   # オリジナルのEXP描画を draw_actor_sp_original と名前変更
  134.   alias :draw_actor_exp_original :draw_actor_exp
  135.   def draw_actor_exp(actor, x, y, width = 204)
  136.     # 変数rateに 現在のexp/nextexpを代入
  137.     if actor.next_exp != 0
  138.       rate = actor.now_exp.to_f / actor.next_exp
  139.     else
  140.       rate = 1
  141.     end
  142.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  143.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  144.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  145.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  146.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  147.     plus_x = 0
  148.     rate_x = 0
  149.     plus_y = 25
  150.     plus_width = 0
  151.     rate_width = 100
  152.     height = 10
  153.     align1 = 1
  154.     align2 = 2
  155.     align3 = 0
  156.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  157.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  158.     grade1 = 1
  159.     grade2 = 0
  160.     # 色設定。color1:外枠,color2:中枠
  161.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  162.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  163.     color1 = Color.new(0, 0, 0, 192)
  164.     color2 = Color.new(255, 255, 192, 192)
  165.     color3 = Color.new(0, 0, 0, 192)
  166.     color4 = Color.new(64, 0, 0, 192)
  167.     color5 = Color.new(80 * rate, 80 - 80 * rate ** 2, 80 - 80 * rate, 192)
  168.     color6 = Color.new(240 * rate, 240 - 240 * rate ** 2, 240 - 240 * rate, 192)
  169.     # 変数expに描画するゲージの幅を代入
  170.     if actor.next_exp != 0
  171.       exp = (width + plus_width) * actor.now_exp * rate_width /
  172.                                                           100 / actor.next_exp
  173.     else
  174.       exp = (width + plus_width) * rate_width / 100
  175.     end
  176.     # ゲージの描画
  177.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  178.                 width, plus_width + width * rate_width / 100,
  179.                 height, exp, align1, align2, align3,
  180.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  181.     # オリジナルのEXP描画処理を呼び出し
  182.     draw_actor_exp_original(actor, x, y)
  183.   end
  184.   #---------------------------------------------------------
  185.   # ● ゲージの描画
  186.   #-----------------------------------------------------
  187.   def gauge_rect(x, y, rect_width, width, height, gauge, align1, align2, align3,
  188.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  189.     case align1
  190.     when 1
  191.       x += (rect_width - width) / 2
  192.     when 2
  193.       x += rect_width - width
  194.     end
  195.     case align2
  196.     when 1
  197.       y -= height / 2
  198.     when 2
  199.       y -= height
  200.     end
  201.     # 枠描画
  202.     self.contents.fill_rect(x, y, width, height, color1)
  203.     self.contents.fill_rect(x + 1, y + 1, width - 2, height - 2, color2)
  204.     if align3 == 0
  205.       if grade1 == 2
  206.         grade1 = 3
  207.       end
  208.       if grade2 == 2
  209.         grade2 = 3
  210.       end
  211.     end
  212.     if (align3 == 1 and grade1 == 0) or grade1 > 0
  213.       color = color3
  214.       color3 = color4
  215.       color4 = color
  216.     end
  217.     if (align3 == 1 and grade2 == 0) or grade2 > 0
  218.       color = color5
  219.       color5 = color6
  220.       color6 = color
  221.     end
  222.     # 空ゲージの描画
  223.     self.contents.gradation_rect(x + 2, y + 2, width - 4, height - 4,
  224.                                   color3, color4, grade1)
  225.     if align3 == 1
  226.       x += width - gauge
  227.     end
  228.     # 実ゲージの描画
  229.     self.contents.gradation_rect(x + 2, y + 2, gauge - 4, height - 4,
  230.                                   color5, color6, grade2)
  231.   end
  232. end
  233.  
  234. #--------------------------------------------------------------
  235. #  Bitmapクラスに新たな機能を追加します。
  236. #===================================================================
  237.  
  238. class Bitmap
  239.   #------------------------------------------------------------
  240.   # ● 矩形をグラデーション表示
  241.   #     color1 : スタートカラー
  242.   #     color2 : エンドカラー
  243.   #     align  :  0:横にグラデーション
  244.   #               1:縦にグラデーション
  245.   #               2:斜めにグラデーション(激重につき注意)
  246.   #--------------------------------------------------------
  247.   def gradation_rect(x, y, width, height, color1, color2, align = 0)
  248.     if align == 0
  249.       for i in x...x + width
  250.         red   = color1.red + (color2.red - color1.red) * (i - x) / (width - 1)
  251.         green = color1.green +
  252.                 (color2.green - color1.green) * (i - x) / (width - 1)
  253.         blue  = color1.blue +
  254.                 (color2.blue - color1.blue) * (i - x) / (width - 1)
  255.         alpha = color1.alpha +
  256.                 (color2.alpha - color1.alpha) * (i - x) / (width - 1)
  257.         color = Color.new(red, green, blue, alpha)
  258.         fill_rect(i, y, 1, height, color)
  259.       end
  260.     elsif align == 1
  261.       for i in y...y + height
  262.         red   = color1.red +
  263.                 (color2.red - color1.red) * (i - y) / (height - 1)
  264.         green = color1.green +
  265.                 (color2.green - color1.green) * (i - y) / (height - 1)
  266.         blue  = color1.blue +
  267.                 (color2.blue - color1.blue) * (i - y) / (height - 1)
  268.         alpha = color1.alpha +
  269.                 (color2.alpha - color1.alpha) * (i - y) / (height - 1)
  270.         color = Color.new(red, green, blue, alpha)
  271.         fill_rect(x, i, width, 1, color)
  272.       end
  273.     elsif align == 2
  274.       for i in x...x + width
  275.         for j in y...y + height
  276.           red   = color1.red + (color2.red - color1.red) *
  277.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  278.           green = color1.green + (color2.green - color1.green) *
  279.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  280.           blue  = color1.blue + (color2.blue - color1.blue) *
  281.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  282.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  283.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  284.           color = Color.new(red, green, blue, alpha)
  285.           set_pixel(i, j, color)
  286.         end
  287.       end
  288.     elsif align == 3
  289.       for i in x...x + width
  290.         for j in y...y + height
  291.           red   = color1.red + (color2.red - color1.red) *
  292.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  293.           green = color1.green + (color2.green - color1.green) *
  294.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  295.           blue  = color1.blue + (color2.blue - color1.blue) *
  296.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  297.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  298.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  299.           color = Color.new(red, green, blue, alpha)
  300.           set_pixel(i, j, color)
  301.         end
  302.       end
  303.     end
  304.   end
  305. end

Lv1.梦旅人

梦石
0
星屑
50
在线时间
137 小时
注册时间
2015-10-15
帖子
62
2
发表于 2016-5-19 11:28:24 | 只看该作者
是这样吗?像力量 灵巧那样 还是像hp maxhp那样

GZQQ$ZCJ(H71DWSD$@5S)2G.jpg (209.15 KB, 下载次数: 7)

GZQQ$ZCJ(H71DWSD$@5S)2G.jpg
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
3
 楼主| 发表于 2016-5-19 11:47:55 | 只看该作者
本帖最后由 452234679 于 2016-5-19 12:23 编辑
表情 发表于 2016-5-19 11:28
是这样吗?像力量 灵巧那样 还是像hp maxhp那样


是的,这个我已经实现了。现在还有3个问题:
1、如何定义它的当前值/最大值
2、如何让最大值随着等级而升级
3、如何加一个进度条一样的血槽

点评

ok  发表于 2016-5-19 12:34
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

4
发表于 2016-5-19 13:13:52 | 只看该作者
写个哈希表,角色=》数值,数值里面再写个哈希表,等级=》数值
可以在每新加入个队员的时候给他设定。
最大值就判断等级后面的那个数值就可以了。当前值设个变量存一下。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
137 小时
注册时间
2015-10-15
帖子
62
5
发表于 2016-5-19 13:30:10 | 只看该作者
应该是这样吧

E0`~O44~2U(LX7R_MR0_5WU.jpg (208.89 KB, 下载次数: 4)

E0`~O44~2U(LX7R_MR0_5WU.jpg

T~_LXX]UG@KG29SQ8MS}AQW.jpg (208.2 KB, 下载次数: 6)

T~_LXX]UG@KG29SQ8MS}AQW.jpg
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
6
 楼主| 发表于 2016-5-19 21:19:10 | 只看该作者
yang1zhi 发表于 2016-5-19 13:13
写个哈希表,角色=》数值,数值里面再写个哈希表,等级=》数值
可以在每新加入个队员的时候给他设定。
最大 ...

您好,请问什么是哈希表,有范例脚本吗?

点评

请问写到哪里呢?  发表于 2016-5-19 23:12
哈希表就是。a={1=>10,2=>10,3=>14}  发表于 2016-5-19 21:50
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
7
 楼主| 发表于 2016-5-19 21:20:04 | 只看该作者
表情 发表于 2016-5-19 13:30
应该是这样吧

是的,请问如何实现?主要是如何随着等级变化?

点评

好的,谢谢您  发表于 2016-5-19 23:12
明天给你 现在电脑不在身边  发表于 2016-5-19 21:58
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
137 小时
注册时间
2015-10-15
帖子
62
8
发表于 2016-5-20 12:33:23 | 只看该作者
本帖最后由 表情 于 2016-5-20 12:35 编辑

{:2_249:}{:2_257:}{:2_264:}

QO5OQG~TMSZ2BA20FSA_L(P.jpg (212.86 KB, 下载次数: 4)

QO5OQG~TMSZ2BA20FSA_L(P.jpg

2TJY]}U~~$@A@ZNWSI4~O_X.jpg (211.57 KB, 下载次数: 6)

2TJY]}U~~$@A@ZNWSI4~O_X.jpg
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
105 小时
注册时间
2016-4-3
帖子
78
9
 楼主| 发表于 2016-5-20 12:53:46 | 只看该作者
表情 发表于 2016-5-20 12:33

对的,就是这样的效果,请问血条的颜色也可以自己定义吗?比如定义成红色。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
137 小时
注册时间
2015-10-15
帖子
62
10
发表于 2016-5-20 13:11:17 | 只看该作者
有工程有图片 可以对照看
更多图片 小图 大图
组图打开中,请稍候......

Project1.zip

206.79 KB, 下载次数: 64

点评

好像是actor.目前体力  发表于 2016-5-20 17:08
消耗体力方法看看sp是怎么消耗的 仿造他来写  发表于 2016-5-20 17:07
如何在游戏中消耗体力值,比如与某人对话后,角色i的体力-10,脚本表达式该怎么写, 事件脚本@actor(1).体力 += 10好像不行,求指教  发表于 2016-5-20 15:00
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-13 21:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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