其实我准备来论坛上开骂的,但我仍然努力克制住了~~~~~~
目前公司cocos2d-x游戏项目的界面,用的是cocostudio的UI编辑器做的,其中有一个界面非常复杂,很多控件,还有许多不同条件下需要setVisible(bool)的情况。这其中有一个UIButton始终无法点击,无论如何也不会响应触摸事件。
花了一个下午的时间,终于找到问题所在,这应该是cocostudio的API实现的一个bug,这不是一个局部问题。其根本症状是当你将一个UIWidget设置为不可见时,它仍然可以响应触摸事件,若此时我将和它同一个位置的另一个UIWidget设置为可见,则这个UIWidget总是不会响应触摸事件,因为那个被隐藏的UIWidget已经响应过了(当然,这也部分依赖你添加UIWidget的顺序)。
我在此提供一个解决办法,如果官方有更彻底的办法,麻烦下次更新中说明
bool UIInputManager::checkTouchEvent(UIWidget root, const CCPoint &touchPoint)
{
ccArray arrayRootChildren = root->getChildren()->data;
int length = arrayRootChildren->num;
for (int i=length-1; i >= 0; i–)
{
UIWidget* widget = (UIWidget*)(arrayRootChildren->arr*);
if(!widget->isVisible()) { /* 如果不可见,则不去响应触摸事件 */
continue;
}
if (checkTouchEvent(widget, touchPoint))
{
return true;
}
}
if (root->isEnabled() && root->isTouchEnabled() && root->hitTest(touchPoint) && root->clippingParentAreaContainPoint(touchPoint))
{
m_pSelectedWidgets->addObject(root);
root->onTouchBegan(touchPoint);
return true;
}
return false;
}
上面有注释的一段if语句就是修改部分。
强烈要求官方测试好再发布,尤其是cocostudio部分,其他就不说了~~~~~~~*