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

Project1

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

[RMVA发布] [简单脚本搭配RUBY语法]金钱的颜色化和格式化

[复制链接]

Lv1.梦旅人

梦石
0
星屑
105
在线时间
297 小时
注册时间
2009-1-7
帖子
216
跳转到指定楼层
1
发表于 2014-1-10 00:22:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 timiesea 于 2014-1-10 00:28 编辑

上上一次我稍微研究了一点ruby的语法,制作了一个可以随机生成敌人数据的例子:http://rpg.blue/thread-344210-1-1.html

上一次我不研究语法,研究了点跟语法无关的内容,制作了一个显示声望窗口的例子:http://rpg.blue/thread-344305-1-1.html

今天,我将语法和跟语法无关的内容进行了一次有机的结合,搞出一个让金钱变颜色,同时按格式进行显示的例子。
以下是效果截图:

不到一千:

几千:

几万:

几十万:

几百万:

几千万:(本例中最高定义99999999)

为什么又要拿金钱开刀呢?因为这个简单,初学者还是要循序渐进。
注:经过我的初步测试,这个脚本没有明显的低效行为,不会拖累游戏,也不会占用过多的内存资源。

开始吧。

一、找到显示金钱窗口的类:Window_Gold。在main前面插入一行,将整个类复制过去,然后只保留以下方法:refresh,其余删除。为什么只保留这1个方法呢?因为剩下的方法如果大家知道什么意思的话就会明白它们是没有用的。

二、原本的refresh方法如下:
RUBY 代码复制
  1. def refresh
  2.     contents.clear
  3.     draw_currency_value(value, currency_unit, 4, 0, contents.width - 8)
  4. end

这两行的意思详细见:http://rpg.blue/thread-344305-1-1.html
在进行显示前,要做2件事:改变格式,不能直接将金钱显示上去;改变颜色。

三、改变颜色。采用新建的方法来改变颜色。我并不建议将这个功能直接写在refresh里,因为会使得refresh变得十分“臃肿”,而且将不同的功能放在不同的方法里有助于今后的维护。在本例中,新建的方法名为:gold_color。这个方法实现功能的思路如下:方法返回一个颜色类(Color,在F1中可以看到,另外,在“[PS0]物品颜色描绘”也可以看到颜色类的定义)。根据金钱数目的不同来返回不同的颜色。之后在refresh中只要使用change_color(gold_color)语句便可以轻松设置颜色了。

  1.首先要获取金钱数目,用一个变量来接收:val = value;
  2.定义一个白色的颜色类,这个可以用来作为方法最终的返回值:color=  Color.new(255, 255, 255);
  3.利用case语句根据金钱的数目来更改颜色。大家可以在F1中查看到case的语法。
  4.将设置好的颜色类返回。
总的来说就是这样:
RUBY 代码复制
  1. def gold_color
  2.     val = value;#获取金钱的数量
  3.     color=  Color.new(255, 255, 255);
  4.     case val#对金钱进行分情况讨论
  5.     when 0..999#当有不到一千的金钱时,白色
  6.       color=  Color.new(255, 255, 255);
  7.     when 1000..9999#当有数千的金钱时,绿色
  8.       color=  Color.new(128, 255, 128);
  9.     when 10000..99999#当有数万的金钱时,蓝色
  10.       color=  Color.new(128, 128, 255);
  11.     when 100000..999999#当有数十万的金钱时,紫色
  12.       color=  Color.new(255, 0, 255);
  13.     when 1000000..9999999#当有数百万的金钱时,红色
  14.       color=  Color.new(255, 128, 128);
  15.     when 10000000..99999999#当有千万的金钱时,橙色
  16.       color= Color.new(255, 128, 0);
  17.     end
  18.     return color
  19. end


四、改变显示的格式。同样新建一个方法来实现这个功能,本例中方法名value_format。是要点如下:每三位要有一个逗号隔开,而且如果出现例如以下情况时,最前面不能出现逗号:100000(此时,1前面不能有逗号)。思路如下:获取金钱并将金钱转化为字符串1,然后求出这个字符串1的长度。再新建一个空的字符串2用来作为返回值。定义一个值为0的临时变量1。用一个while语句来从末尾开始逐个读取字符串1的值并将其插入到字符串2的最前面。每进行一次插入,临时变量1便要加1,如果字符串1中当前读取位的前一位还有数字并且临时变量1已经到达3时就插入一个逗号并且将临时变量1重新设置成0。当跳出while时,还要再一次将字符串1的开头的数字插入到字符串2的最前面,最后将字符串2进行返回。
几个细节要注意:再进行读取时,假设金钱的长度为len,则最后一位为len-1而不是len;while的跳出条件是当读取位数大于0,不能包含0。
知道思路后,再调查一下ruby的语法,就形成了以下脚本:
RUBY 代码复制
  1. def value_format
  2.     val = value;#获取金钱数量
  3.     s = val.to_s;#将金钱转化为字符串
  4.     return_s = "";#用来作为返回值的空字符串
  5.     len = s.length;#求出字符串的长度
  6.     i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
  7.     h = 0;#定义一个辅助计数器,用来判断是否已经三位了
  8.     if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
  9.       return_s = s;
  10.       return return_s;
  11.     end
  12.     while (i > 0)#当计数器为0的时候跳出循环
  13.       return_s.insert(0,s[i]);#将第i个数字进行插入
  14.       h += 1;#辅助计数器自增1
  15.       #如果辅助计数器已经得知计算了三位并且在之前还有数字
  16.       if h == 3 and s[i - 1] != nil
  17.         return_s.insert(0,",");#添加一个逗号
  18.         h = 0;#辅助计数器重新归零
  19.       end
  20.       i -= 1;#计数器减去1
  21.     end
  22.     return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
  23.     return return_s;#返回结果
  24. end


五、接下来我们该修改refresh方法了。在contents.clear之后,我们插入这么一行一句来设置颜色:change_color(gold_color);这句语句的意思是调用gold_color方法,并且将这个方法返回的颜色进行设置,别忘了这个方法刚刚才定义了。接下来是将draw_currency_value(value, currency_unit, 4, 0, contents.width - 8)修改为draw_currency_value(value_format, currency_unit, 4, 0, contents.width - 8)改变的仅仅是第一个参数。在原本的draw_currency_value中,直接将金钱作为参数传入,没有加逗号,修改后变成调用value_format方法并且将方法的返回值传入。

六、一个小细节,在Window_Base的draw_currency_value如下:
RUBY 代码复制
  1. def draw_currency_value(value, unit, x, y, width)
  2.     cx = text_size(unit).width
  3.     change_color(normal_color)
  4.     draw_text(x, y, width - cx - 2, line_height, value, 2)
  5.     change_color(system_color)
  6.     draw_text(x, y, width, line_height, unit, 2)
  7.   end

其中有一行change_color(normal_color)便对金钱又进行了一次设置,必须将这句删去,否则我们刚刚设置的颜色又会被设置回normal_color(白色)了。

七、没有了。

感觉这一次没有上一次讲得详细,不过也将自己的思路与大家进行了分享。我觉得在写脚本时,重要的还是思路,语法很容易懂的。在学脚本时要从一个脚本领悟出什么,然后举一反三。当然了,这一次还是会有脚本,如下:
RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_Gold
  4. #------------------------------------------------------------------------------
  5. #  显示持有金钱的窗口
  6. #==============================================================================
  7.  
  8. class Window_Gold < Window_Base
  9.   #--------------------------------------------------------------------------
  10.   # ● 刷新
  11.   #--------------------------------------------------------------------------
  12.   alias refresh_old refresh;
  13.   def refresh
  14.     contents.clear
  15.     change_color(gold_color);
  16.     draw_currency_value(value_format, currency_unit, 4, 0, contents.width - 8)
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 转换金钱的显示格式
  20.   #--------------------------------------------------------------------------
  21.   def value_format
  22.     val = value;#获取金钱数量
  23.     s = val.to_s;#将金钱转化为字符串
  24.     return_s = "";#用来作为返回值的空字符串
  25.     len = s.length;#求出字符串的长度
  26.     i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
  27.     h = 0;#定义一个辅助计数器,用来判断是否已经三位了
  28.     if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
  29.       return_s = s;
  30.       return return_s;
  31.     end
  32.     while (i > 0)#当计数器为0的时候跳出循环
  33.       return_s.insert(0,s[i]);#将第i个数字进行插入
  34.       h += 1;#辅助计数器自增1
  35.       #如果辅助计数器已经得知计算了三位并且在之前还有数字
  36.       if h == 3 and s[i - 1] != nil
  37.         return_s.insert(0,",");#添加一个逗号
  38.         h = 0;#辅助计数器重新归零
  39.       end
  40.       i -= 1;#计数器减去1
  41.     end
  42.     return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
  43.     return return_s;#返回结果
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 进行变色
  47.   #--------------------------------------------------------------------------
  48.   def gold_color
  49.     val = value;#获取金钱的数量
  50.     color=  Color.new(255, 255, 255);
  51.     case val#对金钱进行分情况讨论
  52.     when 0..999#当有不到一千的金钱时
  53.       color=  Color.new(255, 255, 255);
  54.     when 1000..9999#当有数千的金钱时
  55.       color=  Color.new(128, 255, 128);
  56.     when 10000..99999#当有数万的金钱时
  57.       color=  Color.new(128, 128, 255);
  58.     when 100000..999999#当有数十万的金钱时
  59.       color=  Color.new(255, 0, 255);
  60.     when 1000000..9999999#当有数百万的金钱时
  61.       color=  Color.new(255, 128, 128);
  62.     when 10000000..99999999#当有千万的金钱时
  63.       color= Color.new(255, 128, 0);
  64.     end
  65.     return color
  66.   end
  67. end
  68. #encoding:utf-8
  69. #==============================================================================
  70. # ■ Window_Base
  71. #------------------------------------------------------------------------------
  72. #  游戏中所有窗口的父类
  73. #==============================================================================
  74.  
  75. class Window_Base < Window
  76.   #--------------------------------------------------------------------------
  77.   # ● 绘制货币数值(持有金钱之类的)
  78.   #--------------------------------------------------------------------------
  79.   alias draw_currency_value_old draw_currency_value
  80.   def draw_currency_value(value, unit, x, y, width)
  81.     cx = text_size(unit).width
  82.     draw_text(x, y, width - cx - 2, line_height, value, 2)
  83.     change_color(system_color)
  84.     draw_text(x, y, width, line_height, unit, 2)
  85.   end
  86. end


复制这段脚本并且在main之前插入就能够实现功能了。我还有什么没有提到吗?各位还有不解、意见或者建议欢迎提出。

评分

参与人数 1星屑 +5 收起 理由
Mr丶木头 + 5 塞糖

查看全部评分

游戏群组:https://rpg.blue/forum.php?mod=group&fid=565在这里你可以看到我在制作游戏过程中分享的内容。

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
2
发表于 2014-1-10 23:58:40 | 只看该作者
唔,虽然不是很明白但是感觉好厉害的样子【PIA】
不过阁下的gold_color方法可以优化一下:
1.ruby风格的代码没必要显示的使用return,让根据case确定返回值就可以了
2.color类有一个set方法可以改变颜色,这要比重新生成实例要快的多
另外很想吐槽的一点是,颜色改的这么high,文字被压缩成那样了都不管么- -
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
105
在线时间
297 小时
注册时间
2009-1-7
帖子
216
3
 楼主| 发表于 2014-1-11 01:05:11 | 只看该作者
无脑之人 发表于 2014-1-10 23:58
唔,虽然不是很明白但是感觉好厉害的样子【PIA】
不过阁下的gold_color方法可以优化一下:
1.ruby风格的代码 ...

1.有return嘛是因为其他语言的习惯。个人感觉加了return看起来(仅仅是看起来)会更加严谨一点。
2.哦?是吗?这个color类说实话我还没仔细地看过呢。

吐槽的地方你有什么方法能够解决吗?
游戏群组:https://rpg.blue/forum.php?mod=group&fid=565在这里你可以看到我在制作游戏过程中分享的内容。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
117
在线时间
552 小时
注册时间
2012-8-18
帖子
1429
4
发表于 2014-1-11 12:38:19 | 只看该作者
timiesea 发表于 2014-1-11 01:05
1.有return嘛是因为其他语言的习惯。个人感觉加了return看起来(仅仅是看起来)会更加严谨一点。
2.哦?是 ...

可以设置为滚动式也可以按千压缩,「我才没有嫌逗号太占地方了」
关于这个分隔符,可以采用单独输出的方式,这样就可以不影响长度了
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39925
在线时间
7498 小时
注册时间
2009-7-6
帖子
13489

开拓者贵宾

5
发表于 2014-1-11 13:37:11 | 只看该作者
我觉得你用value.to_s.size来做颜色参数可以省很多代码。

点评

是不是还要定义一个数组来存放颜色?  发表于 2014-1-12 02:32
用log吧【2333333333  发表于 2014-1-11 18:14
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
105
在线时间
297 小时
注册时间
2009-1-7
帖子
216
6
 楼主| 发表于 2014-1-12 14:36:17 | 只看该作者
感谢@fux2@无脑之人的点拨。我已经优化了一些脚本。

新的脚本和旧脚本的区别如下:
1.优化了判断颜色的算法,避免超长整数的出现。有时候超长正数可能会占用过多的资源。不过脚本行数会有所增加。
2.修复了当金钱数目过多时显示会出现压缩的现象。

新脚本在金钱数目有几千万时表现如下:


不过当金钱数目达到上亿或者金钱的单位不是G时,还是有可能会出现压缩的现象。话说RPG单机游戏有必要上亿的金钱吗?

脚本:
RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ GOLD_COLOR2
  4. #------------------------------------------------------------------------------
  5. #  定义了金钱颜色。根据金钱的多少决定显示的颜色。
  6. #==============================================================================
  7.  
  8. module Gold_Color
  9.     Color1 = Color.new(255, 255, 255)  # 白
  10.     Color2 = Color.new(128, 255, 128)  # 绿
  11.     Color3 = Color.new(128, 128, 255)  # 蓝
  12.     Color4 = Color.new(255, 0, 255)    # 紫
  13.     Color5 = Color.new(255, 128, 128)  # 红
  14.     Color6 = Color.new(255, 128, 0)    # 橙
  15.     Self_Color = Array[Color1,Color2,Color3,Color4,Color5,Color6];
  16. end
  17. #encoding:utf-8
  18. #==============================================================================
  19. # ■ Window_Gold
  20. #------------------------------------------------------------------------------
  21. #  显示持有金钱的窗口
  22. #==============================================================================
  23.  
  24. class Window_Gold < Window_Base
  25.   #--------------------------------------------------------------------------
  26.   # ● 刷新
  27.   #--------------------------------------------------------------------------
  28.   alias refresh_old refresh;
  29.   def refresh
  30.     contents.clear
  31.     change_color(gold_color);
  32.     draw_currency_value(value_format, currency_unit, 0, 0, contents.width)
  33.   end
  34.   #--------------------------------------------------------------------------
  35.   # ● 转换金钱的显示格式
  36.   #--------------------------------------------------------------------------
  37.   def value_format
  38.     val = value;#获取金钱数量
  39.     s = val.to_s;#将金钱转化为字符串
  40.     return_s = "";#用来作为返回值的空字符串
  41.     len = s.length;#求出字符串的长度
  42.     i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
  43.     h = 0;#定义一个辅助计数器,用来判断是否已经三位了
  44.     if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
  45.       return_s = s;
  46.       return return_s;
  47.     end
  48.     while (i > 0)#当计数器为0的时候跳出循环
  49.       return_s.insert(0,s[i]);#将第i个数字进行插入
  50.       h += 1;#辅助计数器自增1
  51.       #如果辅助计数器已经得知计算了三位并且在之前还有数字
  52.       if h == 3 and s[i - 1] != nil
  53.         return_s.insert(0,",");#添加一个逗号
  54.         h = 0;#辅助计数器重新归零
  55.       end
  56.       i -= 1;#计数器减去1
  57.     end
  58.     return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
  59.     return return_s;#返回结果
  60.   end
  61.   #--------------------------------------------------------------------------
  62.   # ● 进行变色
  63.   #--------------------------------------------------------------------------
  64.   def gold_color
  65.     val = value;#获取金钱的数量
  66.     s = val.to_s;#将金钱转化为字符串
  67.     len = s.length;#求出字符串的长度
  68.     len = len - 3;
  69.     if len < 0
  70.       len = 0;
  71.     end
  72.     return Gold_Color::Self_Color[len];
  73.   end
  74. end
  75. #encoding:utf-8
  76. #==============================================================================
  77. # ■ Window_Base
  78. #------------------------------------------------------------------------------
  79. #  游戏中所有窗口的父类
  80. #==============================================================================
  81.  
  82. class Window_Base < Window
  83.   #--------------------------------------------------------------------------
  84.   # ● 绘制货币数值(持有金钱之类的)
  85.   #--------------------------------------------------------------------------
  86.   alias draw_currency_value_old draw_currency_value
  87.   def draw_currency_value(value, unit, x, y, width)
  88.     cx = text_size(unit).width#求出“G”所占用的宽度
  89.     draw_text(x, y, width - cx - 2, line_height, value, 2)#绘制金钱
  90.     change_color(system_color)#改变颜色为系统颜色
  91.     draw_text(x, y, width, line_height, unit, 2)#绘制“G”
  92.   end
  93. end


在main上面新建一个空的脚本,然后将以上脚本复制过去。如果你的游戏采取的不是默认的设置,请根据实际情况稍作修改。
游戏群组:https://rpg.blue/forum.php?mod=group&fid=565在这里你可以看到我在制作游戏过程中分享的内容。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-21 14:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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