Cocos2d-x 自定义可接收处理触摸消息精灵类
这篇文章将讲解一下如何自定义的创建精灵类,并且该精灵类可以接受和处理触摸信息。
本文涉及程序代码下载地址:点击打开链接
参考文章:http://blog.csdn.net/xzongyuan/article/details/9187825
下面从两个方面来记述:
一、自定义精灵类。
显然要继承自CCSprite这个类,然后实现一个创建该类对象的类方法就可以了,也就是类似CCSprite中的create方法,可以参照引擎中的源码实现(如下):
)
二、自定义精灵类接收和处理触摸信息
传统意义上说,我们都是在Layer中处理触摸信息的,但是实际上,我们可以通过继承 CCTargetedTouchDelegate 或者 CCStandardTouchDelegate 这两个触摸事件的委托代理类,实现其中相关的触摸回调方法就可以实现精灵类接受和处理触摸信息了。而这两个委托代理类的区别呢就是单点触摸(targeted)和多点触摸(standard)了。
1、下面选择继承 CCTargetedTouchDelegate ,处理单点触摸
在其onEnter方法中,注册触摸事件;在onExit方法中,删除该触摸事件。
virtualbool ccTouchBegan(CCTouch *touch,CCEvent *event); 这个方法:如何返回如果返回false,表示不处理ccTouchMoved(),ccTouchEnded(),ccTouchCanceld()方法,而交由后续接收触屏消息的对象处理;
如果返回true,表示会处理ccTouchMoved(),ccTouchEnded(),ccTouchCanceld()方法,并且消耗掉此触屏消息。
总结如下:
1.CCLayer 只有一层的情况:
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);a.返回false,则ccTouchMoved(),ccTouchEnded()不会再接收到消息b.返回true,则ccTouchMoved(),ccTouchEnded()可以接收到消息
2.CCLayer 有多层的情况:virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
a.返回false,则本层的ccTouchMoved(),ccTouchEnded()不会再接收到消息,但是本层之下的其它层会接收到消息b.返回true,则本层的ccTouchMoved(),ccTouchEnded()可以接收到消息,但是本层之下的其它层不能再接收到消息
3.有自定义接收触摸消息的精灵的情况:virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
a.返回false,则此精灵的ccTouchMoved(),ccTouchEnded()不会再接收到消息,而此精灵所在的层会接收到触摸消息(如果精灵所在层没有设置接收触摸消息,则向下传递)b.返回true,则此精灵的ccTouchMoved(),ccTouchEnded()会继续接收消息,并消耗此消息(即不再向所在层和其他层传递)
根据上面的总结第三点,如果我们的触摸点刚好落在自定义精灵范围内,那么返回true,此自定义的精灵对象的其他触摸回调方法也会接收这个触摸消息,继续处理。否则的话,返回false,此精灵所在的层会接受到这个触摸消息。
(3)接着就是创建自定义精灵类对象,然后添加到 layer 中
按照通常的方法,我们在layer的 init() 方法中创建和添加:
如果点击自定义的精灵对象区域,那么会有相应的显示:
②进入 CCLayer::onEnter(); 这个方法
大家看到没有呀! layer会遍历所有的子节点,然后调用执行其onEnter方法。
----- 哦,原来子节点的onEnter方法的执行是在CCLayer的onEnter方法里面呀!
-----------为了找到这个原因,我可是费了不少时间呀!算了,不吐槽了,说多了都是泪呀!
好,这个问题也解决了!关于这个问题呢,还有一个重要的启示:一般重载方法,都是要先调用父类的方法。
---要不然,你有时候会遇到一些十分莫名其妙的问题,我已经深有体会了。
本文涉及程序代码下载地址:点击打开链接