CCNodeRGBA继承了CCNode和CCRGBAProtocol,实际上是在CCNode的基础上实现了CCRGBAProtocol,由于CCNode没有实际的内容要绘制,因此代码比较简单,主要是一些对子类和父类间属性的级联处理,通过一系列的变量控制,父子类关系,来管理控制4个变量:【显示透明度】【真实透明度】【显示颜色】【真实颜色】,以便CCNodeRGBA的子类更好的使用。
// CCNodeRGBA CCNodeRGBA::CCNodeRGBA() : _displayedOpacity(255) //==>>显示透明度 , _realOpacity(255) //==>>真实透明度 , _displayedColor(ccWHITE)//==>>显示颜色 , _realColor(ccWHITE) //==>>真实颜色 , _cascadeColorEnabled(false)//==>>是否级联控制颜色,默认为false , _cascadeOpacityEnabled(false)//==>>是否级联控制透明度,默认为false {} CCNodeRGBA::~CCNodeRGBA() {} bool CCNodeRGBA::init() { if (CCNode::init()) { //==>>初始化时透明度为255,颜色为白色,默认不级联控制 _displayedOpacity = _realOpacity = 255; _displayedColor = _realColor = ccWHITE; _cascadeOpacityEnabled = _cascadeColorEnabled = false; return true; } return false; } CCNodeRGBA * CCNodeRGBA::create(void) { CCNodeRGBA * pRet = new CCNodeRGBA(); if (pRet && pRet->init()) { pRet->autorelease(); } else { CC_SAFE_DELETE(pRet); } return pRet; } //==>>返回真实的透明度 GLubyte CCNodeRGBA::getOpacity(void) { return _realOpacity; } //==>>返回显示透明度 GLubyte CCNodeRGBA::getDisplayedOpacity(void) { return _displayedOpacity; } //==>>设置真实的透明度 void CCNodeRGBA::setOpacity(GLubyte opacity) { //==>>设置真实的透明度,此时显示透明度会被一并设置。 _displayedOpacity = _realOpacity = opacity; //==>>如果级联控制打开,那么就会查找父级的显示透明度,然后以此为依据来【重新设置】自己的显示透明度,上面的赋值【无效】。 //==>>如果级联控制没有打开,那么就无需再次修改自己的显示透明度,直接返回,上面的赋值【有效】。 if (_cascadeOpacityEnabled) { GLubyte parentOpacity = 255; CCRGBAProtocol* pParent = dynamic_cast<CCRGBAProtocol*>(m_pParent); if (pParent && pParent->isCascadeOpacityEnabled()) { parentOpacity = pParent->getDisplayedOpacity(); } this->updateDisplayedOpacity(parentOpacity); } } //==>>根据父级的显示透明度,计算自己的显示透明度 void CCNodeRGBA::updateDisplayedOpacity(GLubyte parentOpacity) { //==>>根据父级的显示透明度,来计算出自己的显示透明度 _displayedOpacity = _realOpacity * parentOpacity/255.0; //==>>如果级联控制打开了,那么就会遍历自己的子节点,将自己的子节点(以及子节点的子节点,如果该子节点也打开了级联控制)的显示透明度全部改掉。 //==>>如果级联控制没有打开,那么就直接返回。 if (_cascadeOpacityEnabled) { CCObject* pObj; CCARRAY_FOREACH(m_pChildren, pObj) { CCRGBAProtocol* item = dynamic_cast<CCRGBAProtocol*>(pObj); if (item) { item->updateDisplayedOpacity(_displayedOpacity); } } } } //==>>get && set cascadeOpacityEnabled bool CCNodeRGBA::isCascadeOpacityEnabled(void) { return _cascadeOpacityEnabled; } void CCNodeRGBA::setCascadeOpacityEnabled(bool cascadeOpacityEnabled) { _cascadeOpacityEnabled = cascadeOpacityEnabled; } //==>>获取自己的真实的颜色 const ccColor3B& CCNodeRGBA::getColor(void) { return _realColor; } //==>>获取自己的显示的颜色 const ccColor3B& CCNodeRGBA::getDisplayedColor() { return _displayedColor; } //==>>和 setOpacity 类似,都是根据是否级联来控制 自己的显示颜色。 void CCNodeRGBA::setColor(const ccColor3B& color) { _displayedColor = _realColor = color; if (_cascadeColorEnabled) { ccColor3B parentColor = ccWHITE; CCRGBAProtocol *parent = dynamic_cast<CCRGBAProtocol*>(m_pParent); if (parent && parent->isCascadeColorEnabled()) { parentColor = parent->getDisplayedColor(); } updateDisplayedColor(parentColor); } } //==>>和 updateDisplayedOpacity 类似,都是根据是否级联来控制 自己的子节点是否也级联更新。 void CCNodeRGBA::updateDisplayedColor(const ccColor3B& parentColor) { _displayedColor.r = _realColor.r * parentColor.r/255.0; _displayedColor.g = _realColor.g * parentColor.g/255.0; _displayedColor.b = _realColor.b * parentColor.b/255.0; if (_cascadeColorEnabled) { CCObject *obj = NULL; CCARRAY_FOREACH(m_pChildren, obj) { CCRGBAProtocol *item = dynamic_cast<CCRGBAProtocol*>(obj); if (item) { item->updateDisplayedColor(_displayedColor); } } } } //==>>get && set _cascadeColorEnabled bool CCNodeRGBA::isCascadeColorEnabled(void) { return _cascadeColorEnabled; } void CCNodeRGBA::setCascadeColorEnabled(bool cascadeColorEnabled) { _cascadeColorEnabled = cascadeColorEnabled; }
发表评论