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

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

bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent)
{
    CCSize sprSize = pSpr->getContentSize();
    CCPoint point = pSpr->convertTouchToNodeSpace(pTouch);
    , , sprSize.width, sprSize.height).containsPoint(point)) {
        CCLOG("点中");
    }
    return true;
}

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

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

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

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

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

bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent)
{
    CCSize sprSize = pSpr->getContentSize();
    CCPoint point = pSpr->convertTouchToNodeSpace(pTouch);
    , , sprSize.width, sprSize.height).containsPoint(point)) {
        int i = getOpacityWithPoint(pSpr, point);
        ) {
            CCLog("点中");
        }
    }
    return true;
}
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 = { , , ,  };
        ;
        ;
        m_pData += (iy*getWidth() + ix) * ;
        color.r = *(m_pData++);
        color.g = *(m_pData++);
        color.b = *(m_pData++);
        color.a = *(m_pData++);
        return color;
    };

【原】cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮的更多相关文章

  1. 获取Sprite上某一个点的透明度

    转载[ http://www.cnblogs.com/Androider123/p/3795050.html] 本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要 ...

  2. 获取UILabel上最后一个字符串的位置。获取文字长度和高度,自动换行

    //行的高度. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPat ...

  3. HTML5开发笔记:图片上传预览

    我们知道通过<input type="file">可以用来进行一个图片或者文件的上传,然而浏览器自带的一个缩略图预览的功能其实是相当不美观的,很多时候我们希望可以在上传 ...

  4. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint

    前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...

  5. 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号

    每个CPU,都有它固定的ID号,ID号就是这个CPU唯一的标识,它可能隐含着CPU的生产日期,版本号,型号等等,那么,在我们的这款友善之臂Tiny4412的板子上,我的这个CPU的ID又是多少呢?从我 ...

  6. 【原】cocos2d-x开发笔记:多点触控

    在项目开发中,我们做的大地图,一个手指头按下滑动可以拖动大地图,两个手指头按下张开或者闭合,可以放大和缩小地图 在实现这个功能的时候,需要使用到cocos2d-x的多点触控功能. 多点触控事件,并不是 ...

  7. [开发笔记]-获取歌曲ID3信息

    ID3介绍: ID3,一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版. 获 ...

  8. java笔记----获取电脑上ip(内网ip)

    private static String getHostIP(){ String tempIP = "127.0.0.1"; try { if(isIpv4(InetAddres ...

  9. iOS 开发笔记-获取某个APP素材

    2019.02.01 更新 以下这种方式只适合越狱的手机,目前12.1以后,iTools已经不适合了,请看最下面第二种方式. 有时候,我们看到别人的APP做得挺漂亮的,那么我们想查看该APP的图片素材 ...

随机推荐

  1. RabbitMQ-rabbitMq各个特性的使用(三)

    准备 1.引入客户端和配置文件依赖类 <dependency> <groupId>com.rabbitmq</groupId> <artifactId> ...

  2. vue组件知识总结

    vue组件化开发 将一个页面分割成若干个组件,一个页面js+css+html,将自己类容分割出来,方便开发,更好了维护我们的代码,每个组件封装自己的js+html+css,样式命名冲突 组件分类 页面 ...

  3. Spring的Java配置方式

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1     @Configuration 和 @Bean Spring的Java配置方式是通过 @Configuration ...

  4. CODEVS1222 信与信封问题 (匈牙利算法)

    先做一遍匈牙利算法.对于已经匹配的边,如果删去之后还能最大匹配数增加,则不符合要求. 一遍匈牙利算法是O(n^3)的,对于每一条边做n次,每次O(n^2),总的复杂度是O(n^3). 注意:不要忘记输 ...

  5. resin4开启jmx

    https://blog.csdn.net/liuxiao723846/article/details/51321010 https://blog.csdn.net/u010342008/articl ...

  6. VNC Viewer 设置屏幕分辨率-解决屏幕分辨率问题

    https://blog.csdn.net/runningtortoises/article/details/51425332

  7. Ubuntu 16.04下UML建模PowerDesigner的替代ERMaster和MySQL Workbench

    ERMaster是Eclipse的一个插件,小巧,支持连接各种数据库,还能生成代码等.安装参考:http://www.cnblogs.com/EasonJim/p/6170686.html 当然还有一 ...

  8. 12、Java并发性和多线程-Java同步块

    以下内容转自http://ifeve.com/synchronized-blocks/: Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免 ...

  9. Javascript: 动态显示进度条

    {% if not config.exec_id == '' %} <br /> <div class="progress"> <div class= ...

  10. 小议:怎样解决创建Web Application失败问题?

    我们都知道微软建议部署SharePoint2013环境的内存至少是12GB.可是有些小型企业在部署On Premise的环境时因为预算有限,仅仅能使用内存是8GB的环境来部署SharePoint201 ...