一般情況下,如果要檢測某一個精靈是否被點中,做法如下
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent)
{
CCSize sprSize = pSpr->getContentSize();
CCPoint point = pSpr->convertTouchToNodeSpace(pTouch);
if (CCRectMake(0, 0, sprSize.width, sprSize.height).containsPoint(point)) {
CCLOG("點中");
}
returntrue;
}
上述方法判斷的都是矩形區域,包括透明的部分點擊也是有效的,如果要製作上面的八卦按鈕,就不好辦了。
這樣就引出了下面的實現方式,做兩張圖,這兩張圖一樣大,疊在一起正好是一個完整的八卦。
點擊的時候判斷點擊的區域是否是透明的,如果不是透明的就響應事件!如果是透明的就向下傳遞。
如何獲取點擊的區域是否透明呢?創建一個CCRenderTexture,把當前的Sprite畫上去,然後通過CCRenderTexture得到一個CCImage,然後在取到CCImage裏面某一個點得像素信息。
獲取點是否是透明的,我封裝了兩個函數,具體實現代碼如下
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent)
{
CCSize sprSize = pSpr->getContentSize();
CCPoint point = pSpr->convertTouchToNodeSpace(pTouch);
if (CCRectMake(0, 0, sprSize.width, sprSize.height).containsPoint(point)) {
int i = getOpacityWithPoint(pSpr, point);
if (i > 0) {
CCLog("點中");
}
}
returntrue;
}
int HelloWorld::getOpacityWithPoint(cocos2d::CCSprite *pSpr, cocos2d::CCPoint point)
{
point.y = pSpr->getContentSize().height-point.y;
CCImage * pImage = createImageFromSprite(pSpr);
ccColor4B c = pImage->getColor4B(point.x, point.y);
CCLog("%d, %d, %d, %d", c.r, c.g, c.b, c.a);
return c.a;
}
cocos2d::CCImage* HelloWorld::createImageFromSprite(cocos2d::CCSprite *pSpr)
{
CCSprite* pNewSpr = CCSprite::createWithSpriteFrame(pSpr->displayFrame());
pNewSpr->setAnchorPoint(CCPointZero);
CCRenderTexture* pRender = CCRenderTexture::create(pNewSpr->getContentSize().width, pNewSpr->getContentSize().height, kCCTexture2DPixelFormat_RGBA8888);
pRender->begin();
pNewSpr->visit();
pRender->end();
return pRender->newCCImage();
}
忘記把CCImage中添加的代碼貼出來了
在CCImage.h文件中加入如下函數
public:
ccColor4B getColor4B(float x, float y)
{
ccColor4B color = { 0, 0, 0, 0 };
int ix = (int)x - 1;
int iy = (int)y - 1;
m_pData += (iy*getWidth() + ix) * 4;
color.r = *(m_pData++);
color.g = *(m_pData++);
color.b = *(m_pData++);
color.a = *(m_pData++);
return color;
};