cocos2d-x中处理touch事件

在cocos2d-x中, touch事件分为两种:一种是单点事件, 另一种是多点事件。

单点事件对应的代理方法是:

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方法都将不会执行, 因为表示所在类不处理单击事件。

多点触屏对应的代理方法:

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对象, 而是集合。

那么CCLayer的触屏事件处理方法是这样的, 因为CCLayer继承于CCTouchDelegate, 这是个基类, 子类还有CCTargetedTouchDelegate(单点触屏), CCStandardTouchDelegate(多点触屏)。所以CCLayer是可以简单来处理触摸事件的。

1、开启触摸功能

setTouchEnabled(true);

2、设置触摸的类型, CCLayer默认是设置为多点触摸。

setTouchMode(kCCTouchesAllAtOnce);//多点触摸
setTouchMode(kCCTouchesOneByOne);//单点触摸

3、接下来就是对应覆盖上面的方法了, 方法里面做触摸处理就可以了。

这是比较简单的处理, 如果你想优先处理自己的触摸事件, 那么你就覆盖CCLayer的一个方法, 比如

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

原文地址:https://www.cnblogs.com/xiaohan-wu/p/3187994.html