2015-07-20 50 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