一、CCtouch
在了解CCtouchDelegate之前,先了解一下CCtouch、CCEvent和CCSet。这里先对CCtouch进行了解。源码如下:
class CC_DLL CCtouch : public CCObject{public: CCtouch() : m_nID(0),m_startPointCaptured(false) {} CCPoint getLocation() const; CCPoint getPrevIoUsLocation() const; CCPoint getStartLocation() const; CCPoint getDelta() const; //获得UI参考系下的坐标,即左上角为原点 CCPoint getLocationInVIEw() const; CCPoint getPrevIoUsLocationInVIEw() const; CCPoint getStartLocationInVIEw() const; voID settouchInfo(int ID,float x,float y) { m_nID = ID; m_prevPoint = m_point; m_point.x = x; m_point.y = y; if (!m_startPointCaptured) { m_startPoint = m_point; m_startPointCaptured = true; } } /** * @Js getID */ int getID() const { return m_nID; }private: int m_nID; bool m_startPointCaptured; CCPoint m_startPoint; CCPoint m_point; CCPoint m_prevPoint;};
1.CCtouch看名字就知道是触摸对象类,因此不出意外的都是和获得触摸位置相关的方法。
2.可以看到属性被隐藏起来,只能通过执行方法来获取属性,这种设计的目的应该是为了保护类的完整性。
3.经常可以看到的处理手法是:先获得触摸对象坐标,然后再将该坐标与其他对象的包围盒进行比较,以判断是否触摸到。
三、CCSet
CCSet是对C++标准库std::set的二次封装。而且在原有功能的基础上,添加了额外的内存管理方法,使其存管理更方便安全。源码如下:
typedef std::set<CCObject *>::iterator CCSetIterator;class CC_DLL CCSet : public CCObject{public: CCSet(voID); CCSet(const CCSet &rSetobject); virtual ~CCSet(voID); static CCSet * create(); CCSet* copy(); CCSet* mutablecopy(); int count(); voID addobject(CCObject *pObject); voID removeObject(CCObject *pObject); voID removeAllObjects(); bool containsObject(CCObject *pObject); CCSetIterator begin(); CCSetIterator end(); CCObject* anyObject(); virtual voID acceptVisitor(CcdataVisitor &visitor);private: std::set<CCObject *> *m_pSet;};
1.std::set作为容器显然应该具有这些方法:添加元素、获取元素、删除元素、插入元素、获取元素数目。基本上所有容器都应该有这些方法,即便没有也可以通过已知方法很方便地封装一个。然后再来看看源码,的确如此。
2.除此之外,还多了三个方法:返回第一/最后一个元素的迭代器、返回第一个元素(如果有则返回;如果没有则返回 NulL)。
3.使用例子:
CCSetIterator iter = ptouches->begin(); for (; iter != ptouches->end(); iter++) { CCtouch* ptouch = (CCtouch*)(*iter); //其他 *** 作 }
四、CCtouchDelegate
终于轮到CCtouchDelegate了。说实话,开始分析cclayer的时候,发现光CCtouchDelegate就有这么多内容的时候,心里面是有点害怕和反感的。但是这么一步一步的看下来,发现要比想象中的容易得多。CCtouchDelegate.h 文件中一共有三个类:CCtouchDelegate、CCTargetedtouchDelegate、CCStandardtouchDelegate。先来看CCtouchDelegate的源码:
class CC_DLL CCtouchDelegate { public: CCtouchDelegate() {} virtual ~CCtouchDelegate() { } virtual bool cctouchBegan(CCtouch *ptouch,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouch); CC_UNUSED_ParaM(pEvent); return false;}; // optional virtual voID cctouchmoved(CCtouch *ptouch,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouch); CC_UNUSED_ParaM(pEvent);} virtual voID cctouchended(CCtouch *ptouch,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouch); CC_UNUSED_ParaM(pEvent);} virtual voID cctouchCancelled(CCtouch *ptouch,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouch); CC_UNUSED_ParaM(pEvent);} // optional virtual voID cctouchesBegan(CCSet *ptouches,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouches); CC_UNUSED_ParaM(pEvent);} virtual voID cctouchesMoved(CCSet *ptouches,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouches); CC_UNUSED_ParaM(pEvent);} virtual voID cctouchesEnded(CCSet *ptouches,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouches); CC_UNUSED_ParaM(pEvent);} virtual voID cctouchesCancelled(CCSet *ptouches,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouches); CC_UNUSED_ParaM(pEvent);} };
1.通过注释可以知道这些代理方法都是可选的。
2.可以看到方法的实现直接在定义时就写了,具体实现看不懂,暂时也不用细究。
3.本质上都是回调方法,参数中只有个CCtouch有用,但是已经足够了。
4.可以明显地发现八个方法可以分为两类:一类只接受单点触摸;另一类接受多点触摸。
CCTargetedtouchDelegate源码如下:
class CC_DLL CCTargetedtouchDelegate : public CCtouchDelegate { public: virtual bool cctouchBegan(CCtouch *ptouch,CCEvent *pEvent) { CC_UNUSED_ParaM(ptouch); CC_UNUSED_ParaM(pEvent);return false;}; // optional virtual voID cctouchmoved(CCtouch *ptouch,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouch); CC_UNUSED_ParaM(pEvent);} };
1.继承自CCtouchDelegate,截取了其中和单点触摸有关的四个方法。
2.如果项目只需要单点触摸,只继承这个代理显然更准确。当然,非要继承CCtouchDelegate也行。只是不知道是否有差别,暂不细究。
CCStandardtouchDelegate源码如下:
class CC_DLL CCStandardtouchDelegate : public CCtouchDelegate { public: // optional virtual voID cctouchesBegan(CCSet *ptouches,CCEvent *pEvent) {CC_UNUSED_ParaM(ptouches); CC_UNUSED_ParaM(pEvent);} };
1.多点触摸,不多解释了。
五、总结: 1.了解了CCtouch、CCEvent和CCSet,为了解CCtouchDelegate打下基础。 2.了解了CCtouchDelegate提供了两类共八个回调接口。
总结以上是内存溢出为你收集整理的《不靠谱2.x》005.CCLayer(上)CCTouchDelegate全部内容,希望文章能够帮你解决《不靠谱2.x》005.CCLayer(上)CCTouchDelegate所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)