Cocos2d-x中判断点击命中的几种方法
/重载 virtual bool ccTouchBegan(CCTouch *touch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *touch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *touch, CCEvent *pEvent); virtual void onEnter(); virtual void onExit(); //添加支持触摸事件 void CTestLayer::onEnter() { CCLayer::onEnter(); this->setTouchEnabled(true); CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); } void CTestLayer::onExit() { CCLayer::onExit(); CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); } //////////////////////////////////////////////////////////////////////////////////////////////// //用自己的坐标系相对于原点进行判断 bool checkTouchInSelf(CCTouch *touch); //用自己的坐标系相对于锚点进行判断 bool checkTouchInSelf_AR(CCTouch *touch); //用父元素坐标系及自己在父坐标中的位置进行判断 bool checkTouchInSelf_Parent(CCTouch *touch); //______________________________________________________________________________________________ //用自己的坐标系相对于原点进行判断 bool CTestLayer::checkTouchInSelf(CCTouch *touch) { //方案一 //将点击点转换成自己坐标系中的坐标,相对于0,0点 CCPoint pt = convertTouchToNodeSpace(touch); printf("pt.x=%.1f pt.y=%.1fn", pt.x, pt.y); int nw = getContentSize().width; int nh = getContentSize().height; CCRect rc(0, 0, nw, nh); if(rc.containsPoint(pt)) { //获得点击的OpenGL的世界坐标值 CCPoint touchPoint = touch->getLocation(); printf("ccTouchBegan x=%.1f y=%.1fn", touchPoint.x, touchPoint.y); return true; } return false; } //______________________________________________________________________________________________ //用自己的坐标系相对于锚点进行判断 bool CTestLayer::checkTouchInSelf_AR(CCTouch *touch) { //方案二 //将点击点转换成自己坐标系中的坐标,相对于锚点 CCPoint ptAR = convertTouchToNodeSpaceAR(touch); printf("ptAR.x=%.1f ptAR.y=%.1fn", ptAR.x, ptAR.y); CCPoint pp = this->getAnchorPoint(); int nw = getContentSize().width; int nh = getContentSize().height; int nx = -(nw * pp.x); int ny = -(nh * pp.y); CCRect rcar(nx, ny, nw, nh); if(rcar.containsPoint(ptAR)) { //获得点击的OpenGL的世界坐标值 CCPoint touchPoint = touch->getLocation(); printf("ccTouchBegan x=%.1f y=%.1fn", touchPoint.x, touchPoint.y); return true; } return false; } //______________________________________________________________________________________________ //用父元素坐标系及自己在父坐标中的位置进行判断 bool CTestLayer::checkTouchInSelf_Parent(CCTouch *touch) { //方案三 //获得点击的OpenGL的世界坐标值 CCPoint touchPoint = touch->getLocation(); //将点击的位置转换成父元素坐标系中的相对坐标 CCPoint pt=getParent()->convertToNodeSpace(touchPoint); printf("pt.x=%.1f, pt.y=%.1fn", pt.x, pt.y); //得到自己在父元素坐标系中的位置范围 CCRect rect=boundingBox(); printf("rect.l=%.1f, rect.b=%.1f, rect.r=%.1f, rect.t=%.1fn", rect.getMinX(), rect.getMinY(), rect.getMaxX(), rect.getMaxY()); //判断是否点击落在自己的范围当中, 以上判断全是在父元素坐标系中进行计算 if(rect.containsPoint(pt)) { printf("ccTouchBegan x=%.1f y=%.1fn", touchPoint.x, touchPoint.y); return true; } return false; }