Cocos2dx Widget 按钮透明区域过滤

Cocos2dx Widget 按钮透明区域过滤,第1张

概述小伟哥 遇到一个命题: 按钮透明区域过滤。当点击一个建筑按钮、花的时候不得不想一些方法把点击透明区域过滤掉。 让点击也没有效果滴啦。 开始搜索了半天才有所思路。 在网络上很多贴代码的。 http://blog.csdn.net/lwuit/article/details/40658347 整理后代码如下: bool CCMenu::CheckAlphaPoint(CCMenuItem* pChil

小伟哥 遇到一个命题:

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

让点击也没有效果滴啦。

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

在网络上很多贴代码的。

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,GL_RGBA,GL_UNSIGNED_BYTE,&pixelcolors[0]);#else    glreadPixels(point.x,GL_Alpha,&pixelcolors[0]);#endif        int Alpha = pixelcolors[0];    cclOG("----Alpha %d",Alpha);        renderer->end();        if (Alpha <= 30)    {       return true;    }    else    {        return false;    }    }

上面代码的确在测试工程上面直接简历个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;}

上面是按键检测的逻辑。


下面是修改过的代码。原理很简单 在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,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,&pixelcolors[0]);#else            glreadPixels(point.x,&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里面可以提供检测开关 是否对透明纸进行检测咯。

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

总结

以上是内存溢出为你收集整理的Cocos2dx Widget 按钮透明区域过滤全部内容,希望文章能够帮你解决Cocos2dx Widget 按钮透明区域过滤所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1007287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存