今天我在看龙灵修老师的cocos2d-x手游开发实战练习,别踩白块儿的视频。
(抱歉我没有权限发URL链接。。。)
在视频的后面我遇到了一个难题。PS:我用的时win7 32bit VS2012写的Cocos
auto normal_label = LabelTTF::create(normalTTF,"Marker Felt.ttf",40);addChild(normal_label);
addChild(normal_label);
简而言之,龙老师新建了一个标签。
auto normal_button = MenuItemLabel::create(normal_label);
然后给这个标签添加了一个MenuItem。
然后问题出现了,我也像他这么写的,程序编译通过,但是运行的时候崩溃了,抛出异常:child->_parent == nullptr。
我访遍各大论坛,问答网站,从百度知道到csdn,从知乎到cocoChina,最后去了Stack overflow。
只看到有人提出这个问题,但是并没有解答。
然后我做了实验:
addChild(normal_label);
auto normal_button = MenuItemLabel::create(normal_label);
这两句话不能同时共存,否则程序崩溃。
研究了半天,到晚上都没有结果。
下面是我的测试结果,供大家参考一下,帮我解决这个问题:
normal_label的内存地址 :0*07dbb440。
我用单步调试,进入了
addChild函数
两次F11之后到了这里
CCASSERT(child != nullptr, "Argument must be non-nil");
CCASSERT(child->_parent == nullptr, "child already added. It can't be added again");
(这里就是抛出异常的地方,其实我很纳闷,为什么抛出的异常是child->_parent == nullptr,而不是child already added. It can't be added again)
因为第一次嘛,断言通过,继续深入,开始实现addChild操作。
在添加孩子之后,执行了一个void Node::setParent(Node * parent)函数
_parent = parent;
然后我直接跳出了addchild函数
这是显示:
normal_label->_parent的内存地址 :0*07b49270。
然后我F11进入了
auto normal_button = MenuItemLabel::create(normal_label);
在create函数里面经过n次跳转之后,我竟然发现,函数进了addChild()函数,也就是说create底层调用了addchild函数,
当然结果和上面一样,
不过这一次程序死在了断言
CCASSERT(child != nullptr, "Argument must be non-nil");
CCASSERT(child->_parent == nullptr, "child already added. It can't be added again");
直接抛出了异常,
随后我又将
auto normal_button = MenuItemLabel::create(normal_label);
addChild(normal_label);
调转了顺序,可是结果一样,但是这两句话只有注释掉了一句就行了。
简而言之,这个程序调用了两次 addChild(normal_label);
第二次就会报错。
然而我并不知道怎么解决,为什么龙灵修老师的视频里面就没有报错,到我这里就出错了。
求各位大大帮我看看。。。。。。。。。。。。。。。