cocos2d-x 3.2 最上层layer
在 cocos2d-x 开发中,有时我们需要添加一个最上层的 Layer(顶层 Layer),这里的最上层是指不会因为 Scene 的切换而被切换掉的层。下面我们将详细介绍如何为 cocos2d-x 添加最上层 Layer。
1. 修改 Director 类
1.1 在 Director 头文件中添加成员变量和方法声明
在 Director 的头文件里添加以下内容:
CCLayer *m_pTopLayer;
// set the topLayer
void setTopLayer(CCLayer *layer);
1.2 在 Director 的 .cpp 文件中实现 setTopLayer 方法
void CCDirector::setTopLayer(CCLayer *layer)
{
m_pTopLayer = layer;
}
1.3 在 drawScene 方法中添加绘制顶层 Layer 的代码
若要让顶层 Layer 显示在设备上,需要在 drawScene(void) 方法里加入以下代码:
// draw the top layer
if (m_pTopLayer) {
m_pTopLayer->visit();
}
至此,Director 的修改完成。
2. 编写顶层 Layer 类 WindyTopLayer
2.1 WindyTopLayer.h 文件
#ifndef __HeroLegend__WindyTopLayer__
#define __HeroLegend__WindyTopLayer__
#include "cocos2d.h"
class WindyTopLayer : public cocos2d::CCLayer
{
/// @{
/// @name constructors
public:
CREATE_FUNC(WindyTopLayer);
WindyTopLayer();
virtual ~WindyTopLayer();
static WindyTopLayer *getInstace();
/// @} end constructors
/// @{
/// @name methods
public:
bool init();
void addNode(cocos2d::CCNode* node);
void showUI();
void removeUI();
/// @} end methods
};
#endif /* defined(__HeroLegend__WindyTopLayer__) */
2.2 WindyTopLayer.cpp 文件
#include "WindyTopLayer.h"
USING_NS_CC;
static WindyTopLayer* m_topLayer = NULL;
WindyTopLayer::WindyTopLayer()
{
}
WindyTopLayer::~WindyTopLayer()
{
}
WindyTopLayer *WindyTopLayer::getInstace()
{
if (m_topLayer == NULL) {
m_topLayer = WindyTopLayer::create();
m_topLayer->retain();
}
return m_topLayer;
}
bool WindyTopLayer::init()
{
if (!CCLayer::init()) {
return false;
}
return true;
}
void WindyTopLayer::addNode(cocos2d::CCNode* node)
{
addChild(node);
showUI();
}
void WindyTopLayer::showUI()
{
if (m_topLayer) {
m_topLayer->onEnter();
CCDirector::sharedDirector()->setTopLayer(m_topLayer);
}
}
void WindyTopLayer::removeUI()
{
m_topLayer->removeAllChildren();
m_topLayer->onExit();
CCDirector::sharedDirector()->setTopLayer(NULL);
m_topLayer->removeFromParent();
}
以上代码的逻辑较为基础,相信大家都能理解。通过上述步骤,我们就可以在 cocos2d-x 中添加一个不会因 Scene 切换而改变的顶层 Layer 了。