cocos2d-x 阶段性bug总结

本文总结了Cocos2d-x开发中常见的bug和注意事项,包括计时器延迟执行、const与宏结合、lua错误、对象指针管理、异步线程问题等,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1)计时器:update

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

2)const 与 宏CC_SYNTHESIZE的结合:

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //CC_SYNTHESIZE的使用 要慎重,类型使用const要慎重  
  2. #define CC_SYNTHESIZE(varType, varName, funName)\  
  3. protected: varType varName;\  
  4. publicvirtual varType get##funName(voidconst { return varName; }\  
  5. publicvirtual void set##funName(varType var){ varName = var; }  
注意: protected: varType varName;

3)lua错误:

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

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. setObject(Object* obj)  
  2. {  
  3. /* 通常要手动retain一次,避免外部obj的释放导致本地指针变为野指针 */  
  4. obj->retain();  
  5. /*...*/  
  6. }  


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往往是那种最低级的错误,而且出错的可能无处不在,勤动手尝试,而不是光分析可能性。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值