2017-04-09 44 views
2

我有一個奇怪的問題,我想我會分享。雖然解決方法相當簡單,但它們有點乏味,我想知道是否有更好的方法。從Xcode中的文件加載場景後出現非整數節點位置

我使用場景編輯器設計了一個SpriteKit場景,加載了場景並在自定義類初始化程序中執行了一些自定義邏輯。這包括創建一些新的節點和比較節點位置並向節點位置添加一些整數偏移量。

奇怪的是,我發現儘管節點位置在場景編輯器中作爲整數指定,但它們以非整數形式出現(如調試器中所示)。

具體而言,我曾與x值的節點:

96.000122 

這似乎是一些二進制分數,所以很明顯的低位被置位的某處。我再說一次,在場景編輯器中顯示爲「96」。

這種麻煩,因爲我看到它是雙重的:

  1. 比較可能會失敗。
  2. 有可能SpriteKit必須對圖像進行不必要的抗鋸齒(如果已經像素對齊)。

是否有優雅的解決方案將場景文件中的所有位置捨去,還是必須手動完成?

+0

你可以寫一個擴展...但是比較浮動(position.x和y是CGFloats)可能不是你想要的......你可以定義在什麼情況下你必須比較兩個浮動嗎? – Whirlwind

+0

只是我寫的一些邏輯。我堆疊了一些節點,然後有一個方法可以取消隱藏一個特定的節點,並將所有其他節點隱藏在同一個位置。但它可能是任何東西。 – rghome

+0

是的,但你可以看到比較漂浮物可能會有問題。當精靈擁有動態物理主體(完全移除物理主體並查看會發生什麼)時,可能會發生什麼。這也可能是因爲我猜想四捨五入錯誤(許多引擎就是這種情況)。仍然比較浮點數以確定節點是否處於相同位置不是一個好主意IMO。你應該計算兩個節點之間的距離,並決定什麼被視爲「相同的位置」,例如。如果兩個節點距離彼此0.01點,他們是否認爲他們共享相同的位置或不... – Whirlwind

回答

0

最後,作爲建議,我寫了一個延伸到輪所有位置:

extension SKNode { 
    func fixUp() { 
     for child in children { 
      child.position = CGPoint(
           x: round(child.position.x * 4)/4, 
           y: round(child.position.y * 4)/4) 
      child.fixUp() 
     } 
    } 
} 

在這個例子中,我四捨五入到四分之一點,但這是任意的;它可能會更小,因爲場景編輯器中只有非常小的位移無法顯示。

我把這稱爲init函數。