Project1
标题: [简单脚本搭配RUBY语法]金钱的颜色化和格式化 [打印本页]
作者: timiesea 时间: 2014-1-10 00:22
标题: [简单脚本搭配RUBY语法]金钱的颜色化和格式化
本帖最后由 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方法如下:
def refresh
contents.clear
draw_currency_value(value, currency_unit, 4, 0, contents.width - 8)
end
def refresh
contents.clear
draw_currency_value(value, currency_unit, 4, 0, contents.width - 8)
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.将设置好的颜色类返回。
总的来说就是这样:
def gold_color
val = value;#获取金钱的数量
color= Color.new(255, 255, 255);
case val#对金钱进行分情况讨论
when 0..999#当有不到一千的金钱时,白色
color= Color.new(255, 255, 255);
when 1000..9999#当有数千的金钱时,绿色
color= Color.new(128, 255, 128);
when 10000..99999#当有数万的金钱时,蓝色
color= Color.new(128, 128, 255);
when 100000..999999#当有数十万的金钱时,紫色
color= Color.new(255, 0, 255);
when 1000000..9999999#当有数百万的金钱时,红色
color= Color.new(255, 128, 128);
when 10000000..99999999#当有千万的金钱时,橙色
color= Color.new(255, 128, 0);
end
return color
end
def gold_color
val = value;#获取金钱的数量
color= Color.new(255, 255, 255);
case val#对金钱进行分情况讨论
when 0..999#当有不到一千的金钱时,白色
color= Color.new(255, 255, 255);
when 1000..9999#当有数千的金钱时,绿色
color= Color.new(128, 255, 128);
when 10000..99999#当有数万的金钱时,蓝色
color= Color.new(128, 128, 255);
when 100000..999999#当有数十万的金钱时,紫色
color= Color.new(255, 0, 255);
when 1000000..9999999#当有数百万的金钱时,红色
color= Color.new(255, 128, 128);
when 10000000..99999999#当有千万的金钱时,橙色
color= Color.new(255, 128, 0);
end
return color
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的语法,就形成了以下脚本:
def value_format
val = value;#获取金钱数量
s = val.to_s;#将金钱转化为字符串
return_s = "";#用来作为返回值的空字符串
len = s.length;#求出字符串的长度
i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
h = 0;#定义一个辅助计数器,用来判断是否已经三位了
if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
return_s = s;
return return_s;
end
while (i > 0)#当计数器为0的时候跳出循环
return_s.insert(0,s[i]);#将第i个数字进行插入
h += 1;#辅助计数器自增1
#如果辅助计数器已经得知计算了三位并且在之前还有数字
if h == 3 and s[i - 1] != nil
return_s.insert(0,",");#添加一个逗号
h = 0;#辅助计数器重新归零
end
i -= 1;#计数器减去1
end
return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
return return_s;#返回结果
end
def value_format
val = value;#获取金钱数量
s = val.to_s;#将金钱转化为字符串
return_s = "";#用来作为返回值的空字符串
len = s.length;#求出字符串的长度
i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
h = 0;#定义一个辅助计数器,用来判断是否已经三位了
if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
return_s = s;
return return_s;
end
while (i > 0)#当计数器为0的时候跳出循环
return_s.insert(0,s[i]);#将第i个数字进行插入
h += 1;#辅助计数器自增1
#如果辅助计数器已经得知计算了三位并且在之前还有数字
if h == 3 and s[i - 1] != nil
return_s.insert(0,",");#添加一个逗号
h = 0;#辅助计数器重新归零
end
i -= 1;#计数器减去1
end
return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
return return_s;#返回结果
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如下:
def draw_currency_value(value, unit, x, y, width)
cx = text_size(unit).width
change_color(normal_color)
draw_text(x, y, width - cx - 2, line_height, value, 2)
change_color(system_color)
draw_text(x, y, width, line_height, unit, 2)
end
def draw_currency_value(value, unit, x, y, width)
cx = text_size(unit).width
change_color(normal_color)
draw_text(x, y, width - cx - 2, line_height, value, 2)
change_color(system_color)
draw_text(x, y, width, line_height, unit, 2)
end
其中有一行change_color(normal_color)便对金钱又进行了一次设置,必须将这句删去,否则我们刚刚设置的颜色又会被设置回normal_color(白色)了。
七、没有了。
感觉这一次没有上一次讲得详细,不过也将自己的思路与大家进行了分享。我觉得在写脚本时,重要的还是思路,语法很容易懂的。在学脚本时要从一个脚本领悟出什么,然后举一反三。当然了,这一次还是会有脚本,如下:
#encoding:utf-8
#==============================================================================
# ■ Window_Gold
#------------------------------------------------------------------------------
# 显示持有金钱的窗口
#==============================================================================
class Window_Gold < Window_Base
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
alias refresh_old refresh;
def refresh
contents.clear
change_color(gold_color);
draw_currency_value(value_format, currency_unit, 4, 0, contents.width - 8)
end
#--------------------------------------------------------------------------
# ● 转换金钱的显示格式
#--------------------------------------------------------------------------
def value_format
val = value;#获取金钱数量
s = val.to_s;#将金钱转化为字符串
return_s = "";#用来作为返回值的空字符串
len = s.length;#求出字符串的长度
i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
h = 0;#定义一个辅助计数器,用来判断是否已经三位了
if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
return_s = s;
return return_s;
end
while (i > 0)#当计数器为0的时候跳出循环
return_s.insert(0,s[i]);#将第i个数字进行插入
h += 1;#辅助计数器自增1
#如果辅助计数器已经得知计算了三位并且在之前还有数字
if h == 3 and s[i - 1] != nil
return_s.insert(0,",");#添加一个逗号
h = 0;#辅助计数器重新归零
end
i -= 1;#计数器减去1
end
return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
return return_s;#返回结果
end
#--------------------------------------------------------------------------
# ● 进行变色
#--------------------------------------------------------------------------
def gold_color
val = value;#获取金钱的数量
color= Color.new(255, 255, 255);
case val#对金钱进行分情况讨论
when 0..999#当有不到一千的金钱时
color= Color.new(255, 255, 255);
when 1000..9999#当有数千的金钱时
color= Color.new(128, 255, 128);
when 10000..99999#当有数万的金钱时
color= Color.new(128, 128, 255);
when 100000..999999#当有数十万的金钱时
color= Color.new(255, 0, 255);
when 1000000..9999999#当有数百万的金钱时
color= Color.new(255, 128, 128);
when 10000000..99999999#当有千万的金钱时
color= Color.new(255, 128, 0);
end
return color
end
end
#encoding:utf-8
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
# 游戏中所有窗口的父类
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 绘制货币数值(持有金钱之类的)
#--------------------------------------------------------------------------
alias draw_currency_value_old draw_currency_value
def draw_currency_value(value, unit, x, y, width)
cx = text_size(unit).width
draw_text(x, y, width - cx - 2, line_height, value, 2)
change_color(system_color)
draw_text(x, y, width, line_height, unit, 2)
end
end
#encoding:utf-8
#==============================================================================
# ■ Window_Gold
#------------------------------------------------------------------------------
# 显示持有金钱的窗口
#==============================================================================
class Window_Gold < Window_Base
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
alias refresh_old refresh;
def refresh
contents.clear
change_color(gold_color);
draw_currency_value(value_format, currency_unit, 4, 0, contents.width - 8)
end
#--------------------------------------------------------------------------
# ● 转换金钱的显示格式
#--------------------------------------------------------------------------
def value_format
val = value;#获取金钱数量
s = val.to_s;#将金钱转化为字符串
return_s = "";#用来作为返回值的空字符串
len = s.length;#求出字符串的长度
i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
h = 0;#定义一个辅助计数器,用来判断是否已经三位了
if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
return_s = s;
return return_s;
end
while (i > 0)#当计数器为0的时候跳出循环
return_s.insert(0,s[i]);#将第i个数字进行插入
h += 1;#辅助计数器自增1
#如果辅助计数器已经得知计算了三位并且在之前还有数字
if h == 3 and s[i - 1] != nil
return_s.insert(0,",");#添加一个逗号
h = 0;#辅助计数器重新归零
end
i -= 1;#计数器减去1
end
return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
return return_s;#返回结果
end
#--------------------------------------------------------------------------
# ● 进行变色
#--------------------------------------------------------------------------
def gold_color
val = value;#获取金钱的数量
color= Color.new(255, 255, 255);
case val#对金钱进行分情况讨论
when 0..999#当有不到一千的金钱时
color= Color.new(255, 255, 255);
when 1000..9999#当有数千的金钱时
color= Color.new(128, 255, 128);
when 10000..99999#当有数万的金钱时
color= Color.new(128, 128, 255);
when 100000..999999#当有数十万的金钱时
color= Color.new(255, 0, 255);
when 1000000..9999999#当有数百万的金钱时
color= Color.new(255, 128, 128);
when 10000000..99999999#当有千万的金钱时
color= Color.new(255, 128, 0);
end
return color
end
end
#encoding:utf-8
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
# 游戏中所有窗口的父类
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 绘制货币数值(持有金钱之类的)
#--------------------------------------------------------------------------
alias draw_currency_value_old draw_currency_value
def draw_currency_value(value, unit, x, y, width)
cx = text_size(unit).width
draw_text(x, y, width - cx - 2, line_height, value, 2)
change_color(system_color)
draw_text(x, y, width, line_height, unit, 2)
end
end
复制这段脚本并且在main之前插入就能够实现功能了。我还有什么没有提到吗?各位还有不解、意见或者建议欢迎提出。
作者: 无脑之人 时间: 2014-1-10 23:58
唔,虽然不是很明白但是感觉好厉害的样子【PIA】
不过阁下的gold_color方法可以优化一下:
1.ruby风格的代码没必要显示的使用return,让根据case确定返回值就可以了
2.color类有一个set方法可以改变颜色,这要比重新生成实例要快的多
另外很想吐槽的一点是,颜色改的这么high,文字被压缩成那样了都不管么- -
作者: timiesea 时间: 2014-1-11 01:05
无脑之人 发表于 2014-1-10 23:58
唔,虽然不是很明白但是感觉好厉害的样子【PIA】
不过阁下的gold_color方法可以优化一下:
1.ruby风格的代码 ...
1.有return嘛是因为其他语言的习惯。个人感觉加了return看起来(仅仅是看起来)会更加严谨一点。
2.哦?是吗?这个color类说实话我还没仔细地看过呢。
吐槽的地方你有什么方法能够解决吗?
作者: 无脑之人 时间: 2014-1-11 12:38
timiesea 发表于 2014-1-11 01:05
1.有return嘛是因为其他语言的习惯。个人感觉加了return看起来(仅仅是看起来)会更加严谨一点。
2.哦?是 ...
可以设置为滚动式也可以按千压缩,「我才没有嫌逗号太占地方了」
关于这个分隔符,可以采用单独输出的方式,这样就可以不影响长度了
作者: fux2 时间: 2014-1-11 13:37
我觉得你用value.to_s.size来做颜色参数可以省很多代码。
作者: timiesea 时间: 2014-1-12 14:36
感谢@fux2和@无脑之人的点拨。我已经优化了一些脚本。
新的脚本和旧脚本的区别如下:
1.优化了判断颜色的算法,避免超长整数的出现。有时候超长正数可能会占用过多的资源。不过脚本行数会有所增加。
2.修复了当金钱数目过多时显示会出现压缩的现象。
新脚本在金钱数目有几千万时表现如下:
不过当金钱数目达到上亿或者金钱的单位不是G时,还是有可能会出现压缩的现象。话说RPG单机游戏有必要上亿的金钱吗?
脚本:
#encoding:utf-8
#==============================================================================
# ■ GOLD_COLOR2
#------------------------------------------------------------------------------
# 定义了金钱颜色。根据金钱的多少决定显示的颜色。
#==============================================================================
module Gold_Color
Color1 = Color.new(255, 255, 255) # 白
Color2 = Color.new(128, 255, 128) # 绿
Color3 = Color.new(128, 128, 255) # 蓝
Color4 = Color.new(255, 0, 255) # 紫
Color5 = Color.new(255, 128, 128) # 红
Color6 = Color.new(255, 128, 0) # 橙
Self_Color = Array[Color1,Color2,Color3,Color4,Color5,Color6];
end
#encoding:utf-8
#==============================================================================
# ■ Window_Gold
#------------------------------------------------------------------------------
# 显示持有金钱的窗口
#==============================================================================
class Window_Gold < Window_Base
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
alias refresh_old refresh;
def refresh
contents.clear
change_color(gold_color);
draw_currency_value(value_format, currency_unit, 0, 0, contents.width)
end
#--------------------------------------------------------------------------
# ● 转换金钱的显示格式
#--------------------------------------------------------------------------
def value_format
val = value;#获取金钱数量
s = val.to_s;#将金钱转化为字符串
return_s = "";#用来作为返回值的空字符串
len = s.length;#求出字符串的长度
i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
h = 0;#定义一个辅助计数器,用来判断是否已经三位了
if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
return_s = s;
return return_s;
end
while (i > 0)#当计数器为0的时候跳出循环
return_s.insert(0,s[i]);#将第i个数字进行插入
h += 1;#辅助计数器自增1
#如果辅助计数器已经得知计算了三位并且在之前还有数字
if h == 3 and s[i - 1] != nil
return_s.insert(0,",");#添加一个逗号
h = 0;#辅助计数器重新归零
end
i -= 1;#计数器减去1
end
return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
return return_s;#返回结果
end
#--------------------------------------------------------------------------
# ● 进行变色
#--------------------------------------------------------------------------
def gold_color
val = value;#获取金钱的数量
s = val.to_s;#将金钱转化为字符串
len = s.length;#求出字符串的长度
len = len - 3;
if len < 0
len = 0;
end
return Gold_Color::Self_Color[len];
end
end
#encoding:utf-8
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
# 游戏中所有窗口的父类
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 绘制货币数值(持有金钱之类的)
#--------------------------------------------------------------------------
alias draw_currency_value_old draw_currency_value
def draw_currency_value(value, unit, x, y, width)
cx = text_size(unit).width#求出“G”所占用的宽度
draw_text(x, y, width - cx - 2, line_height, value, 2)#绘制金钱
change_color(system_color)#改变颜色为系统颜色
draw_text(x, y, width, line_height, unit, 2)#绘制“G”
end
end
#encoding:utf-8
#==============================================================================
# ■ GOLD_COLOR2
#------------------------------------------------------------------------------
# 定义了金钱颜色。根据金钱的多少决定显示的颜色。
#==============================================================================
module Gold_Color
Color1 = Color.new(255, 255, 255) # 白
Color2 = Color.new(128, 255, 128) # 绿
Color3 = Color.new(128, 128, 255) # 蓝
Color4 = Color.new(255, 0, 255) # 紫
Color5 = Color.new(255, 128, 128) # 红
Color6 = Color.new(255, 128, 0) # 橙
Self_Color = Array[Color1,Color2,Color3,Color4,Color5,Color6];
end
#encoding:utf-8
#==============================================================================
# ■ Window_Gold
#------------------------------------------------------------------------------
# 显示持有金钱的窗口
#==============================================================================
class Window_Gold < Window_Base
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
alias refresh_old refresh;
def refresh
contents.clear
change_color(gold_color);
draw_currency_value(value_format, currency_unit, 0, 0, contents.width)
end
#--------------------------------------------------------------------------
# ● 转换金钱的显示格式
#--------------------------------------------------------------------------
def value_format
val = value;#获取金钱数量
s = val.to_s;#将金钱转化为字符串
return_s = "";#用来作为返回值的空字符串
len = s.length;#求出字符串的长度
i = len - 1;#定义一个计数器,用来从末尾逐位读取字符串的值
h = 0;#定义一个辅助计数器,用来判断是否已经三位了
if len == 1 or i == 0#如果金钱数目还不到10,则直接返回
return_s = s;
return return_s;
end
while (i > 0)#当计数器为0的时候跳出循环
return_s.insert(0,s[i]);#将第i个数字进行插入
h += 1;#辅助计数器自增1
#如果辅助计数器已经得知计算了三位并且在之前还有数字
if h == 3 and s[i - 1] != nil
return_s.insert(0,",");#添加一个逗号
h = 0;#辅助计数器重新归零
end
i -= 1;#计数器减去1
end
return_s.insert(0,s[0]);#将第一位,也就是遗漏的那一位插入
return return_s;#返回结果
end
#--------------------------------------------------------------------------
# ● 进行变色
#--------------------------------------------------------------------------
def gold_color
val = value;#获取金钱的数量
s = val.to_s;#将金钱转化为字符串
len = s.length;#求出字符串的长度
len = len - 3;
if len < 0
len = 0;
end
return Gold_Color::Self_Color[len];
end
end
#encoding:utf-8
#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
# 游戏中所有窗口的父类
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 绘制货币数值(持有金钱之类的)
#--------------------------------------------------------------------------
alias draw_currency_value_old draw_currency_value
def draw_currency_value(value, unit, x, y, width)
cx = text_size(unit).width#求出“G”所占用的宽度
draw_text(x, y, width - cx - 2, line_height, value, 2)#绘制金钱
change_color(system_color)#改变颜色为系统颜色
draw_text(x, y, width, line_height, unit, 2)#绘制“G”
end
end
在main上面新建一个空的脚本,然后将以上脚本复制过去。如果你的游戏采取的不是默认的设置,请根据实际情况稍作修改。
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |