先来第一点吧:
-
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


