码迷,mamicode.com
首页 > 其他好文 > 详细

转 。。。。一个不规则的按钮 虽然已经不适用于cocos2dx3.0以上版本 but思路就应该是这个样子滴

时间:2014-12-18 18:39:05      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:des   blog   http   ar   io   color   os   sp   for   

本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要执行不同的事件

bubuko.com,布布扣

一般情况下,如果要检测某一个精灵是否被点中,做法如下

bubuko.com,布布扣
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("点中");
    }
    return true;
}
bubuko.com,布布扣


上述方法判断的都是矩形区域,包括透明的部分点击也是有效的,如果要制作上面的八卦按钮,就不好办了。

这样就引出了下面的实现方式,做两张图,这两张图一样大,叠在一起正好是一个完整的八卦。

点击的时候判断点击的区域是否是透明的,如果不是透明的就响应事件!如果是透明的就向下传递。

如何获取点击的区域是否透明呢?创建一个CCRenderTexture,把当前的Sprite画上去,然后通过CCRenderTexture得到一个CCImage,然后在取到CCImage里面某一个点得像素信息。

获取点是否是透明的,我封装了两个函数,具体实现代码如下

bubuko.com,布布扣
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("点中");
        }
    }
    return true;
}

bubuko.com,布布扣

 

bubuko.com,布布扣
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();
}
bubuko.com,布布扣

 忘记把CCImage中添加的代码贴出来了

 在CCImage.h文件中加入如下函数

bubuko.com,布布扣
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;
    };
bubuko.com,布布扣

转 。。。。一个不规则的按钮 虽然已经不适用于cocos2dx3.0以上版本 but思路就应该是这个样子滴

标签:des   blog   http   ar   io   color   os   sp   for   

原文地址:http://www.cnblogs.com/rexzhao/p/4172194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!