CocosCreator(2D)中物理节点横竖屏适配
物理节点(刚体)如果没有做正确的适配,横竖屏切换时这些刚体节点的位置(包括其精灵组件)都会发生偏移,而且如果动态的去设置这些刚体节点的位置(setPosition),或者旋转和缩放、他们的位置总不是你想要的(已经发生了偏移),无论这些刚体是静态的还是动态的。具体为什么会偏移目前也不是特别清楚,只了解到物理节点的变换不是发生在UI所在的世界坐标系中,而是在物理世界中通过各种力的方式去变换。
备注:当前使用的Creator版本为3.6.3

在官方文档中是这么说的:

举个问题例子:设计(竖屏)时创建一个静态刚体节点

切换到横屏时就找不到了。
然后按照文档中:
PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb |
EPhysics2DDrawFlags.Pair |
EPhysics2DDrawFlags.CenterOfMass |
EPhysics2DDrawFlags.Joint |
EPhysics2DDrawFlags.Shape;
去绘制物理调试信息时可以看到包围盒已经偏移(相对于想要的位置)了。

然后就尝试了各种方法:扒论坛、提问题;问度娘;扒文档、查API等等等。
在找到合适的解决方案之前的一些项目需求的实现中使用了一些替代方案:
强制适配高度,放在画布中心,不做变换(位移、缩放、旋转):


改方式虽然达到了效果,但是限制很多,适应场景很有限,而且刚体节点如果是动态节点就不管用了。

在横竖屏切换时适配夹具,节点挂widget组件:

改方式活动范围大一些、而且父节点可以不用强制在中心点了,但是一缩放又麻了!

最后怎么都想不通,文档中不是说静态刚体可以设置他的位置来进行移动吗?不是说对刚体所在节点的相关属性进行显示设置时,节点的信息会同步到刚体上吗?
这里忽略了文档中的一句话,而且是很容易被忽略的一句描述:
在物理系统每次迭代(物理系统是在 postUpdate 进行迭代的)的最后会把所有刚体信息同步到对应节点上去。
那么:
是不是说,我在动态适配节点的最后,再去手动适配这些刚体?或者我直接在Next帧再去做这些刚体的适配?
于是就做了一些尝试,也得到了当前阶段比较满意的解决方案:
假设在横竖屏切换时需要去改变一个节点的位置、缩放、旋转等变换,该节点下有一系列各种子节点刚体(包括静态刚体、动态刚体)
step1:在初始化时去缓存所有子节点刚体的位置(在适配/横竖屏切换的时候去手动设置)

step2:封装一个方法去适配所有需要适配的刚体节点(在横竖屏切换时调用)

step3:在横竖屏切换时延迟一帧调用step2中的方法即可

经过测试,该解决方案可以实现大多数刚体节点在横竖屏切换时适配的问题,在下一篇解决该问题的方案出来之前,应该都是用该方法了。
备注:当前使用的Creator版本为3.6.3
