2015-10-05 4 views
6

Ich mache ein Labyrinth-Spiel und ich benutze einen SKSpriteNode als das eigentliche 2d Labyrinth.SpriteKit: Wie bekomme ich die Pixelfarbe von einem Punkt in SKSpriteNode?

Ich möchte feststellen, ob der Punkt auf dem SKSpriteNode, den ein Benutzer berührt, schwarz oder weiß ist. Ich habe ein UIImage gemacht, das das gleiche Bild wie der SKSpriteNode ist, und ich verwende eine Methode auf dem UIImage, um die Pixelinfo zu erhalten. Das UIImage scheint jedoch im Vergleich zum SKSpriteNode versetzt zu sein. Es gibt Werte zurück, während ich meinen Finger über den Bildschirm bewege, aber es ist falsch. Ich schätze, das UII-Bild hat nicht dieselbe Größe und Position wie der SKSpriteNode.

Wie kann ich das beheben?

verwende ich die folgende die Pixeldaten zu erhalten

extension UIImage { 
func getPixelColor(pos: CGPoint) -> UIColor { 

    let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage)) 
    let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

    let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4 

    let r = CGFloat(data[pixelInfo])/CGFloat(255.0) 
    let g = CGFloat(data[pixelInfo+1])/CGFloat(255.0) 
    let b = CGFloat(data[pixelInfo+2])/CGFloat(255.0) 
    let a = CGFloat(data[pixelInfo+3])/CGFloat(255.0) 

    return UIColor(red: r, green: g, blue: b, alpha: a) 
} 

}

Ich habe meine SKSpriteNode wie diese

var theColor : UIColor = UIColor() 
var bgImage = SKSpriteNode(imageNamed: mazeImageName) 
var mazeMap : UIImage = UIImage(named: mazeImageName)! 

override func didMoveToView(view: SKView) { 

    bgImage.position = CGPointMake(self.size.width/2, self.size.height/2) 
    bgImage.size = CGSize(width: self.size.width, height: self.size.height) 

    self.addChild(bgImage) 

} 

gemacht und hier ist, wo ich die Pixelfarbe tatsächlich bekommen

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    if let touch = touches.first { 

     theColor = (mazeMap.getPixelColor(touch.locationInNode(self))) 

     var red : CGFloat = CGFloat() 
     var green : CGFloat = CGFloat() 
     var blue : CGFloat = CGFloat() 
     var alpha : CGFloat = CGFloat() 

     theColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha) 

     print("Red: \(red), Green: \(green), Blue: \(blue), Alpha: \(alpha)") 

    } 

} 
+0

_I wollen, dass der Punkt erkennen, ob auf dem SKSpriteNode ein Benutzer berührend ist schwarz oder white._ Warum setzen nicht 'SKSpriteNode' des' name' und durch seine 'name' schwarz oder weiß bestimmen? – WangYudong

Antwort

1

Ist die Größe Ihres Bildes gleich groß wie Ihre SKScene?

In touchesBegan Funktion, versuchen Sie, die Position Ihrer Touch innerhalb bgImage anstelle der SKScene.

theColor = (mazeMap.getPixelColor(touch.locationInNode(bgImage))) 
Verwandte Themen