入口函数 refreshTree
递归遍历所有子节点 遍历规则:深度模式 seekFromRootByName
打印节点树 printNodeTree
获取类名方法 getClassName
获取类型的方法 getClassType
完整代码
#define CREATE_TYPE(typeName,node)\
if(dynamic_cast<typeName*>(node))\
{ \
return #typeName;\
} \
std::string getClassName(CCNode* node)
{
return typeid(*node).name();
}
std::string getClassType(CCNode* node)
{
if (node)
{
CREATE_TYPE(CCMenu, node);
CREATE_TYPE(CCMenuItem, node);
CREATE_TYPE(CCMenuItemImage, node);
CREATE_TYPE(CCScale9Sprite, node);
CREATE_TYPE(CCSprite, node);
CREATE_TYPE(CCNotificationCenter, node);
CREATE_TYPE(ui::ImageView, node);
CREATE_TYPE(ui::Button, node);
CREATE_TYPE(ui::CheckBox, node);
CREATE_TYPE(ui::Label, node);
CREATE_TYPE(ui::LabelAtlas, node);
CREATE_TYPE(ui::LabelBMFont, node);
CREATE_TYPE(ui::LoadingBar, node);
CREATE_TYPE(ui::RichText, node);
CREATE_TYPE(ui::Slider, node);
CREATE_TYPE(ui::TextField, node);
CREATE_TYPE(ui::Widget, node);
CREATE_TYPE(CCScene, node);
CREATE_TYPE(CCLayer, node);
CREATE_TYPE(CCNode, node);
}
return "";
}
void printNodeTree(CCNode* node, std::string& sp)
{
if(node)
{
std::string strName = getClassName(node);
if(dynamic_cast<ui::Widget*>(node))
{
//CCLog("%s|%s [ type=%s, m_uReference=%d, m_uAutoReleaseCount=%d, m_uID=%d, isRunning=%d, name=%s]",sp.c_str(),strName.c_str(),getClassType(node).c_str(), node->m_uReference, node->m_uAutoReleaseCount, node->m_uID, node->isRunning(),dynamic_cast<ui::Widget*>(node)->getName());
CCLog("%s|%s [ type=%s, m_uID=%d, isRunning=%d]",sp.c_str(),strName.c_str(),getClassType(node).c_str(), node->m_uID, node->isRunning());
}
else {
//CCLog("%s|%s [ type=%s, m_uReference=%d, m_uAutoReleaseCount=%d, m_uID=%d, isRunning=%d]",sp.c_str(),strName.c_str(),getClassType(node).c_str(), node->m_uReference, node->m_uAutoReleaseCount, node->m_uID, node->isRunning());
CCLog("%s|%s [ type=%s, m_uID=%d, isRunning=%d]",sp.c_str(),strName.c_str(),getClassType(node).c_str(), node->m_uID, node->isRunning());
}
}
}
void seekFromRootByName(CCNode* root, std::string name, std::string sp)
{
if (!root)
return NULL;
CCObject* pObj;
sp = sp + " ";
printNodeTree(root, sp);
CCARRAY_FOREACH(root->getChildren(), pObj)
{
CCNode* pNode = dynamic_cast<CCNode*>(pObj);
if (pNode)
{
seekFromRootByName(pNode, "", sp);
}
}
}
void refreshTree()
{
CCScene* pRunScene = CCDirector::sharedDirector()->getRunningScene();
if(pRunScene){
seekFromRootByName(pRunScene, "", "");
}
}
这段代码展示了如何遍历Cocos2d-x和UI框架中的节点,包括使用`refreshTree`作为入口函数,递归遍历所有子节点。`getClassName`和`getClassType`方法用于获取节点的类名和类型。通过`printNodeTree`打印节点树,展示节点的ID、运行状态等信息。`seekFromRootByName`则根据名称从根节点开始查找特定节点。

527

被折叠的 条评论
为什么被折叠?



