您的位置:首页 > 移动开发 > Cocos引擎

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

2014-09-10 20:06 369 查看
出自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 触摸