2014-11-11 11 views
5

Mam aplikację spritekit napisaną w szybkim tempie i chcę uzyskać kolor w pikselu, który dotyka mojego palca.Jak uzyskać piksel w dotyku z wnętrza SKScene?

Widziałem wiele postów na ten temat i wypróbowałem je wszystkie, ale nie mogę się zgrać, żeby to zadziałało. Po przejściu do innego postu powinno być możliwe uzyskanie koloru z UIView, a ponieważ SKScene ma SKIView, który dziedziczy z UIView, powinno być możliwe uzyskanie koloru z tego miejsca.

Aby sprawić, by pytanie było łatwe i zrozumiałe, mam przykład.

Utwórz nową aplikację spritekit i dodaj do niej zdjęcie. W moim przypadku stworzyłem obraz png o wymiarach 200x200 pikseli z wieloma różnymi kolorami.

Jest to plik GameScene.swift, że jest to jedyny plik mam zmiany w porównaniu z auto generowane:

import SpriteKit 

extension UIView { 
    func getColorFromPoint(point:CGPoint) -> SKColor { 
     var pixelData:[UInt8] = [0,0,0,0] 

     let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() 
     let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.toRaw()) 
     let context = CGBitmapContextCreate(&pixelData, 1, 1, 8, 4, colorSpace, bitmapInfo) 

     CGContextTranslateCTM(context, -point.x, -point.y); 
     self.layer.renderInContext(context) 

     var red:CGFloat = CGFloat(pixelData[0])/CGFloat(255.0) 
     var green:CGFloat = CGFloat(pixelData[1])/CGFloat(255.0) 
     var blue:CGFloat = CGFloat(pixelData[2])/CGFloat(255.0) 
     var alpha:CGFloat = CGFloat(pixelData[3])/CGFloat(255.0) 

     var color:SKColor = SKColor(red: red, green: green, blue: blue, alpha: alpha) 
     return color 
    } 
} 

class GameScene: SKScene { 

    var myColorWheel:SKSpriteNode! 

    override func didMoveToView(view: SKView) { 
     let recognizerTap = UITapGestureRecognizer(target: self, action:Selector("handleTap:")) 
     view.addGestureRecognizer(recognizerTap) 

     myColorWheel = SKSpriteNode(imageNamed: "ColorWheel.png") 
     myColorWheel.anchorPoint = CGPoint(x: 0, y: 0) 
     myColorWheel.position = CGPoint(x: 200, y: 200) 
     self.addChild(myColorWheel) 
    } 

    func handleTap(recognizer : UITapGestureRecognizer) 
    { 
     let location : CGPoint = self.convertPointFromView(recognizer.locationInView(self.view)) 
     if(myColorWheel.containsPoint(location)) 
     { 
      let color = self.view?.getColorFromPoint(location) 
      println(color) 
     } 
    } 
} 

To nie ma znaczenia, gdzie pędzę obrazu na wyświetlaczu, wynik jest zawsze: Optional(UIDeviceRGBColorSpace 0 0 0 0)

+0

Czy próbowali za pomocą 'kCGImageAlphaPremultipliedLast' w miejscu swojego' bitmapInfo'? – rmp

Odpowiedz

0

próbowałeś wziąć migawkę pierwszym użyciu:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 

Następnie wybierając kolory z tym poglądem?

Nie wiem, w jaki sposób system renderuje odtwarzacz w SKView.

Nadzieję, że pomaga.

Cheers