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;
}


發佈了7 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章