给组件加了widget,然后我在start获取x坐标是旧坐标,只有稍微延迟了再获取x才是真实坐标,
很奇怪,按道理在start里面拿到的坐标应该是改变的。
使用的是Cocos Creator v2.4.2
给组件加了widget,然后我在start获取x坐标是旧坐标,只有稍微延迟了再获取x才是真实坐标,
很奇怪,按道理在start里面拿到的坐标应该是改变的。
使用的是Cocos Creator v2.4.2
并不奇怪。以下是CCDirector.js的源代码
在一帧中,你的脚本的start 在 startPhase层执行。
咱们再看 CCWigetManager.js的源码,CCWigetManager监听的是 cc.Director.EVENT_AFTER_UPDATE事件去刷新场景中的widget。
结论。一帧中 脚本start函数 在 startPhase层执行。 而widget刷新在 cc.Director.EVENT_AFTER_UPDATE 层执行。楼主描述的现象就解释得通了。
其实cocos中很多出乎意料的行为,都可以在自己的代码中 通过 延迟一帧来解决。
说一个自己项目中的例子吧。由于历史原因,项目组写ui代码喜欢先对ui初始化后,再被添加到场景树中。那么就会导致诸如cc.Button, cc.Toggle, cc.ToggleContainer等组件的很多问题。因为在初始化函数里,ui还未添加到场景树中,因此对应的子孙节点上的cocos自带的组件的__preload和onLoad和onEnable等生命周期函数还未执行,导致游戏运行后,表现行为不对。对于这样的,我们做法是延迟一帧处理就好了。
往往历史原因就纠缠不完的。楼主也可以把一些"bug"当做一些历史原因或者"设计如此",我们不能改变引擎或者 老项目老的设计,但是我们可以改变我们自己的使用方式。当然,这里的意思并不是说cocos具有缺陷,因为有些设计可以达到目的A,就必然达不到目的B了。
大佬可以考虑写一些讲解引擎的文章
cocos引擎还没看完 
