【2014-04-15】cocos2dx学习笔记:CCNodeRGBA代码分析

发布时间:2026/8/19 13:15:07
【2014-04-15】cocos2dx学习笔记:CCNodeRGBA代码分析 [历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2014-04-15 标题cocos2dx学习笔记CCNodeRGBA代码分析分类编程 / C C / cocos2dx 标签cocos2dx·CCNodeRGBAcocos2dx学习笔记CCNodeRGBA代码分析CCNodeRGBA继承了CCNode和CCRGBAProtocol实际上是在CCNode的基础上实现了CCRGBAProtocol由于CCNode没有实际的内容要绘制因此代码比较简单主要是一些对子类和父类间属性的级联处理通过一系列的变量控制父子类关系来管理控制4个变量【显示透明度】【真实透明度】【显示颜色】【真实颜色】以便CCNodeRGBA的子类更好的使用。// CCNodeRGBACCNodeRGBA::CCNodeRGBA():_displayedOpacity(255)//显示透明度,_realOpacity(255)//真实透明度,_displayedColor(ccWHITE)//显示颜色,_realColor(ccWHITE)//真实颜色,_cascadeColorEnabled(false)//是否级联控制颜色默认为false,_cascadeOpacityEnabled(false)//是否级联控制透明度默认为false{}CCNodeRGBA::~CCNodeRGBA(){}boolCCNodeRGBA::init(){if(CCNode::init()){//初始化时透明度为255颜色为白色默认不级联控制_displayedOpacity_realOpacity255;_displayedColor_realColorccWHITE;_cascadeOpacityEnabled_cascadeColorEnabledfalse;returntrue;}returnfalse;}CCNodeRGBA*CCNodeRGBA::create(void){CCNodeRGBA*pRetnewCCNodeRGBA();if(pRetpRet-init()){pRet-autorelease();}else{CC_SAFE_DELETE(pRet);}returnpRet;}//返回真实的透明度GLubyteCCNodeRGBA::getOpacity(void){return_realOpacity;}//返回显示透明度GLubyteCCNodeRGBA::getDisplayedOpacity(void){return_displayedOpacity;}//设置真实的透明度voidCCNodeRGBA::setOpacity(GLubyte opacity){//设置真实的透明度此时显示透明度会被一并设置。_displayedOpacity_realOpacityopacity;//如果级联控制打开那么就会查找父级的显示透明度然后以此为依据来【重新设置】自己的显示透明度上面的赋值【无效】。//如果级联控制没有打开那么就无需再次修改自己的显示透明度直接返回上面的赋值【有效】。if(_cascadeOpacityEnabled){GLubyte parentOpacity255;CCRGBAProtocol*pParentdynamic_castCCRGBAProtocol*(m_pParent);if(pParentpParent-isCascadeOpacityEnabled()){parentOpacitypParent-getDisplayedOpacity();}this-updateDisplayedOpacity(parentOpacity);}}//根据父级的显示透明度计算自己的显示透明度voidCCNodeRGBA::updateDisplayedOpacity(GLubyte parentOpacity){//根据父级的显示透明度来计算出自己的显示透明度_displayedOpacity_realOpacity*parentOpacity/255.0;//如果级联控制打开了那么就会遍历自己的子节点将自己的子节点以及子节点的子节点如果该子节点也打开了级联控制的显示透明度全部改掉。//如果级联控制没有打开那么就直接返回。if(_cascadeOpacityEnabled){CCObject*pObj;CCARRAY_FOREACH(m_pChildren,pObj){CCRGBAProtocol*itemdynamic_castCCRGBAProtocol*(pObj);if(item){item-updateDisplayedOpacity(_displayedOpacity);}}}}//get set cascadeOpacityEnabledboolCCNodeRGBA::isCascadeOpacityEnabled(void){return_cascadeOpacityEnabled;}voidCCNodeRGBA::setCascadeOpacityEnabled(boolcascadeOpacityEnabled){_cascadeOpacityEnabledcascadeOpacityEnabled;}//获取自己的真实的颜色constccColor3BCCNodeRGBA::getColor(void){return_realColor;}//获取自己的显示的颜色constccColor3BCCNodeRGBA::getDisplayedColor(){return_displayedColor;}//和 setOpacity 类似都是根据是否级联来控制 自己的显示颜色。voidCCNodeRGBA::setColor(constccColor3Bcolor){_displayedColor_realColorcolor;if(_cascadeColorEnabled){ccColor3B parentColorccWHITE;CCRGBAProtocol*parentdynamic_castCCRGBAProtocol*(m_pParent);if(parentparent-isCascadeColorEnabled()){parentColorparent-getDisplayedColor();}updateDisplayedColor(parentColor);}}//和 updateDisplayedOpacity 类似都是根据是否级联来控制 自己的子节点是否也级联更新。voidCCNodeRGBA::updateDisplayedColor(constccColor3BparentColor){_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*objNULL;CCARRAY_FOREACH(m_pChildren,obj){CCRGBAProtocol*itemdynamic_castCCRGBAProtocol*(obj);if(item){item-updateDisplayedColor(_displayedColor);}}}}//get set _cascadeColorEnabledboolCCNodeRGBA::isCascadeColorEnabled(void){return_cascadeColorEnabled;}voidCCNodeRGBA::setCascadeColorEnabled(boolcascadeColorEnabled){_cascadeColorEnabledcascadeColorEnabled;}