cocos2d-x sprite触摸处理

转自:http://www.cnblogs.com/lancidie/archive/2013/04/01/2993890.htmlhtml

咱们经常须要判断用户的点击操做是否落于某个sprite之上,进而让这个sprite作出响应。程序员

可是若是咱们经过继承CCSprite类来实现本身的Sprite类的时候,产生的视图尺寸会充满屏幕。多个Sprite在同一层的时候会发生重叠,致使咱们经过回调函数传递进的touch点是相对于最上层Sprite来讲的。函数

好在咱们能够经过CCDirector::sharedDirector()->convertToGL(CCTouch* touch->locationInView());的方法来得到touch point的绝对坐标。而后经过遍历屏幕上全部的sprite,依次检查落点来判断用户点击应该被哪一个Sprite接受。this

但其实Cocos2d-x已经为咱们提供了一个很是方便的方法来判断用户点击了哪一个Sprite。spa

假如在这里咱们有一个MySprite继承了CCSprite,同时为了响应点击事件,咱们还须要继承CCTargetedTouchDelegate
后者这个类为咱们提供了三个virtual的回调函数:
code

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMove(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);

这三个函数分别在用户“点击”,“点击拖动”,“抬起手指”的时候被调用。htm

其中ccTouchBegan函数的返回值是bool类型,其缘由就是系统会根据该回调函数的返回值来判断点击消息是否已经传递给用户须要的Sprite。blog

具体点儿:若是该回调函数返回true,说明程序员已经认为须要接受到这个触摸消息的Sprite已经接收到了这个触摸消息。那么程序的触摸消息传递就会到此为止,只在本层被使用(也会被本层的ccTouchMove,ccTouchEnded所使用)。若是返回false,说明这个触摸消息并无传递到须要接受这个消息的Sprite中去,这时系统会将这个触摸消息传递到下一层Sprite,而且由这一层的ccTouchBegan来处理这个消息。继承

贴个示例代码:事件

bool MySprite::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){
    if(containsTouchLocation(touch)){
        cout<<"Touch:"<<this->getTag()<<endl;
        return true;
    }
    return false;
}

其中containsTouchLocation是用户本身实现的:经过在该函数中获取position,并与传递进函数的touch做比较,判断用户的触摸操做是否落于该sprite区域以内。

若是落在该区域,则返回true,中断这个消息链。同时这个sprite会相应相应的ccTouchMove,ccTouchEnded若是没有落在该区域,则返回false,而且将这个消息传递给下一层的sprite。

相关文章
相关标签/搜索