Cocos2d-x中判断点击命中的几种方法

出自http://blog.sina.com.cn/s/blog_4458fdda0101g0xr.html


//重载

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=%.1f\n", 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=%.1f\n", touchPoint.x, touchPoint.y);

return true;

}

return false;

}

//______________________________________________________________________________________________

//用自己的坐标系相对于锚点进行判断

bool CTestLayer::checkTouchInSelf_AR(CCTouch *touch)

{

//方案二

//将点击点转换成自己坐标系中的坐标,相对于锚点

CCPoint ptAR = convertTouchToNodeSpaceAR(touch);

printf("ptAR.x=%.1f ptAR.y=%.1f\n", 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=%.1f\n", 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=%.1f\n", pt.x, pt.y);

//得到自己在父元素坐标系中的位置范围

CCRect rect=boundingBox();

printf("rect.l=%.1f, rect.b=%.1f, rect.r=%.1f, rect.t=%.1f\n",\

rect.getMinX(), rect.getMinY(), rect.getMaxX(), rect.getMaxY());    

//判断是否点击落在自己的范围当中, 以上判断全是在父元素坐标系中进行计算

if(rect.containsPoint(pt))

{

printf("ccTouchBegan x=%.1f y=%.1f\n", touchPoint.x, touchPoint.y);

return true;

}

return false;

}


你可能感兴趣的:(touch,触摸)