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

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

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

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;
}

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

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

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

如何获取点击的区域是否透明呢?创建一个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("点中");
        }
    }
    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();
}

【原】cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮,布布扣,bubuko.com

时间: 2024-10-11 13:46:59

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

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

转载[ http://www.cnblogs.com/Androider123/p/3795050.html] 本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要执行不同的事件 一般情况下,如果要检测某一个精灵是否被点中,做法如下 bool HelloWorld::ccTouchBegan(cocos2d::CCTouch* pTouch, cocos2d::CCEvent* pEvent) { CCSize sprSize = pSpr->getConte

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

在项目开发中,我们做的大地图,一个手指头按下滑动可以拖动大地图,两个手指头按下张开或者闭合,可以放大和缩小地图 在实现这个功能的时候,需要使用到cocos2d-x的多点触控功能. 多点触控事件,并不是说你按下了两个手指,执行ccTouchesMoved的时候,pTouches的count为2,这样如果单纯的判断函数传入的参数,实现起来会比较困难. 我用一种方式实现了,感觉还是比较简单明了的,拿出来分享一下 cocos2d-x版本:cocos2d-x 2.2.0 目标平台:ios 1.首先在App

网页开发笔记【一】创建一个半透明的页面

近来正在温习网页制作,系列<网页开发笔记>记录本人在解决网页开发过程中遇到的问题以及解决方案. 半透明的页面在网页开发中使用的比较广泛,尤其在web app中,这种设计使用的地方更为广泛,本文记录这种半透明的页面的开发方法. 半透明页面常用于用户注册,这时候弹出一个页面能在不离开当前页面的情况下完成注册. 如百度的登陆界面所示. 我的处理方法如下: 首先在页面写一个div,这个div平时display设置为none,当需要的时候设置为display:block; 这个div(设其id为popu

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

有时候,我们看到别人的APP做得挺漂亮的,那么我们想查看该APP的图片素材,要怎么弄呢? 一.下载一个iTools,安装,与手机链接.点击应用,选择我们要查看的APP,选择备份,保存到桌面. 二.回到桌面,解压该.ipa文件 三.解压后,我们选择Payload-->News-->显示包内容 四.这样我们就可以拿到我们想要的APP图片素材了.

Cocos2dx 3.0开发环境搭建--Eclipse上构建一个Android项目

一.前言: 本篇主要介绍Cocos2d-x 3.0的一些基础内容,以及在Eclipse上上编译我们的Cocos2d-x项目,成功把Helloworld运行起来了.看完本篇博客之后,你就会知道Cocos2d-x 3.0竟然发生了如此大的变化,变得如此简单,环境搭建.项目创建.编译的方式更加人性化了. 二.环境准备: 1.下载ADT Bundle(Eclipse捆绑了SDK和ADT),或者是Eclipse安装了ADT插件. 2.安装JDK.NDK.Ant .Python,然后配置环境. 3.Coco

Android TV 开发笔记二:创建第一个Android TV App

一:创建 New Project 1. 2. 3. 4. 创建成果后发现已经帮你创建好了一些demo页面,并且数据都已经绑定好了 二:解决错误 1.创建成功后,build发现报错了,如下: 这个错误是因为版本问题导致的 解决方法,将版本号修改为以下的: 接着又会报错: 作为一个程序员,这点小错误相信难不倒你,自己解决吧,是HeaderItem用的构造函数不对导致的 至此终于得到了一个可以运行的AndroidTV Demo

【转】Android开发笔记(序)写在前面的目录

原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入门上:其次是想拾缺补漏,写写虽然小众却又用得着的东西:另外就是想以实用为主,不求大而全,但求小而精:还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来.个人的经

oc开发笔记3 录音时频率获取 以及声像显示

一般的声音可视化做出频谱图就行了: 但我觉得频谱图看不出声音是什么样的,所以坚定要做出声像图,这两种图都要获取声音中频率的信息. 研究了官网上的auriotouch和pitchdetector两个例子,把auriotouch的声像显示和pitch detector主频获取的主要代码集成到了上节<oc开发笔记2 AUGraph 完成同时录音与播放>中,并用CALayer做了绘图. 音频数据流处理函数PerformThru,上节中该函数只完成静音处理功能,本节他可以通过fft获取各个频率的分贝,以

[ios5 cocos2d游戏开发实战] 笔记3-FileUtils, notificationCenter

FileUtils //文件管理工具 FileUtils::getInstance() std::string getStringFromFile(const std::string& filename);//读取文件中的字符串 Data getDataFromFile(const std::string& filename);//获取文件数据 void setSearchPaths(const std::vector<std::string>& searchPaths