1.Layer接收触屏消息
设置触屏事件
- CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(
- this,//在那个类中实现触屏回调函数
- 0, //优先级
- true);//触摸时间是否被该目标截获
注册回调函数
- virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
- virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
- virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
- virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
判断自定义Sprite是否被点击,两种判断方式
1)得到触屏所在位置,根据精灵所在位置的矩形区域和触屏的点判断是否包含。
CCRect GameObjHero::rect()
{
CCSize s = CCSizeMake(100,125);
return CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
}
然后在每次点击的时候都需要将当前触屏位置转换为GL坐标的位置,然后和Sprite所在矩形做包含判断
bool GameObjHero::containsTouchLocation(CCTouch *touch)
{
CCPoint touchPoint = touch->locationInView(touch->view());
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
return CCRect::CCRectContainsPoint(rect(), touchPoint);
}
2)
cocos2d为我们提供了一种相对简单的方法,原理类似,调用CCNode中定义的convertTouchToNodeSpaceAR()方法,将触屏点转化为相对于结点的相对坐标
bool GameObjHero::containsTouchLocation(CCTouch* touch)
{
return CCRect::CCRectContainsPoint(rect(), convertTouchToNodeSpaceAR(touch));
}
3. 触摸函数传递顺序
1) cclayer一层
virtual bool ccTouchBegan(CCTouch *touch, CCEvent *event);返回值为true时,处理ccTouchMoved(),ccTouchEnded(),ccTouchCanceld()方法。为false时则不处理。
cclayer多层
a.返回false,则本层的ccTouchMoved(),ccTouchEnded()不会再接收到消息,但是本层之下的其它层会接收到消息
b.返回true,则本层的ccTouchMoved(),ccTouchEnded()可以接收到消息,但是本层之下的其它层不能再接收到消息
2)自定义接收触摸消息的精灵的情况
a.返回false,则此精灵的ccTouchMoved(),ccTouchEnded()不会再接收到消息,而此精灵所在的层会接收到触摸消息(如果精灵所在层没有设置接收触摸消息,则向下传递)
b.返回true,则此精灵的ccTouchMoved(),ccTouchEnded()会继续接收消息,并消耗此消息(即不再向所在层和其他层传递)