2dx给Widget添加CCNode

项目开发日志(十)

环境: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.

总结一下,虽然能遇到这个问题的估计只有我了..

  1. Widget中addChild只能添加Widget或者Widget的派生类.
  2. Widget中addNode负责添加CCNode类或者其派生类.
  3. Widget这样做的目的是由于Widget 触摸事件走的是GUI的TouchGroup,而普通Node一般不属于GUI范畴,只是函数命名让人容易用错.

发表评论

邮箱地址不会被公开。 必填项已用*标注