关于ui无法点击的问题

各位cocostudio使用者,大家好。
由于上次版本更新,造成可能部分ui点击无效的问题,问题已查明,由于本月无版本更新,所以在此将解决方法贴出来,为此对大家造成的不变深表歉意。

方法:
step1:请大家找到UIWidget.cpp文件中的 clippingParentAreaContainPoint 函数定义处;(如果您正使用的版本只有parentAreaContainPoint函数,请将其声明以及实现替换成clippingParentAreaContainPoint函数)
step2:将函数实现体删掉;
step3:将函数实现替换成如下代码:
bool UIWidget::clippingParentAreaContainPoint(const CCPoint &pt){ m_bAffectByClipping = false; UIWidget* parent = getParent(); UIWidget* clippingParent = NULL; while (parent) { Layout* layoutParent = dynamic_cast<Layout*>(parent); if (layoutParent) { if (layoutParent->isClippingEnabled()) { m_bAffectByClipping = true; clippingParent = layoutParent; break; } } parent = parent->getParent(); }
if (!m_bAffectByClipping) { return true; }

if (clippingParent)    {        bool bRet = false;        if (clippingParent->hitTest(pt))        {            bRet = true;        }        if (bRet)        {            return clippingParent->clippingParentAreaContainPoint(pt);        }        return false;    }    return true;}

setFocus要改成setFocused的。。忘了说了。 是改哪个类里面的呢

楼主辛苦了

是哪个版本的呢?
我在cocos2d-x_v2.1.5b只找到个parentAreaContainPoint函数

如果大家觉得修改比较麻烦 可以下载这几个文件 对应的覆盖一下

还是这样比较方便些。。。

:lol吃个饭还得打飞的到北京~

setFocus要改成setFocused的。。忘了说了。

补充:由于版本不能及时更新,还有一处不定需要打,非常抱歉:
1.请各位找到uiwidget.cpp的setEnabled函数实现,替换成

void UIWidget::setEnabled(bool enabled)
{
m_bEnabled = enabled;
GUIRenderer* renderer = DYNAMIC_CAST_CCNODERGBA;
if (renderer)
{
renderer->setEnabled(enabled);
}
else
{
dynamic_cast<RectClippingNode*>(m_pRenderer)->setEnabled(enabled);
}
ccArray* arrayChildren = m_children->data;
int childrenCount = arrayChildren->num;
for (int i = 0; i < childrenCount; i++)
{
UIWidget* child = dynamic_cast<UIWidget*>(arrayChildren->arr*);
child->setEnabled(enabled);
}
}*
2.找到layout类的定义和实现 替换成如下:
Layout.h中
将最底部的RectClippingNode的定义覆盖为
class RectClippingNode : public CCClippingNode{public: virtual ~RectClippingNode(); virtual bool init(); static RectClippingNode* create(); void setClippingSize(const CCSize& size); void setClippingEnabled(bool enabled); virtual void visit(); void setEnabled(bool enabled); bool isEnabled() const;protected: CCDrawNode* m_pInnerStencil; bool m_bEnabled;private: RectClippingNode(); CCPoint rect; CCSize m_clippingSize; bool m_bClippingEnabled;};
再到Layout.cpp中 将 RectClippingNode的实现覆盖为:RectClippingNode::RectClippingNode():m_pInnerStencil(NULL),m_clippingSize(CCSizeMake(50.0f, 50.0f)),m_bClippingEnabled(false),m_bEnabled(true){
}
RectClippingNode::~RectClippingNode(){
}
RectClippingNode* RectClippingNode::create(){ RectClippingNode *pRet = new RectClippingNode(); if (pRet && pRet->init()) { pRet->autorelease(); } else { CC_SAFE_DELETE(pRet); }
return pRet;}
bool RectClippingNode::init(){ m_pInnerStencil = CCDrawNode::create(); rect = ccp(0, 0); rect = ccp(m_clippingSize.width, 0); rect = ccp(m_clippingSize.width, m_clippingSize.height); rect = ccp(0, m_clippingSize.height);
ccColor4F green = {0, 1, 0, 1}; m_pInnerStencil->drawPolygon(rect, 4, green, 0, green); if (CCClippingNode::init(m_pInnerStencil)) { return true; } return false;}

void RectClippingNode::setClippingSize(const cocos2d::CCSize &size){ m_clippingSize = size; rect = ccp(0, 0); rect = ccp(m_clippingSize.width, 0); rect = ccp(m_clippingSize.width, m_clippingSize.height); rect = ccp(0, m_clippingSize.height); ccColor4F green = {0, 1, 0, 1}; m_pInnerStencil->drawPolygon(rect, 4, green, 0, green);}
void RectClippingNode::setClippingEnabled(bool enabled){ m_bClippingEnabled = enabled;}
void RectClippingNode::visit(){ if (!m_bEnabled) { return; } if (m_bClippingEnabled) { CCClippingNode::visit(); } else { CCNode::visit(); }}
void RectClippingNode::setEnabled(bool enabled){ m_bEnabled = enabled;}
bool RectClippingNode::isEnabled() const{ return m_bEnabled;
}

楼主辛苦了