2017-03-09 3 views
3

Je dois obtenir la couleur d'un pixel/point pour mon jeu dans Swift. J'ai donc essayé de trouver une fonction qui entre un CGPoint et retourne une couleur, tout ce que j'ai trouvé jusqu'ici n'a retourné que (0,0,0,0). Je pense que c'est parce que je fais ceci dans ma classe de scène de jeu (qui est un SKScene), et la scène est seulement chargée par un contrôleur de vue. Des solutions?Obtenir la couleur du point dans un swift SKScene

(S'il y a une meilleure façon de vérifier si un sprite est en contact avec une couleur qui fonctionnerait aussi bien)

Merci à l'avance.

+0

http://stackoverflow.com/questions/1160229/how-to-get -la-couleur-d'un pixel-dans-un-uiview a le code pour Swift 2 et 3: http://stackoverflow.com/a/26945594/1187415 –

+0

@MartinR ces solutions semblent seulement retourner la transparence/noir comme bien – joshLor

+0

dépend de quand/comment vous l'obtenez. Scène et vue sont deux choses complètement différentes, donc vos coordonnées dans la scène peuvent ne pas refléter vos coordonnées dans la vue, et le contenu ne peut pas être rendu au contexte avant qu'il ne soit dessiné. En plus de cela, vous devez vous soucier de la rétine, ce qui pourrait également conduire à un pixel invalide. Peut-être la vraie question est, pourquoi avez-vous besoin d'un point individuel, et y at-il une meilleure alternative? – Knight0fDragon

Répondre

4

Ajoutez la méthode ci-dessous:

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 
    } 
} 

Vous pouvez obtenir la couleur du point que vous voulez avec

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

Ce serait génial une extension de 'UIView' – Alexander

+0

@Alexander Ce serait génial d'avoir une extension. N'hésitez pas à modifier si vous le souhaitez. –

+0

Jetez un coup d'oeil: D c'est magnifique! – Alexander