在cocos2d-x中, touch事件分为两种:一种是单点事件, 另外一种是多点事件。html
单点事件对应的代理方法是:this
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); // optional virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
单击事件中touchBegan方法返回一个bool值, 若是为false, 则touchMoved, touchEnded, touchCancelled方法都将不会执行, 由于表示所在类不处理单击事件。spa
多点触屏对应的代理方法:代理
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);
多点触屏方法中传递参数再也不是一个具体的touch对象, 而是集合。htm
那么CCLayer的触屏事件处理方法是这样的, 由于CCLayer继承于CCTouchDelegate, 这是个基类, 子类还有CCTargetedTouchDelegate(单点触屏), CCStandardTouchDelegate(多点触屏)。因此CCLayer是能够简单来处理触摸事件的。对象
一、开启触摸功能blog
setTouchEnabled(true);
二、设置触摸的类型, CCLayer默认是设置为多点触摸。继承
setTouchMode(kCCTouchesAllAtOnce);//多点触摸 setTouchMode(kCCTouchesOneByOne);//单点触摸
三、接下来就是对应覆盖上面的方法了, 方法里面作触摸处理就能够了。事件
这是比较简单的处理, 若是你想优先处理本身的触摸事件, 那么你就覆盖CCLayer的一个方法, 好比rem
void TestLayer::registerWithTouchDispatcher() { CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher(); if( m_eTouchMode == kCCTouchesAllAtOnce ) { pDispatcher->addStandardDelegate(this, 0); } else { pDispatcher->addTargetedDelegate(this, 0, true); } }
add方法的第二个参数就是优先级, 你能够把你的优先级设置的较高一个。
若是是精灵处理触摸事件, 相对来讲代码多一些, 由于CCSprite类是没有继承于CCTouchDelegate或者其子类, 而是由咱们本身去继承。
下面是一个例子, 去掉了其余不相关的代码, 只保留触摸相关代码。
//TestSprite.h class TestSprite : public CCSprite, public CCTargetedTouchDelegate { public: virtual void onEnter(); virtual void onExit(); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); };
//TestSprite.cpp void TestSprite::onEnter() { CCSprite::onEnter(); // add targeted delegate CCTouchDispatcher* dispatcher = CCDirector::sharedDirector()->getTouchDispatcher(); dispatcher->addTargetedDelegate(this, 0, true); } void TestSprite::onExit() { // remove targeted delegate CCTouchDispatcher* pDispatcher = CCDirector::sharedDirector()->getTouchDispatcher(); pDispatcher->removeDelegate(this); CCSprite::onExit(); } bool TestSprite::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { //do something... return false; }
首先, 咱们本身定义的精灵类须要继承于CCTouchDelegate或者其子类, 其次在onEnter和onExit方法中把本身的类加入和移除触摸分发管理类中, 这个添加和移除必须对应着, 而后覆盖触摸处理方法就能够了。上面的例子是处理单点触摸的, 多点触摸相似, 不赘述了。
在处理CCLayer的触摸的时候咱们并无手动移除delegate, 那是由于CCLayer帮咱们作了这个事情。
cocos2d-x中的触摸处理方法就写到这里, 欢迎拍砖!
注: 本文由啸寒原著,请支持原著!转载请附上原文连接: http://www.cnblogs.com/xiaohan-wu/p/3187994.html