博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cocos2dx Widget button透明区域过滤
阅读量:6705 次
发布时间:2019-06-25

本文共 4416 字,大约阅读时间需要 14 分钟。

小伟哥 遇到一个命题:

button透明区域过滤。当点击一个建筑button、花的时候不得不想一些方法把点击透明区域过滤掉。

让点击也没有效果滴啦。

開始搜索了半天才有所思路。

在网络上非常多贴代码的。

http://blog.csdn.net/lwuit/article/details/40658347

整理后代码例如以下:

bool CCMenu::CheckAlphaPoint(CCMenuItem* pChild, const CCPoint& point){    CCSize winSize = CCDirector::sharedDirector()->getWinSize();    CCNode* selectSprite = ((CCMenuItemSprite*)pChild)->getSelectedImage();        CCRenderTexture *renderer = CCRenderTexture::create(winSize.width, winSize.height);    renderer->begin();        bool visible = selectSprite->isVisible();    if (visible) {        selectSprite->visit();    }    else    {        selectSprite->setVisible(true);        selectSprite->visit();        selectSprite->setVisible(false);    }        GLubyte pixelColors[4];    #if ( CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)    glReadPixels(point.x, point.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixelColors[0]);#else    glReadPixels(point.x, point.y, 1, 1, GL_ALPHA, GL_UNSIGNED_BYTE, &pixelColors[0]);#endif        int alpha = pixelColors[0];    CCLOG("----alpha %d", alpha);        renderer->end();        if (alpha <= 30)    {       return true;    }    else    {        return false;    }    }

上面代码的确在測试project上面直接简历个ccsprite 活着 menuitem 是能够运行的。

随着UI工具的进步。我们选择了CocoStudio 的 Widget 。方便了你我啊。

可是可可是,把上面的代码贴过来,试了试真心不能用啊。

有些同志,到此放弃了对知识原理的探究。 

程序就是苦啊。遇到这种问题必须往下研究不是? 

经过了多重推敲与图纸猜測。

后来发现了出现故障的根本原因:

CCRenderTexture *renderer 渲染后不能得到位置上面的颜色值 为0 00000为什么为0 
visit()好不好使?各种疑惑

bool Widget::onTouchBegan(CCTouch *touch, CCEvent *unused_event){    _touchStartPos = touch->getLocation();    _hitted = isEnabled()            & isTouchEnabled()            & hitTest(_touchStartPos)    & clippingParentAreaContainPoint(_touchStartPos);        if (!_hitted)    {        return false;    }        // add yww alpha check    if (!AlphaTouchCheck(_touchStartPos))    {        return false;    }        setFocused(true);    Widget* widgetParent = getWidgetParent();    if (widgetParent)    {        widgetParent->checkChildInfo(0,this,_touchStartPos);    }    pushDownEvent();    return !_touchPassedEnabled;}

上面是按键检測的逻辑。

以下是改动过的代码。原理非常easy  在widget 里面ccnode节点 节点位置 相对父节点是0. 所以在visit的时候 位置就从0。0 開始了。

我们矫正下改渲染节点的位置。转成屏幕坐标 然后在依据touch 坐标获取当前点击像素的 透明值。

// yww get alpha touch event checkbool Button::AlphaTouchCheck(const CCPoint &point){    bool isTouchClaimed = false;        if (getAlphaTouchEnable())    {            // check claimed touch arena            CCSize winSize = CCDirector::sharedDirector()->getWinSize();            CCSprite* selectSprite = (CCSprite*)getVirtualRenderer();            CCPoint cutPos = selectSprite->getPosition();            // CCLOG("getAlphaTouchEnable selectSprite X %f, Y %f", cutPos.x, cutPos.y);                    // get screen point            CCPoint wordpx = selectSprite->getParent()->convertToWorldSpace(cutPos);            // CCLOG("getAlphaTouchEnable convertToWorldSpace X %f, Y %f", wordpx.x, wordpx.y);                    selectSprite->setPosition(wordpx);                    CCRenderTexture *renderer = CCRenderTexture::create(winSize.width, winSize.height);            //selectSprite->addChild(renderer);                    renderer->begin();                    bool visible = selectSprite->isVisible();            if (visible)            {                selectSprite->visit();            }            else            {                selectSprite->setVisible(true);                selectSprite->visit();                selectSprite->setVisible(false);            }                    GLubyte pixelColors[4];        #if ( CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)            glReadPixels(point.x, point.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixelColors[0]);#else            glReadPixels(point.x, point.y, 1, 1, GL_ALPHA, GL_UNSIGNED_BYTE, &pixelColors[0]);#endif                    int alpha = pixelColors[0];            CCLOG("----alpha %d", alpha);                    renderer->end();                    selectSprite->setPosition(cutPos);                    if (alpha <= 20)            {                isTouchClaimed = false;            }            else            {                isTouchClaimed = true;            }        // check claimed touch arena    }    else    {        isTouchClaimed = true;    }    return isTouchClaimed;}

上面逻辑是 重写了widget 的自己定义函数

AlphaTouchCheck

这个依据自己的需求构建结构了。

在lua里面能够提供检測开关 是否对透明纸进行检測咯。

不多往下说了。浪费网络内存咯。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5368090.html,如需转载请自行联系原作者 
你可能感兴趣的文章
利用自定义IHttpModule来实现URL地址重写
查看>>
在网页上嵌入 PowerPoint 演示文稿
查看>>
javascript日期格式化函数,跟C#中的使用方法类似
查看>>
Android杂谈--Activity、Window、View的关系
查看>>
使用delphi 开发多层应用(十)安全访问服务器
查看>>
JavaScript计算字符串中每个字符出现的次数
查看>>
mvc中的ViewData用到webfrom中去
查看>>
小白学数据分析------>描述性统计术语汇总
查看>>
[转载]java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法
查看>>
SKY IM-A800S 驱动下载
查看>>
应用程序 数据缓存
查看>>
TFS签入签出
查看>>
第二条:遇到多个构造器参数(Constructor Parameters)时要考虑用构建器(Builder)
查看>>
成长,没你想象的那么迫切
查看>>
ASP.NET Core 中文文档 第一章 入门
查看>>
jQuery入门(2)使用jQuery操作元素的属性与样式
查看>>
贴片电阻分类、阻值、功率、封装、尺寸
查看>>
Mqtt协议IOS端移植2
查看>>
【Eclipse】eclipse中设置tomcat启动时候的JVM参数
查看>>
10.查看npm安装信息和版本号
查看>>