游戏暂停时的屏蔽触摸
想让游戏暂停。仅仅要调用 CCDirector::sharedDirector()->pause(); 即可了,反止又一次游戏就是 CCDirector::sharedDirector()->resume();
但这有一个问题就是游戏层依旧能接受触摸反应,我们想按下pause键游戏暂停,但游戏内容不再接受触摸。该怎么办呢?
pause键通常是CCMenu, 它的触摸优先级为-128 数值越小越优先。
所以我们想到的是游戏暂停的时候在游戏GameLayer层上加一个看不见的层,估且叫NoTouchLayer吧,让它屏蔽一切触摸。此类实现例如以下:
#pragma once
#include "cocos2d.h"
class NoTouchLayer : public cocos2d::CCLayer
{
public:
virtual bool init();
CREATE_FUNC(NoTouchLayer);
virtual void registerWithTouchDispatcher();
virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
};#include "NoTouchLayer.h"
USING_NS_CC;
bool NoTouchLayer::init()
{
if (!CCLayer::init())
{
return false;
}
setTouchEnabled(true);
return true;
}
void NoTouchLayer::registerWithTouchDispatcher()
{
//优先级低于-128(CCMenu),同一时候高于其它层(0),true表示吞噬触摸 这样就屏敝了其它层的触摸
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -127, true);
CCLayer::registerWithTouchDispatcher();
}
bool NoTouchLayer::ccTouchBegan (CCTouch *pTouch, CCEvent *pEvent)
{
return true; //返回true接受触摸
}
void NoTouchLayer::ccTouchMoved (CCTouch *pTouch, CCEvent *pEvent)
{
}
void NoTouchLayer::ccTouchEnded (CCTouch *pTouch, CCEvent *pEvent)
{
}使用的时候很easy,游戏暂停时addChild,恢复时removeChild即可了,例如以下:
游戏暂停时:
CCDirector::sharedDirector()->pause(); //屏蔽一切触摸方应,此屏可以屏蔽一切触摸 noTouchLayer = NoTouchLayer::create(); this->addChild(noTouchLayer);
从暂停状态恢复:
CCDirector::sharedDirector()->resume(); this->removeChild(noTouchLayer, true);这个noTouchLayer可在GameLayer的头文件里声音为一个成员变量
浙公网安备 33010602011771号