加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d-x 阶段性bug总结

发布时间:2020-12-14 21:31:43 所属栏目:百科 来源:网络整理
导读:抽时间,总结一些bug和一些需要注意的地方。 1)计时器:update 第一次scheduleupdate之后并没有立即执行update,而是在渲染完视图资源以后才启动的,所以,第一次的dt时间值可能很大,甚至十几秒。 2)const 与 宏CC_SYNTHESIZE的结合: [cpp] view plain c

抽时间,总结一些bug和一些需要注意的地方。

1)计时器:update

第一次scheduleupdate之后并没有立即执行update,而是在渲染完视图资源以后才启动的,所以,第一次的dt时间值可能很大,甚至十几秒。

2)const 与 宏CC_SYNTHESIZE的结合:

[cpp] view plain copy
  1. constint*p;//同intconst*p,const在*左边,则修饰“指向的内容”,内容不可变,指针本身可变向
  2. int*constp;//指针本身不可变

copy
    //CC_SYNTHESIZE的使用要慎重,类型使用const要慎重
  1. #defineCC_SYNTHESIZE(varType,varName,funName)
  2. protected:varTypevarName;
  3. public:virtualvarTypeget##funName(void)const{returnvarName;}
  4. virtualvoidset##funName(varTypevar){varName=var;}
注意: protected: varType varName;

3)lua错误:

“invalid 'self' in function 'getChildByName'”的出现,说明调用函数“getChildByName”的self对象数据已被删除,self对象指针变成野指针。

4)自己写的set方法传入对象指针的问题:

    setObject(Object*obj)
  1. {
  2. /*通常要手动retain一次,避免外部obj的释放导致本地指针变为野指针*/
  3. obj->retain();
  4. /*...*/
  5. }


5)异步线程的加载问题要始终保持警惕(死锁阻塞)。


6)UI系列控件手动创建的不响应触摸的问题:

UI系列的控件,手动创建后,必须添加到UILayer中,才能监听到触摸(触摸允许true时)。

UILayer* ly;Widget* w;ly->addWidget(w); CCLayer* layer;layer->addChild(ly);


7)触摸响应的顺序只与“优先级有关”,与层之间的z轴即遮挡顺序无关,而且与节点的父子关系也无关。

setTouchPriority(-128)直接调整优先级,除此之外触摸的传递条件还与如下有关:

①触摸代理中的是否吞噬参数:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(myLayer,-1000,true);

ccTouchBegan():

返回false:吞噬触摸将不起作用,直接穿透且传递触摸

返回true:以①中的吞噬开关为准


8)控件层叠的触摸穿透顺序:

层A在层B上方,默认的优先级是:A上的子控件-》B上的子控件-》A的最底层-》B的最底层

所以,如果我们让A层吞噬掉触摸的话,只有B层接收不到,但是无论A或B,其子控件都能接收到。


9)convertToWorldSpace

A->convertToWorldSpace(S->getPosition());//A在父节点中坐标 + S在父节点中的坐标,因此一定要确定好应该用谁调用convertToWorldSpace方法,通常用s的父节点调用,来转换为世界坐标。

如果用自身调用,返回值是在父节点中的坐标加上自身的世界坐标值(引擎会算出),因此如果自身在父节点中的坐标不是(0,0),也就是已有坐标数值,那么这时如果用自身调用此方法会多出一个自身的坐标(这里说的情况是锚点在正常位置(0.5,0.5))。

通过getParent()->convertToWorldSpace就可以将这个坐标转换成游戏的绝对坐标。

调用getParent()->convertToNodeSpace即可转换回相对坐标。


资源错误:

1》资源没有导入项目或者没有更新。
2》资源路径错误。
3》资源名字有问题:含有空格、大小写、类型后缀大小写
一个完整项目下来,个人感觉cocos2dx虽然有坑,但通过改改底层基本都能解决,而遇到费时间的问题大体就以上那么多吧,再有就是一些比如换行、链表的刷新和排序之类的,总体来说难点不是太多。也可能很多知识接触的少,用的少吧,继续学习。

最后:改bug的心态要静,因为到最后你会发现,最难改的bug往往是那种最低级的错误,而且出错的可能无处不在,勤动手尝试,而不是光分析可能性。

"一行一行代码的去测"有时候可能是最有效的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读