Spine的颜色变换与组件更换 - kyohwang/games GitHub Wiki

为了配合运营的推广,给玩家不一样的体验,我们开发了一个变色系统。 运营及策划的需求如下:

  1. 头发变色

  2. 衣服变色

  3. 更换武器

  4. 增加组件

  5. 更换骨骼

针对于以上的需求,划分了一下功能点,可以分为如下三个功能

1. 改变指定骨骼贴图的色相值

最初我认为是直接改变RGB值来生成比较死板的图片,后来经过沟通我们通过调整色相(策划的需求)来改变颜色,实现 0-360度的色相值改变,经过测试颜色区域覆盖很广,可以满足玩家个性化需求。关于RGB值与色彩三元素(色相,饱和度,明度)的关系,可以参考如下文章 http://baike.baidu.com/subview/541362/8445478.htm?fr=aladdin

2. 改变骨骼指定贴图

与美术沟通之后,我们决定把武器制作成为一个标准规范的图,然后把需要更换的武器打入一个图集内,当创建spine的时候,解析 atlas文件,把对应的需要更换的图的路径指向武器图集中需要更换的图的路径。比如 boy.atlas 中武器的贴图叫做 image/skin-1/wuqi 那么我们把它指向 wuqi.atlas文件中的 wuqi-001 ,wuqi-002,wuqi-003,就可以实现更换组件的功能。同样的如果加特效,就是更换N张图来实现。

3. 更换整个骨骼

这个最简单,就是美术重新做一个人物,替换即可,用于高阶英雄。

下面是针对于图片改变色相的功能

改变色相值为 10 色相 10 改变色相值为 110 色相 110 改变色相值为 160 色相 160

下面是图片改变色相和更换组件的组合效果

改变色相值为 180 武器用 2 ![色相 180 武器 2](http://gate.game5s.cn/ssl/http/spinealter/boy_wuqi_3 (2).png) 改变色相值为 180 武器用 4 色相 180 武器4 改变色相值为 90 武器用 3 色相 90 武器 3

附件: RGB值与色彩三元素转换相关文章:

http://blog.csdn.net/xhhjin/article/details/7020449

http://www.cnblogs.com/chevin/p/5668364.html

我们项目开发的C语言代码,实现RGB值与色彩三元素转换:

void hsb2rgb(float &hsbH, float &hsbS, float &hsbB, unsigned char &rgbR, unsigned char &rgbG, unsigned char &rgbB) { int i = ((int)(hsbH / 60)) % 6; float f = hsbH / 60 - i; float p = (hsbB * (1 - hsbS)); float q = (hsbB * (1 - f * hsbS)); float t = (hsbB * (1 - (1 - f) * hsbS)); float v = hsbB; const unsigned char RGBMax = 255; switch (i) { case 0: rgbR = v*RGBMax; rgbG = t*RGBMax; rgbB = p*RGBMax; break; case 1: rgbR = q*RGBMax; rgbG = v*RGBMax; rgbB = p*RGBMax; break; case 2: rgbR = p*RGBMax; rgbG = v*RGBMax; rgbB = t*RGBMax; break; case 3: rgbR = p*RGBMax; rgbG = q*RGBMax; rgbB = v*RGBMax; break; case 4: rgbR = t*RGBMax; rgbG = p*RGBMax; rgbB = v*RGBMax; break; case 5: rgbR = v*RGBMax; rgbG = p*RGBMax; rgbB = q*RGBMax; break; default: break; } }

`void rgb2hsb(unsigned char &rgbR, unsigned char &rgbG, unsigned char &rgbB, float &hsbH, float &hsbS, float &hsbB){ // 计算rgb中最小的 min unsigned char min = (rgbR < rgbG) ? rgbR : rgbG; min = (min < rgbB) ? min : rgbB;

// 计算rgb中最大的max
unsigned char max = (rgbR > rgbG) ? rgbR : rgbG;
max = (max > rgbB) ? max : rgbB;

hsbH = 0; //Hue色相
hsbS = 0; //Saturation饱和度
hsbB = 0; //brightness明度

//计算饱和度
hsbS = max == 0 ? 0 : (max - min) / (float) max;

// 计算明度
hsbB = (float) max / 255.0f;

//计算色相
unsigned char temp = max - min;
hsbH = 0;
if (max == rgbR) {
	if (rgbG >= rgbB) {
		hsbH = (float)(rgbG - rgbB) * 60.0 / (float)temp + 0;
	}else {
		hsbH = ((float)(rgbG - rgbB) * 60.0 / (float)temp) + 360;
	}
}else if (max == rgbG) {
	hsbH = ((float)(rgbB - rgbR) * 60.0 / (float)temp) + 120;
}else if (max == rgbB) {
	hsbH = ((float)(rgbR - rgbG) * 60.0 / (float)temp) + 240;
}

} `

代码格式搞不好,提交code了