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

前端之家收集整理的这篇文章主要介绍了《不靠谱2.x》005.CCLayer(上)CCTouchDelegate前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、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提供了两类共八个回调接口。

原文链接:https://www.f2er.com/cocos2dx/342382.html

猜你在找的Cocos2d-x相关文章