骨骼动画中为每个骨骼设置单独的颜色
最近在做一款颜色类的游戏,用到了骨骼动画,但是,不同的骨骼需要有不同的颜色。在cocos的Node中,有一个setColor的方法可以设置颜色,但是,cocos中设置颜色,每个节点会得到父节点的颜色,并跟父节点的颜色保持一致。也就是说,在不改动cocos源码的情况下,这个需求无法实现(也可能是我没找对方法)。所以,在这里我修改了cocos中Node的源码,让Node能够单独设置自己的颜色。
.h中做的修改
public:
CC_SYNTHESIZE(bool,_isUpdataColorByParent,IsUpdataColorByParent);
Color3B _selfColor = Color3B::WHITE;
修改的.cpp中的方法
void Node::setColor(const Color3B& color)
{
_displayedColor = _realColor = color;
/*设置_selfColor*/
_selfColor = color;
updateCascadeColor();
}
void Node::updateCascadeColor()
{
Color3B parentColor = Color3B::WHITE;
if (_parent && _parent->isCascadeColorEnabled())
{
parentColor = _parent->getDisplayedColor();
}
/*判断是否跟父节点的颜色保持一致*/
if (_isUpdataColorByParent == false)
{
parentColor = _selfColor;
}
updateDisplayedColor(parentColor);
}
使用
void HelloWorld::testBone()
{
Size visibleSize = Director::getInstance()->getVisibleSize();
ArmatureDataManager::getInstance()->addArmatureFileInfo("BoneTest0.png", "BoneTest0.plist", "BoneTest.ExportJson");
Armature*pArm = Armature::create("BoneTest");
pArm->getAnimation()->play("circle_4");
addChild(pArm);
pArm->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
Bone * pBone1 = pArm->getBone("circle_lt");
Bone * pBone2 = pArm->getBone("circle_lb");
Bone * pBone3 = pArm->getBone("circle_rt");
Bone * pBone4 = pArm->getBone("circle_rb");
pBone1->setCascadeColorEnabled(true);//打开颜色设置开关
pBone1->setCascadeOpacityEnabled(true);//打开透明度设置开关
pBone2->setCascadeColorEnabled(true);
pBone2->setCascadeOpacityEnabled(true);
pBone3->setCascadeColorEnabled(true);
pBone3->setCascadeOpacityEnabled(true);
pBone4->setCascadeColorEnabled(true);
pBone4->setCascadeOpacityEnabled(true);
pBone1->setIsUpdataColorByParent(false);//设置不根据父节点的颜色更新颜色
pBone2->setIsUpdataColorByParent(false);
pBone3->setIsUpdataColorByParent(false);
pBone4->setIsUpdataColorByParent(false);
pArm->setCascadeColorEnabled(true);
pArm->setCascadeOpacityEnabled(true);
/*为骨骼设置颜色*/
pBone1->setColor(Color3B(255, 255, 0));
pBone2->setColor(Color3B(0, 255, 0));
pBone3->setColor(Color3B(255, 0, 0));
pBone4->setColor(Color3B(0, 255, 0));
}