像素檢測觸摸點和精靈相交

一般情況下,如果要檢測某一個精靈是否被點中,做法如下

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;

    };


 

 

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