cocos 2dx 打印节点树

这段代码展示了如何遍历Cocos2d-x和UI框架中的节点,包括使用`refreshTree`作为入口函数,递归遍历所有子节点。`getClassName`和`getClassType`方法用于获取节点的类名和类型。通过`printNodeTree`打印节点树,展示节点的ID、运行状态等信息。`seekFromRootByName`则根据名称从根节点开始查找特定节点。

入口函数 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, "", "");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值