Cocos2d-X 学习笔记 22 CCLayer 界面Touch事件处理

前端之家收集整理的这篇文章主要介绍了Cocos2d-X 学习笔记 22 CCLayer 界面Touch事件处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Cocos2d 开发中提供了两种touch处理方式,Standard Touch Delegate和 Targeted Touch Delegate方式(参见CCTouchDelegateProtocol.h中源代码),CCLayer默认是采用第一种方式(参见CCLayer的 registerWithTouchDispatcher方法)。在源码中可以看见CCLayer继承了CCTouchDelegate

@H_404_7@

@H_404_7@class CC_DLL CCLayer : public CCNode,public CCTouchDelegate,public CCAccelerometerDelegate,public CCKeypadDelegate

@H_404_7@CCLayer中有一个@H_404_7@ccTouchesMode 变量用来管理是单点触摸还是多点触摸。@H_404_7@ccTouchesMode的定义如下:

@H_404_7@typedef enum {
kCCTouchesAllAtOnce,
kCCTouchesOneByOne,
} ccTouchesMode;

@H_404_7@其中@H_404_7@kCCTouchesAllAtOnce表示单点触摸,也就是cocos2dx默认的,@H_404_7@kCCTouchesOneByOne表示多点触摸。在CCLayer.cpp源码文件的构造函数中我们可以看见默认设置:

CCLayer::CCLayer()
: m_bTouchEnabled(false)
,m_bAccelerometerEnabled(false)
,m_bKeypadEnabled(false)
,m_pScriptTouchHandlerEntry(NULL)
,m_pScriptKeypadHandlerEntry(NULL)
,m_pScriptAccelerateHandlerEntry(NULL)
,m_nTouchPriority(0)
,m_eTouchMode(kCCTouchesAllAtOnce)
{
m_bIgnoreAnchorPointForPosition = true;
setAnchorPoint(ccp(0.5f,0.5f));
}

@H_404_7@@H_404_7@在源码CCLayer中就有函数@H_404_7@setTouchMode用来设置两种模式:

@H_404_7@void CCLayer::setTouchMode(ccTouchesMode mode)
{
if(m_eTouchMode != mode)
{
m_eTouchMode = mode;

if( m_bTouchEnabled)
{
setTouchEnabled(false);
setTouchEnabled(true);
}
}
}

@H_404_7@

@H_404_7@所以,我们在继承的CCLayer类中,只需要调用函数就可以改变单点还是多点触摸。在源码的CCLayer中还有一个变量用来控制是否可以响应用户的触摸变量m_bTouchEnabled。@H_404_7@要响应触摸还得设置@H_404_7@m_bTouchEnabled为true。对应也有一个设置函数

@H_404_7@/// isTouchEnabled setter
void CCLayer::setTouchEnabled(bool enabled)
{
if (m_bTouchEnabled != enabled)
{
m_bTouchEnabled = enabled;
if (m_bRunning)
{
if (enabled)
{
this->registerWithTouchDispatcher();
}
else
{
// have problems?
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}
}
}
}

@H_404_7@可以看出在设置触摸是否可用时,调用了本地的@H_404_7@registerWithTouchDispatcher函数

@H_404_7@/// Touch and Accelerometer related


void CCLayer::registerWithTouchDispatcher()
{
CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher();


// Using LuaBindings
if (m_pScriptTouchHandlerEntry)
{
if (m_pScriptTouchHandlerEntry->isMultiTouches())
{
pDispatcher->addStandardDelegate(this,0);
LUALOG("[LUA] Add multi-touches event handler: %d",m_pScriptTouchHandlerEntry->getHandler());
}
else
{
pDispatcher->addTargetedDelegate(this,
m_pScriptTouchHandlerEntry->getPriority(),
m_pScriptTouchHandlerEntry->getSwallowsTouches());
LUALOG("[LUA] Add touch event handler: %d",m_pScriptTouchHandlerEntry->getHandler());
}
}
else
{
if( m_eTouchMode == kCCTouchesAllAtOnce ) {
pDispatcher->addStandardDelegate(this,0);
} else {
pDispatcher->addTargetedDelegate(this,m_nTouchPriority,true);
}
}
}

@H_404_7@

@H_404_7@可知,根据@H_404_7@m_eTouchMode 的类型调用的CCDirector的@H_404_7@CCTouchDispatcher变量来注册通知

@H_404_7@

@H_404_7@所以我们有两种方法可以再自己的CCLayer中来响应触摸。

@H_404_7@方法1:

@H_404_7@setTouchMode(kCCTouchesAllAtOnce);//单点触摸
setTouchEnabled(true);

@H_404_7@

@H_404_7@@H_404_7@setTouchMode(@H_404_7@kCCTouchesOneByOne);//多点触摸
@H_404_7@setTouchEnabled(true);

@H_404_7@方法二:

@H_404_7@CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0); //单点触摸

@H_404_7@ CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,true); //多点触摸

@H_404_7@然后我们只需要根据要求来重写delegate函数

@H_404_7@ //多点触摸

@H_404_7@ virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent); virtual void ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent); //单点 virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent); virtual void ccTouchesMoved(CCSet *pTouches,CCEvent *pEvent); virtual void ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent); virtual void ccTouchesCancelled(CCSet *pTouches,CCEvent *pEvent);

猜你在找的Cocos2d-x相关文章