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