我们项目使用了cocos2d-x 3.4 +cocos2.2.5版本来开发。使用过程中发现了一个十分严重的bug。
在使用cocos的scrollview时候,发现在scrollview的子项上添加接收后,scrollview的滚动无法响应了。查了一下源代码,发现根本原因是因为根节点是Node引起的!!
在UIWidget中,有一个propagateTouchEvent函数
他是这样的
void Widget::propagateTouchEvent(cocos2d::ui::Widget::TouchEventType event, cocos2d::ui::Widget *sender, cocos2d::Touch *touch) {
Widget* widgetParent = getWidgetParent();
if (widgetParent) {
widgetParent->interceptTouchEvent(event, sender, touch);
}
}
就是收到点击后,找自己的父节点,如果父节点是widget,则传递给widget。由于cocos里面的根节点是node,故无法传递。
无奈之下,我写了这辈子最烂的一段c++代码
如下
void Widget::propagateTouchEvent(cocos2d::ui::Widget::TouchEventType event, cocos2d::ui::Widget *sender, cocos2d::Touch *touch) {
Node* target = this;
while(true) {
Node* m_parent = target->getParent();
if (m_parent) {
Widget* widgetParent =dynamic_cast<Widget*>(m_parent);
if (widgetParent) {
widgetParent->interceptTouchEvent(event, sender, touch);
break;
} else {
target = m_parent;
}
} else {
break;
}
}
}
就是在循环的找父节点,直到是widget为止,再把点击传过去。
好吧,这样是解决了上述的问题,scrollview动起来了。
然后又发现了更加扯的问题,被剪裁区域外的item项居然可以点击?!!!!!
WTF!
又查,然后发现和上面问题是一样的。widget中有一个isClippingParentContainsPoint方法
就截取头几句就可以了
bool Widget::isClippingParentContainsPoint(const Vec2 &pt)
{
_affectByClipping = false;
Widget* parent = getWidgetParent();
Widget* clippingParent = nullptr;
while (parent)
同样的问题,取父类的时候,发现父类不是widget,就结束了。。。。





