抽时间,总结一些bug和一些需要注意的地方。
1)计时器:update
第一次scheduleupdate之后并没有立即执行update,而是在渲染完视图资源以后才启动的,所以,第一次的dt时间值可能很大,甚至十几秒。
2)const 与 宏CC_SYNTHESIZE的结合:
抽时间,总结一些bug和一些需要注意的地方。
1)计时器:update
第一次scheduleupdate之后并没有立即执行update,而是在渲染完视图资源以后才启动的,所以,第一次的dt时间值可能很大,甚至十几秒。
2)const 与 宏CC_SYNTHESIZE的结合:
3)lua错误:
“invalid 'self' in function 'getChildByName'”的出现,说明调用函数“getChildByName”的self对象数据已被删除,self对象指针变成野指针。
4)自己写的set方法传入对象指针的问题:
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即可转换回相对坐标。
最后:改bug的心态要静,因为到最后你会发现,最难改的bug往往是那种最低级的错误,而且出错的可能无处不在,勤动手尝试,而不是光分析可能性。
"一行一行代码的去测"有时候可能是最有效的。