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
- cocos2dx之CCTouchTargetedDelegate、CCTouchStandardDelegate 吞噬触屏
- cocos2dx吞噬
- cocos2dx 触摸吞噬的实现
- 暗之魔法-吞噬
- cocos2dx 3.X 触摸吞噬功能
- cocos2dx 3.X 触摸吞噬功能
- cocos2dx、cocostudio的一些技术讨论一:触摸吞噬
- Cocos2dx 3.1.1 之 监听触屏事件
- cocos2dx-触屏事件
- cocos2dx-触屏事件
- 吞噬星空
- 吞噬算法
- cocos2dx之保存截屏图片
- cocos2dx之保存截屏图片
- cocos2dx之保存截屏图片
- 李翊 先吞噬后反刍,擒贼擒王--java之我注六经之二
- 先吞噬后反刍,擒贼擒王--java之我注六经之二
- 先吞噬后反刍,擒贼擒王--java之我注六经之二
- 架构设计的非侵入性原则
- Linux下matlab中文乱码的解决
- LZW压缩算法
- 20131218-第十一天
- c# 验证码生成
- cocos2dx之CCTouchTargetedDelegate、CCTouchStandardDelegate 吞噬触屏
- 一步一步重写 CodeIgniter 框架 (5) —— 实现Controller,并加载Model
- 从java apk中调用 Flex air apk 的方法
- android studio 用法记录 更新中....
- c++中string到int的转换
- tar压缩解压缩命令详解
- 关于Air端与android端的通信实现
- 白藜芦醇2
- 用Dojo实现Ajax请求:XHR、跨域、及其他(1)