《不靠谱2.x》005.CCLayer(上)CCTouchDelegate

《不靠谱2.x》005.CCLayer(上)CCTouchDelegate,第1张

概述一、CCTouch        在了解CCTouchDelegate之前,先了解一下CCTouch、CCEvent和CCSet。这里先对CCTouch进行了解。源码如下: class CC_DLL CCTouch : public CCObject{public: CCTouch() : m_nId(0), m_startPointCaptured(f

一、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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1063121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存