好记性不如铅笔头

C && C++, cocos2dx, 编程

cocos2dx学习笔记:CCNodeRGBA代码分析

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;
}

 

发表评论

1 × 2 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据