2017-03-09 88 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