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

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

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

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

忘记把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;
    };

时间: 2024-08-02 09:23:32

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

【技术】居中(不适用于IE7及以下版本)

html部分: <div class="p-r"> <div class="a-c-a"></div></div> css部分: .pr{ position: relative;}.a-c-a{ position: absolute; width: 200px; left: 0; right: 0; margin-left: auto; margin-right: auto; height: 400px; top: 0

Cocos2d-x3.0 不规则Button

这是我参照之前在iOS项目中用过的一个不规则形状按钮的第三方Button,这里用Cocos2d-x实现一个相似功能的按钮. 原文地址:http://blog.csdn.net/qqmcy/article/details/26161339 代码下载:http://download.csdn.net/detail/qqmcy/7365843 使用方法: .h // // TestScene.h // maptest // // Created by 杜甲 on 14-5-18. // // #ifn

Sharepoint2013 列表的NewForm 页面添加一个 保存新建 按钮

昨天一同事问我如何在sharepoint2013的NewForm.aspx页面上添加一个 save and new的button.实现save 和new的功能,save的功能和默认的save按钮效果一至. 效果如图: 这里的思路如下: 1)用juqery来动态添加一个saveandnew的button 2)新建按钮的click事件将要调用默认save 按钮的click方法 3)新按钮的click事件后页面跳转主要取决于url的Source参数,所以我们必须改写获取该参数的方法,该参数的读取是在i

[Swift] 如何用Swift做一个不错的按钮变换动画

汉堡按钮在 UI 设计中早已不是什么新鲜玩意儿了,但是某天我突然在 dribbble 上看到了这个酷炫的动画效果,效果真是棒棒哒!于是我决定把它在代码里实现一下. 先来看下 CreativeDash 团队做出来的原始动画效果: 我们可以看到 (看得我眼睛都花了),汉堡按钮 (也就是三条横线的那个)的上下两条线分别绕着自身最优的端点旋转了45°,变成了按钮里的 X ,中间的那个线则摇身一变,成了外面的圈圈.这个效果可以用 CAShapeLayer 实现,但是首先,我需要为这三条直线分别创建一个 C

【全网最全的博客美化系列教程】07.添加一个分享的按钮吧

全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添加一只萌萌哒的小仓鼠 [全网最全的博客美化系列教程]04.访客量统计的实现 [全网最全的博客美化系列教程]05.公告栏个性时间显示的实现 [全网最全的博客美化系列教程]06.推荐和反对炫酷样式的实现 [全网最全的博客美化系列教程]07.添加一个分享的按钮吧 [全网最全的博客美化系列教程]08.自定义

android 让一个控件按钮居于底部的几种方法

android 让一个控件按钮居于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_parent -->android:layout_weight="1" <!-- 这里设置layout_weight=1是最关键的,否则底部的LinearLayout无法到底部 -->2. 采用relativelayout布局:android:layout_alignPa

Blend 设置一个圆形的按钮

原文:Blend 设置一个圆形的按钮 1)画一个圆形 右击构成控件 3)选择button  当然如果想做成别的控件 都可以 4)我们有了一个button 5)做动画 6)定义触发器 7)定义事件 效果 原文地址:https://www.cnblogs.com/lonelyxmas/p/12075810.html

Cocos2d-x3.0 加载Cocostudio的UI后,按钮无法点击的解决方法

最近发现不少朋友都遇到这个问题,用Cocostudio的UI编辑器创建好UI后,在代码中加载UI,然后给按钮(Button)添加点击监听事件,发现无论如何都点击不了按钮,没有任何反应. 或者,往按钮的下面一些位置点击,却发现按钮被点击了,点击坐标的位置明显和按钮的位置有偏差. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/1027 文章来源:笨木头与游戏开发 如果你也遇到这样的问题,不妨进行一个简单的

解决yum安装ftp提示仓库 的 GPG 密钥已安装,但是不适用于此软件包。

遇到的问题: 在linux系统使用yum install ftp安装ftp,报以下错误 warning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Retrieving key from http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 仓库 "CentOS-6 - Base - mirrors.aliyun.com" 的 GP