cocostudio不知道存在了多久的一个坑

其实我准备来论坛上开骂的,但我仍然努力克制住了~~~~~~

目前公司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部分,其他就不说了~~~~~~~*

另外,我在分析问题时,找过UIWidget::isVisible()的调用,发现只有一个地方调用了,我一看,居然在UIInputManager类下面,我当时还以为上述问题已经被处理了,但再看isVisible所在的代码段时,我立刻无语了

for (int i=0;i<widgetCount;i++)
{
    UIWidget* widget = (UIWidget*)(arrayWidget->arr*);
    if (!widget->isVisible())
    {
        continue;
    }
}

谁能告诉我这段循环是干什么用的!!!*

所以我都不用setVisible都用setEnabled

cocos2dx 2.1.5a 配 cocostudio 还保留有隐藏之后不能点击的机制, 我们公司还在用这个版本。 之前升到 2.2.1 的时候发现的这个问题就回退到 2.1.5a了

我刚才回复怎么被删了?
lz不要太生气,CocoStudio有多努力你们造吗?

我很好奇是什么内容被删了。

遇到问题自己看一下源码,或者在源码里加点log输出,找到问题自己改一下就是,跑来论坛骂人干什么。大家都是开发者,谁保证从不出bug?

楼主你好,这个问题确实已经存在很长时间了,但是底层在2.0版本不能修改渲染和事件的关系,所以这个问题还会短时间内存在,目前除了你说的方法外还有个不错的方法就是讲不显示的内容移出到屏幕外。这样不仅能很好的解决显示与触摸的关系,对于子集的影响也是一起解决了。

人家并没有骂好不好?你能找出一个脏字?

呵呵,有问题说问题,帮助别人解决问题我也替大家感谢你。
不过你这么黑cocos,为何你不拿出没有坑的东西出来,也好让大家一起学习~~

我也遇到了同样的问题,研究了很久的原码才发现确实没办法,看来真的不得不把控件放到屏幕外了,就是感觉有点2

bool UIInputManager::checkTouchEvent(UIWidget root, const CCPoint &touchPoint)
{
ccArray
arrayRootChildren = root->getChildren()->data;
//add by LIP
if(!root->isVisible()){
return false;
}
//end add
int length = arrayRootChildren->num;
for (int i=length-1; i >= 0; i–)
{
UIWidget* widget = (UIWidget*)(arrayRootChildren->arr*);
if (checkTouchEvent(widget, touchPoint))
{
return true;
}
}

}
放这里吧,父容器不可见,则子容器也不响应事件。*

我觉得cocostuido最大的问题,或者说触控的就是有坑不认,还说自己多努力,没开源又做不到微软,苹果的程度,那么就只能是国内做二次开发公司之流(不好意思,我只是举个例子,国内也是有做的比较用心的),别说触控了,就是cocostudio敢把自己的组织架构说出来么?又谁能自豪地站出来说,我是cocostudio的leader?