此脚本使Color类支持十六进制颜色表示法。使用形如”#FFFFFF”的字符串(#号可省略)替代形如(255,255,255)的RGB颜色数值表示。
可使用缩略形式,如”#112233″可写作”#123″,”#000000″可写作”#0″
示例:
FireBrick = Color.new("#B22222",222)
p FireBrick #=> (178.000000,34.000000,34.000000,222.000000)
#==============================================================================
# ■ HexColor
#------------------------------------------------------------------------------
# 使Color类支持十六进制颜色表示法。
#------------------------------------------------------------------------------
# 作者:失落的乐章
# 来源:https://s-gs.net/hexcolor
#==============================================================================
class Color
alias old_init initialize unless private_method_defined? :old_init
alias old_set set unless method_defined? :old_set
def initialize(r = nil, g = nil, b = nil, a = 255)
# 判断是否采用16进制表示颜色
if r.is_a?(String)
g ||= 255
a = g
r, g, b = *hex_to_rgb(r)
old_init(r, g, b, a)
else
a = 0 if (r || g || b).nil?
r ||= 0
g ||= 0
b ||= 0
old_init(r, g, b, a)
end
end
def set(r, g = nil, b = 0, a = nil)
if r.is_a?(String)
g ||= self.alpha
a = g
r, g, b = *hex_to_rgb(r)
old_set(r, g, b, a)
elsif r.is_a?(Color)
old_set(r.red, r.green, r.blue, r.alpha)
else
a ||= self.alpha
old_set(r, g, b, a)
end
end
private
def hex_to_rgb(str)
hex = str.delete("#")
raise ArgumentError.new("Invalid Hex") unless /^[A-Fa-f0-9]+$/ =~ hex
# 考虑缩写形式
case hex.length
when 1
r = g = b = (hex * 2).to_i(16)
when 3
r, g, b = hex.split(//).map{ |s| (s * 2).to_i(16) }
when 6
r, g, b = [ hex[0, 2], hex[2, 2], hex[4, 2] ].map{ |s| s.to_i(16) }
end
return r, g, b
end
end
版本历史: 2017.05.20 : 初版 2017.05.27 : 增加对Color#set方法的修改 2017.06.12 : 增加RGSS3中Color类的特性
发表回复