cocos2dx 3.17.2 lua RichText使用(2)


之前上篇文章的问题修改完之后,实际使用时发现RichElementCustomNode里面添加按钮这种带事件的也不好用,这就比较无语了,好多自定义的节点就没多大用处了

后来我翻阅之后发现addProtectedChild这个函数,论坛和github查找一番后证实了这件事,

单步跟踪2dx的EventDispatcher的代码,终于找到原因了。EventDispatcher在发送点击事件前会对监听对象排序,其中优先级为0的为场景优先级,通过Z-Order来确定优先级。
通过void EventDispatcher::visitTarget(Node* node, bool isRootNode)函数来递归遍历整个场景。
获取子节点的代码是:auto& children = node->getChildren();
而在RichText中:
void RichText::initRenderer()
{
_elementRenderersContainer = Node::create();
_elementRenderersContainer->setAnchorPoint(Vec2(0.5f, 0.5f));
addProtectedChild(_elementRenderersContainer, 1, -1);
}
_elementRenderersContainer 是通过addProtectedChild 来添加的,不会被遍历到。所以加到这上面的按钮在排序的时候会被忽略,始终都在最低优先级。
场景中只要有UI的点击区域包含它的,都会把消息吃掉,无法传递到。

大概就是这样。PS:一直不明白这个 “保护” 的 子节点是用来干嘛的。

转载:https://forum.cocos.org/t/richtext-button/23494

在EventDispatcher中,对事件排序时,是根据事件所在节点,在节点树上的深度进行排序,但是ProtectedNode的派生类中,_protectedChildren中的直接点没有参与排序运算。

UIRichText中的渲染根节点,是通过addProtectedChild添加到UIRichText上的,如果UIRichText有元素有触摸事件,行为就不一定正常了。我这边把一个Button添加到UIRichText中,结果触摸事件在最后面,如果事件队列中任意事件吞没事件,Button就响应不到事件。

转载:https://github.com/cocos2d/cocos2d-x/issues/13207

根据子龙山人的回复说是可以用addChild代替addProtectedNode,然后修改UIRichText.cpp试了下,完全ok,查看了下ProtectedNode,发现也没有啥其他特殊的接口,然后检查下UIRichText.cpp有没有其他使用ProtectedNode的接口的,有个removeAllProtectedChildren也让我换成removeAllChildren了,然后编译测试完全可用

关于ProtectedNode与Node的区别我觉得就是害怕误操作导致节点底下的child和属性啥的出问题,Event这个估计也是同理,所以说ProtectedNode保护起来之后getChildren()这些接口就获取不到了,触摸的Event也就不响应了,只是猜测,这边没啥特殊的操作我就直接换成普通Node了

这边RichElementCustomNode接口就好用了,就可以添加各种按钮啊,其他的组件了