2017-03-09 61 views
3

我需要在Swift中获取我的游戏的像素/点的颜色。所以我试图找到一个输入一个CGPoint并返回一个Color的函数,到目前为止我发现的所有东西都只返回(0,0,0,0)。我认为这是因为我在我的游戏场景类(这是一个SKScene)中执行此操作,并且场景仅由视图控制器加载。任何方案?在SKScene swift中获取点的颜色

(如果有更好的方法来检查,如果一个精灵被触摸的颜色,将工作以及)

在此先感谢。

+0

http://stackoverflow.com/questions/1160229/how-to-get一个像素在uiview中的颜色具有代码Swift 2和3:http://stackoverflow.com/a/26945594/1187415 –

+0

@MartinR这些解决方案似乎只返回透明/黑色为以及 – joshLor

+0

取决于你何时/如何得到它。场景和视图完全是2种不同的东西,所以你场景中的坐标可能不会反映你在视图中的坐标,加上内容直到绘制之后才会呈现给上下文。最重要的是,你需要担心视网膜,这也可能导致无效像素。也许真正的问题是,为什么你需要一个单独的点,并有更好的选择? – Knight0fDragon

回答

4

添加下面的方法:

extension UIView { 
    func getColor(at point: CGPoint) -> UIColor{ 

     let pixel = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: 4) 
     let colorSpace = CGColorSpaceCreateDeviceRGB() 
     let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) 
     let context = CGContext(data: pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)! 

     context.translateBy(x: -point.x, y: -point.y) 
     self.layer.render(in: context) 
     let color = UIColor(red: CGFloat(pixel[0])/255.0, 
          green: CGFloat(pixel[1])/255.0, 
          blue: CGFloat(pixel[2])/255.0, 
          alpha: CGFloat(pixel[3])/255.0) 

     pixel.deallocate(capacity: 4) 
     return color 
    } 
} 

你可以得到你想要的点的颜色与

let color = someView.getColor(at: somePoint) 
+0

这将非常棒'UIView'的扩展 – Alexander

+0

@Alexander有扩展会很棒。如果你愿意,随意编辑。 –

+0

看一看:它很美! – Alexander