新手指导可直接用 (包含2.x和3.x)

2.x (例子)/*****************************************************************
#ifndef GUIDELAYER_H
#define GUIDELAYER_H
#include “cocos2d.h”
USING_NS_CC;
class GuideLayer_ : public CCLayer
{
public:
GuideLayer_();
~GuideLayer_();

bool init(const char *pszFileName, CCNode* node);
static GuideLayer_* CreateStep(const char *pszFileName, CCNode* node);

public:
CCClippingNode* m_clipping;
GuideLayer_* mGuideLayer;
public:
void registerWithTouchDispatcher();
bool ccTouchBegan(CCTouch * touch, CCEvent * evt);
void onExit();
};
#endif
/****************************************************************
#include “GuideLayer_.h”

GuideLayer_::GuideLayer_()
{
}

GuideLayer_::~GuideLayer_()
{
}

GuideLayer_* GuideLayer_::CreateStep(const char pszFileName, CCNode node)
{
GuideLayer_* pRet = new GuideLayer_;
if (pRet && pRet->init(pszFileName, node))
{
pRet->autorelease();
}
else
{
CC_SAFE_DELETE(pRet);
}
return pRet;
}

bool GuideLayer_::init(const char pszFileName, CCNode node)//当前需要加新手引导的图片和新手引导的位置
{
if (!CCNode::init())
{
return false;
}
mGuideLayer = this;
//创建一个遮罩层
CCLayerColor * layer = CCLayerColor::create(ccc4(0, 0, 0, 150));
//创建一个裁剪节点
m_clipping = CCClippingNode::create();
this->addChild(m_clipping);
//设置一些属性
m_clipping->addChild(layer);
m_clipping->setInverted(true);
m_clipping->setAlphaThreshold(0);

/*****************/
CCNode * stencil = NULL;
stencil = CCSprite::create(pszFileName);
stencil->setPosition(node->getPosition());
//添加模板
m_clipping->setStencil(stencil);
/******************/
return true;

}
void GuideLayer_::registerWithTouchDispatcher()
{
//CCMenu的优先级是-128,而CCControlButton的优先级是0,这里的优先级至少要和helloWorld场景层中的
//优先级一样大,也可以设置为0,因为新手引导层是最后添加上去的,所以最先收到触摸的消息
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, INT_MIN + 1, true);
}
bool GuideLayer_::ccTouchBegan(CCTouch * touch, CCEvent * evt)
{
//获取当前的模板
CCNode* stencil = m_clipping->getStencil();
CCRect m_rect = stencil->boundingBox();
CCPoint touchPoint = CCDirector::sharedDirector()->convertToGL(touch->getLocationInView());

if (m_rect.containsPoint(touchPoint))
{
    this->removeFromParent();
    if (CCDirector::sharedDirector()->isPaused())
    {
        CCDirector::sharedDirector()->resume();
    }
    return false;
}

}
void GuideLayer_::onExit()
{
CCNode::onExit();
}
效果图

3.x (例子)///////////////////////////////////////////////////////////////////////////////////
#ifndef GUIDELAYER_H
#define GUIDELAYER_H
#include “cocos2d.h”
USING_NS_CC;

class GuideLayer: public Node
{
public:
GuideLayer();
~GuideLayer();

bool init(const std::string& filename, Node* node);
static GuideLayer* CreateStep(const std::string& filename, Node* node);

public:
ClippingNode* m_clipping;
EventListenerTouchOneByOne* m_listener;
GuideLayer* mGuideLayer;
public:
bool onTouchBegan(Touch* touch, Event* event);
void onExit();
};
#endif

/////////////////////////////////////////////////////////////////
#include “GuideLayer.h”

GuideLayer::GuideLayer()
{
}

GuideLayer::~GuideLayer()
{
}

GuideLayer* GuideLayer::CreateStep(const std::string& filename, Node* node/enum STEP step/)
{
GuideLayer* pRet = new GuideLayer;
if (pRet && pRet->init(filename,node))
{
pRet->autorelease();
}
else
{
CC_SAFE_DELETE(pRet);
}
return pRet;
}

bool GuideLayer::init(const std::string& filename, Node* node)//当前需要加新手引导的图片和新手引导的位置
{
if (!Node::init())
{
return false;
}
mGuideLayer = this;
//创建一个遮罩层
LayerColor * layer = CCLayerColor::create(ccc4(0, 0, 0, 150));
//创建一个裁剪节点
m_clipping = ClippingNode::create();
this->addChild(m_clipping);
//设置一些属性
m_clipping->addChild(layer);
m_clipping->setInverted(true);
m_clipping->setAlphaThreshold(0);

/*****************/
Node * stencil = nullptr;
stencil = Sprite::create(filename);
stencil->setPosition(node->getPosition());
//添加模板
m_clipping->setStencil(stencil);
/******************/
m_listener = EventListenerTouchOneByOne::create();
m_listener->onTouchBegan = CC_CALLBACK_2(GuideLayer::onTouchBegan, this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(m_listener, this);

return true;

}

bool GuideLayer::onTouchBegan(Touch* touch, Event* event)
{
//获取当前的模板
Node* stencil = m_clipping->getStencil();
Rect m_rect = stencil->boundingBox();
Vec2 touchPoint = Director::getInstance()->convertToGL(touch->getLocationInView());
m_listener->setSwallowTouches(false);

if (m_rect.containsPoint(touchPoint))
{
    this->removeFromParent();
    if (Director::getInstance()->isPaused())
    {
        Director::getInstance()->resume();
    }
    return false;
}
else
{
    m_listener->setSwallowTouches(true);
    return true;
}

}
void GuideLayer::onExit()
{
Node::onExit();
}