|
环境: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范畴,只是函数命名让人容易用错.
本文来自: http://shadowkong.com/archives/1812
|