cocos2dx之CCTouchTargetedDelegate、CCTouchStandardDelegate 吞噬触屏

来源:互联网 发布:linux基本知识 编辑:程序博客网 时间:2024/05/17 03:23

为了搞懂这个两个到底是咋回事,花费了我一天的功夫,没有办法,我人很笨的,在网上找了好多资料都没有找到关于吞噬触屏,也就是在一个Scene下,多个layer直接如何进行消息的传递和吞噬的。

好了,废话不多说,先来了解这个两个"禽兽"吧!

CCTouchTargetedDelegate,属于单点触屏,CCTouchStandardDelegate,属于多点触屏

我们在实现自己的触屏的时候,需要重现他们的几个函数:

    // default implements are used to call script callback if exist    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);    // default implements are used to call script callback if exist    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);

上面是需要重写的几个触屏消息方法。

我们一步步来:

首先,假如我们在当前的Scene中,有两个或者更多的layer,这里我就只举例为2个layer,即layer1,layer2

我们分别在layer1,layer2中注册消息代理,

分别在layer1,layer2中的onEnter中的添加,设置为可触屏:

void MyTouchTargetedLayer1::onEnter() {    MyTouchLayerBase::onEnter();    this->setTouchEnabled(true);}

void MyTouchTargetedLayer2::onEnter() {    MyTouchLayerBase::onEnter();    this->setTouchEnabled(true);}

好了,我们该写注册我们的消息代理了,在创建layer1,layer2的时候,分别设置他们的层次为:

    this->addChild(layer1, 2);    this->addChild(layer2, 1);

也就是layer1在layer2之上!

关键处:

我希望在layer1上ccTouchMoved的时候,我希望只layer2的ccTouchMoved-------->这就是说:我们穿透(吞噬掉了layer1的ccTouchMoved),这个时候我们只需要设置

layer1的注册消息代理为:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
第三个参数为true;

bool MyTouchTargetedLayer1::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {    return false;}

这样就可以了,我在
MyTouchTargetedLayer1::ccTouchBegan

返回false就是不让它在本层再执行其他的消息了!如果你返回true,那么我们都只会执行layer1的消息了。


这就实现了触屏消息吞噬了。


但是我们的注册消息的第三个参数为false是什么情况呢?我们继续验证一下:

这个时候,不管你的:

bool MyTouchTargetedLayer1::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {    return true;}

这个上面的返回值不管是true还是false,都会被吞噬,而且都会执行到它的所有消息,当然这个必须在ccTouchBegan返回true的时候才会执行其他的,比如ccTouchMoved之类的了(这个与前面一句可能有点绕,我这样写也不知道是不是多此一举了,本身ccTouchBegan返回false的话,其他消息都不会执行)。


好了,讲完了,刚开始看这个半天没搞明白,还是群里的一个好心人告诉我的,当时也没有理解,然后自己没事再去看书仔细想了一下,终于搞懂了,在这非常谢谢他!



0 0