小伟哥 遇到一个命题:
按钮透明区域过滤。当点击一个建筑按钮、花的时候不得不想一些方法把点击透明区域过滤掉。
让点击也没有效果滴啦。
开始搜索了半天才有所思路。
在网络上很多贴代码的。
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 按钮透明区域过滤所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)