2015-07-20 54 views
1

我正在用SceneKit開發一個簡單的遊戲。在創建了一個nxn的球體網格(每個球體具有五種隨機顏色之一)之後,玩家將連續選擇其中的三個,並且如果它們具有相同的顏色,那麼它們將從網格中移除。我對代碼的選擇部分很滿意,但我無法設法比較三人組合的顏色來檢查它是否有效。我使用的功能是比較SceneKit中不同物體的顏色

func respondToPanGesture(gesture: UIGestureRecognizer) { 

    var colorsTrio = Array<NSObject>() 

    var numberOfWhiteSpheres: Int { 
     var count = 0 
     for child in scnView.scene!.rootNode.childNodes { 
      let materials = child.geometry?!.materials as! [SCNMaterial] 
      let material = materials[0] 
      if material.diffuse.contents as! NSObject == UIColor.whiteColor(){ 
       count++ 
      } 
     } 
     return count 
    } 

    if let panGesture = gesture as? UIPanGestureRecognizer { 

     let location = gesture.locationInView(scnView) 

     let hitResults = scnView.hitTest(location, options: nil) 
     if hitResults?.count > 0 && (numberOfWhiteSpheres < 3) { 
      let result = hitResults![0] as! SCNHitTestResult 
      let node = result.node 
      SCNTransaction.begin() 
      SCNTransaction.setAnimationDuration(1.0) 
      let materials = node.geometry?.materials as! [SCNMaterial] 
      let material = materials[0] 
      colorsTrio.append(material.diffuse.contents as! [UIColor]) 
      material.diffuse.contents = UIColor.whiteColor() 
      SCNTransaction.commit() 

     } 
    } 
} 

的想法是我的球的顏色屬性存儲在一個數組,然後使用另一個函數比較。我可以成功構建程序,但是一旦我開始選擇其中一個球體,我遇到以下錯誤:「無法將類型'UICachedDeviceRGBColor'(0x101ebfd80)的值轉換爲'NSArray'(0x100af4470)。」我明白,不可能將該屬性追加到我的數組中。關於如何避免這個問題的任何想法?

回答

1

你得到,因爲這行的錯誤:

colorsTrio.append(material.diffuse.contents as! [UIColor]) 

material.diffuse.contents目的是(的子類)UIColor的單個實例,而你試圖將其轉換爲一組UIColor的實例。該Array.append方法接受一個元素作爲它的參數,元素的不是另一個數組,這樣你就可以改變你的施法修正此錯誤:

colorsTrio.append(material.diffuse.contents as! UIColor) 

然而,這仍然不是一個好主意。顏色是比較模糊的東西。 (#FF0000真的與#FE0000有什麼不同,爲什麼?)在你描述的程序中,你有幾種顏色在其意義上有語義上的區別 - 你關心的是紅色球體和藍色球體之間的區別,而不是顏色空間和組件值之間的細微區別。

在任何遊戲中,將遊戲模型獨立於顯示器是一個不錯的主意 - 您希望能夠測試用於將球體與放置在屏幕上的代碼分開匹配的邏輯。因此,製作一個包含語義顏色值的模型。例如:

enum Color { 
    case Red, Yellow, White /* ... etc ... */ 
} 
class GameNode: SCNNode { 
    var color: Color 
    // ... 
} 

// elsewhere... 
let hitResults = scnView.hitTest(location, options: nil) as! [SCNHitTestResult] 
if let result = hitResults.first { 
    if let node = result.node as GameNode { 
     colorsTrio.append(node.color) 
     // ... 
    } 
} 

// still elsewhere... 
if (colorsTrio[0] == colorsTrio[1] && colorsTrio[1] == colorsTrio[2]) { 
    // match! 
} 
+0

非常感謝您的幫助,我實際上嘗試過這樣做,但遺留問題很少。當你在其他地方說你的意思是在不同的班級,對吧? –

1

你正在吃material.diffuse.contents[UIColor](即一組顏色)。不應該只是UIColor

material.diffuse.contents as! UIColor