项目开发日志(十)
环境:cocos2d-x 2.2.3,Lua 5.1.
在前几天给cocostudio增加了一个控件 – BigMap(大地图控件),用于承载游戏地图上的所有游戏实体,包括NPC,玩家,可能存在的宝箱,传送门等等.
但是在把实体(基类是CCNode)addChild到控件的时候,只显示了图片的一半,也就是一个三角形,一开始以为是底层BUG,后面发现在UIWidget.cpp
源码中有这一句:
void Widget::addChild(CCNode* child, int zOrder, int tag) { CCAssert(dynamic_cast(child) != NULL, "Widget only supports Widgets as children"); CCNode::addChild(child, zOrder, tag); _widgetChildren->addObject(child); }
原来addChild
只能添加Widget类或者其派生类.仔细看代码发现Widget中把添加CCNode和Widget分开了不同的add函数,而由于我在Release模式下开发,所以cocos2d-x源码中所有的断言(CCAssert,CCLOG)都会忽略.所以踩了这个浅浅的坑.但是Widget的函数命名真的让人忍不住吐槽.一般人都会以为无论加什么进去都是使用addChild
.
总结一下,虽然能遇到这个问题的估计只有我了..
- Widget中addChild只能添加Widget或者Widget的派生类.
- Widget中addNode负责添加CCNode类或者其派生类.
- Widget这样做的目的是由于Widget 触摸事件走的是GUI的TouchGroup,而普通Node一般不属于GUI范畴,只是函数命名让人容易用错.