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;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章