对cocos2dx的一些优化基于cocos2dx3.16

先来第一点吧:

  • Node* Node::getChildByName(const std::string& name) const

  • {

  • //这是引擎原来的

  • //CCASSERT(!name.empty(), "Invalid name");
    
  • //
    
  • //std::hash<std::string> h;
    
  • //size_t hash = h(name);
    
  • //
    
  • //for (const auto& child : _children)
    
  • //{
    
  • //    // Different strings may have the same hash code, but can use it to compare first for speed
    
  • //    if(child->_hashOfName == hash && child->_name.compare(name) == 0)
    
  • //        return child;
    
  • //}
    
  • //现在修改的

  • CCASSERT(name.length() != 0, “Invalid name”);

  • std::hashstd::string h;

  • size_t hash = h(name);

  • for (const auto& child : _children)

  • {

  •   // Different strings may have the same hash code, but can use it to compare first for speed
    
  •   if (child->_hashOfName == hash && child->_name.compare(name) == 0)
    
  •   	return child;
    
  •   //兼容老版UI
    
  •   Node* node = child->getChildByName(name);
    
  •   if (node)
    
  •   {
    
  •   	return node;
    
  •   }
    
  • }

  • return nullptr;
    
  • }

  • 以前需要这样写:

  • Node->getChildByName(“xxxxx”)->getChildByName(“xxxxx”)->getChildByName(“xxxxx”)->getChildByName(“xxxxx”)…;

  • 现在只需要:Node->getChildByName(“xxxxx”);缺点不能名字不能重复;


  • //另外我在引擎上面封装了一层:
  • 所有界面全部用一个场景RootScene;
  • 画面切换只需移除原来的层,加载现在的,封装层的加载从xml里面自动读取切换层只需要一句话附上核心代码;

  • GameUI所有层的基类

    • #ifndef GAME_UI_H
    • #define GAME_UI_H
    • #include “cocos2d.h”
    • #include “ui/CocosGUI.h”
    • #include “cocostudio\CocoStudio.h”
  • using namespace cocos2d::ui;

  • USING_NS_CC;

    • #define CREATE_GAMEUI_FUNC(TYPE) \
  • static TYPE* create(int idu) \

  • { \

  • TYPE *pRet = new(std::nothrow) TYPE(idu); \

  • if (pRet && pRet->init() && pRet->onInit()) \

  • { \

  •   pRet->autorelease(); \
    
  •   return pRet; \
    
  • } \

  •   else \
    
  • { \

  •   delete pRet; \
    
  •   pRet = nullptr; \
    
  •   return nullptr; \
    
  • } \

  • }

  • class GameUI : public Layer

  • {

  • public:

  • bool init();

  • virtual bool onInit(){ return true; };

  • virtual void onEnter();

  • GameUI(int idu);

  • virtual ~GameUI();

  • protected:

  • Node* getView()

  • {

  •   return m_pRootNode;
    
  • }

  • static Node * m_pRootNode;

  • private:

  • int m_nIdu;

  • bool setIdu(int idu);

  • private:

  • };

  • #endif

  • #include “GameUI.h”

  • #include “GameUIRes.h”

  • Node* GameUI::m_pRootNode = NULL;

  • GameUI::GameUI(int idu) :m_nIdu(idu)

  • {

  • }

  • GameUI::~GameUI()

  • {

  • }

  • bool GameUI::init()

  • {

  • if (!Layer::init())

  • {

  •   return false;
    
  • }

  • setIdu(m_nIdu);

  • return true;

  • }

  • void GameUI::onEnter()

  • {

  • Layer::onEnter();

  • }

  • bool GameUI::setIdu(int idu)

  • {

  • GameUI * pGame = this;

  • std::string strIdu = gGameUIRes->getIDUResPath(idu);

  • if (m_pRootNode)

  • {

  •   /*	m_pRootNode->removeFromParent();
    
  •   	m_pRootNode->retain();
    
  •   	m_pRootNode = NULL;*/
    
  • }

  • if (FileUtils::getInstance()->isFileExist(strIdu))

  • {

  •   int pos = strIdu.rfind("\\");
    
  •   if (pos == -1)
    
  •   {
    
  •   	return false;
    
  •   }
    
  •   std::string strAddPath = strIdu.substr(0, pos);
    
  •   FileUtils::getInstance()->addSearchPath(strAddPath);
    
  •   m_pRootNode = CSLoader::createNode(strIdu);
    
  •   addChild(m_pRootNode); 
    
  • }

  • else

  • {

  •   CCLOG("IDU FILE NOT FIND %d", idu);
    
  •   return false;
    
  • };

  • }


  • RootScene最原始的层:

  • #ifndef ROOT_SCENE_H

  • #define ROOT_SCENE_H

  • #include “cocos2d.h”

  • #define gRootScene RootScene::getInstance()

  • USING_NS_CC;

  • class RootScene :public Scene

  • {

  • public:

  • static RootScene* create()

  • {

  •   RootScene *pRet = new(std::nothrow) RootScene();
    
  •   if (pRet && pRet->init())
    
  •   {
    
  •   	pRet->autorelease();
    
  •   	m_pRootScene = pRet;
    
  •   	return pRet;
    
  •   }
    
  •   else
    
  •   {
    
  •   	delete pRet;
    
  •   	pRet = nullptr;
    
  •   	return nullptr;
    
  •   }
    
  • }

  • static RootScene *getInstance()

  • {

  •   return m_pRootScene;
    
  • };

  • RootScene();

  • virtual ~RootScene();

  • virtual bool init();

  • virtual void onEnter();

  • virtual void onExit();

  • void replaceLayer(Layer *layer);

  • Layer * getRootLaye(){ return m_pNowLayer; };

  • private:

  • static RootScene * m_pRootScene;

  • Layer *m_pNowLayer;

  • };

  • #endif

  • #include “RootScene.h”

  • #include “GameUIManager.h”

  • #include “GameUIRes.h”

  • RootScene* RootScene::m_pRootScene = NULL;

  • RootScene::RootScene():m_pNowLayer(NULL)

  • {

  • }

  • RootScene::~RootScene()

  • {

  • }

  • bool RootScene::init()

  • {

  • if (!Scene::init())

  • {

  •   return false;
    
  • }

  • //默认打开界面

  • gGameUI->openIdu(1);

  • return true;

  • }

  • void RootScene::onEnter()

  • {

  • Scene::onEnter();

  • //

  • }

  • void RootScene::onExit()

  • {

  • Scene::onExit();

  • }

  • void RootScene::replaceLayer(Layer *layer)

  • {

  • if (m_pNowLayer!=NULL)

  • {

  •   m_pNowLayer->removeFromParent();
    
  • }

  • this->addChild(layer);

  • m_pNowLayer = layer;

  • }


  • GameUIManager负责UI切换

  • #ifndef GAME_UI_MANAGER_H

  • #define GAME_UI_MANAGER_H

  • #include “cocos2d.h”

  • #include “GameUI.h”

  • #include “GameUIRes.h”

  • #define gGameUI GameUIManager::getInstance()

  • class GameUIManager

  • {

  • public:

  • GameUIManager();

  • ~GameUIManager();

  • static GameUIManager * getInstance();

  • void openIdu(int idu);

  • private:

  • GameUI * getGameUI(int idu);

  • static GameUIManager * m_pManager;

  • };

  • #endif

  • #include “GameUIManager.h”

  • #include “RootScene.h”

  • #include “GameBoot.h”

  • #include “GameEnter.h”

  • GameUIManager*GameUIManager::m_pManager = NULL;

  • GameUIManager::GameUIManager()

  • {

  • }

  • GameUIManager::~GameUIManager()

  • {

  • }

  • GameUIManager * GameUIManager::getInstance()

  • {

  • if (m_pManager ==NULL){

  •   m_pManager = new GameUIManager();
    
  • }

  • return m_pManager;

  • }

  • void GameUIManager::openIdu(int idu)

  • {

  • GameUI * pGameUI = getGameUI(idu);

  • RootScene * pRoot = gRootScene;

  • if (pGameUI&&pRoot)

  • {

  •   pRoot->replaceLayer(pGameUI);
    
  • }

  • CCLOG(“NOT FIN IDU”);

  • }

  • GameUI * GameUIManager::getGameUI(int idu)

  • {

  • GameUI * pGameUI = NULL;

  • {

  •   switch ((EmGameIdu)idu)
    
  •   {
    
  •   case IDU_BOOT:
    
  •   	pGameUI = GameBoot::create(idu);
    
  •   	break;
    
  •   case IDU_ENETR_GAME:
    
  •   	pGameUI = GameEnter::create(idu);
    
  •   	break;
    
  •   }
    
  • }

  • return pGameUI;

  • }

  • GameUIRes负责读取csb文件

  • #ifndef GAME_UI_RES_H

  • #define GAME_UI_RES_H

  • #include “cocos2d.h”

  • USING_NS_CC;

  • #define gGameUIRes GameUIRes::getInstance()

  • enum EmGameIdu

  • {

  • IDU_BOOT=1,

  • IDU_ENETR_GAME,

  • };

  • class GameUIRes

  • {

  • public:

  • GameUIRes();

  • static GameUIRes * getInstance();

  • std::string getIDUResPath(int idu);

  • static GameUIRes * m_stGameUiRes;

  • virtual ~GameUIRes();

  • private:

  • __Dictionary* m_pGameUIXml;

  • private:

  • void loadXmlRes();

  • };

  • #endif

  • #include “GameUIRes.h”

  • #include “GameTool.h”

  • GameUIRes *GameUIRes::m_stGameUiRes = NULL;

  • GameUIRes::GameUIRes()

  • {

  • }

  • GameUIRes::~GameUIRes()

  • {

  • }

  • GameUIRes * GameUIRes::getInstance()

  • {

  • if (m_stGameUiRes == NULL)

  • {

  •   m_stGameUiRes = new GameUIRes();
    
  • }

  • return m_stGameUiRes;

  • }

  • std::string GameUIRes::getIDUResPath(int idu)

  • {

  • loadXmlRes();

  • //通过xml文件中的key获取value

  • std::string strGameCsb = ((String*)m_pGameUIXml->objectForKey(gGameTool->intToString(idu)))->getCString();

  • return strGameCsb;

  • }

  • void GameUIRes::loadXmlRes()

  • {

  • //创建词典类实例,将xml文件加载到词典中

  • m_pGameUIXml = Dictionary::createWithContentsOfFile(“Xml/LoadGameLayer.xml”);

  • }


  • ------------------------------------游戏切换
  • // create a scene. it’s an autorelease object
  • auto scene = RootScene::create();
  • // run
    
  • director->runWithScene(scene);
  • gGameUI->openIdu(EmGameIdu::IDU_BOOT);
  • ///////////////////////////////////////////////////////////只需要这一句就可以切换界面
  • gGameUI->openIdu

运行介绍

能不能排排版

太长了只看了第一点,你说的功能是不是ccUtils中的Node* findChild(Node* levelRoot, const std::string& name)

C++的Node*里面的getChildByName方法

简单的排了一下

你看ccUtils.cpp中的findchild是不是你要的功能

不是这个是从一个根节点寻找子节点

只看了第一点,从API接口的角度来说,要实现你的功能应该另起一个函数,次之加传入参数,而不是直接修改getChildByName,可以参考tinyxml。从项目来说,后面接手项目的人必踩这个坑:joy:

只看了一行代码
!name.empty() 改为了 name.empty() != 0 , 我坚定不移的认为这是退化.