CocosCreator(2D)中物理節(jié)點橫豎屏適配
物理節(jié)點(剛體)如果沒有做正確的適配,橫豎屏切換時這些剛體節(jié)點的位置(包括其精靈組件)都會發(fā)生偏移,而且如果動態(tài)的去設置這些剛體節(jié)點的位置(setPosition),或者旋轉和縮放、他們的位置總不是你想要的(已經發(fā)生了偏移),無論這些剛體是靜態(tài)的還是動態(tài)的。具體為什么會偏移目前也不是特別清楚,只了解到物理節(jié)點的變換不是發(fā)生在UI所在的世界坐標系中,而是在物理世界中通過各種力的方式去變換。
備注:當前使用的Creator版本為3.6.3

在官方文檔中是這么說的:

舉個問題例子:設計(豎屏)時創(chuàng)建一個靜態(tài)剛體節(jié)點

切換到橫屏時就找不到了。
然后按照文檔中:
PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb |
? ?EPhysics2DDrawFlags.Pair |
? ?EPhysics2DDrawFlags.CenterOfMass |
? ?EPhysics2DDrawFlags.Joint |
? ?EPhysics2DDrawFlags.Shape;
去繪制物理調試信息時可以看到包圍盒已經偏移(相對于想要的位置)了。

然后就嘗試了各種方法:扒論壇、提問題;問度娘;扒文檔、查API等等等。
在找到合適的解決方案之前的一些項目需求的實現(xiàn)中使用了一些替代方案:
強制適配高度,放在畫布中心,不做變換(位移、縮放、旋轉):


????改方式雖然達到了效果,但是限制很多,適應場景很有限,而且剛體節(jié)點如果是動態(tài)節(jié)點就不管用了。

在橫豎屏切換時適配夾具,節(jié)點掛widget組件:

改方式活動范圍大一些、而且父節(jié)點可以不用強制在中心點了,但是一縮放又麻了!

最后怎么都想不通,文檔中不是說靜態(tài)剛體可以設置他的位置來進行移動嗎?不是說對剛體所在節(jié)點的相關屬性進行顯示設置時,節(jié)點的信息會同步到剛體上嗎?
這里忽略了文檔中的一句話,而且是很容易被忽略的一句描述:
在物理系統(tǒng)每次迭代(物理系統(tǒng)是在 postUpdate 進行迭代的)的最后會把所有剛體信息同步到對應節(jié)點上去。
那么:
是不是說,我在動態(tài)適配節(jié)點的最后,再去手動適配這些剛體?或者我直接在Next幀再去做這些剛體的適配?
于是就做了一些嘗試,也得到了當前階段比較滿意的解決方案:
假設在橫豎屏切換時需要去改變一個節(jié)點的位置、縮放、旋轉等變換,該節(jié)點下有一系列各種子節(jié)點剛體(包括靜態(tài)剛體、動態(tài)剛體)
step1:在初始化時去緩存所有子節(jié)點剛體的位置(在適配/橫豎屏切換的時候去手動設置)

step2:封裝一個方法去適配所有需要適配的剛體節(jié)點(在橫豎屏切換時調用)

step3:在橫豎屏切換時延遲一幀調用step2中的方法即可

經過測試,該解決方案可以實現(xiàn)大多數(shù)剛體節(jié)點在橫豎屏切換時適配的問題,在下一篇解決該問題的方案出來之前,應該都是用該方法了。
備注:當前使用的Creator版本為3.6.3
