zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    lintcode197- Permutation Index- easy
    lintcode10- String Permutation II- medium
    lintcode211- String Permutation- easy
    lintcode51- Previous Permutation- medium
    lintcode52- Next Permutation- medium
    lintcode108- Palindrome Partitioning II- medium
    lintcode136- Palindrome Partitioning- medium
    lintcode153- Combination Sum II- medium
    lintcode521- Remove Duplicate Numbers in Array- easy
    lintcode135- Combination Sum- medium
  • 原文地址:https://www.cnblogs.com/xiaohan-wu/p/3187994.html
Copyright © 2011-2022 走看看