SpriteKit:如何从SKSpriteNode中的某个点获取像素颜色?

Bri*_*ers 7 ios sprite-kit swift

我正在制作一个迷宫游戏,我正在使用SKSpriteNode作为实际的2d迷宫.

我想检测用户触摸的SKSpriteNode上的点是黑色还是白色.我创建了一个与SKSpriteNode相同的UIImage图像,我在UIImage上使用了一个方法来获取像素信息.但是,与SKSpriteNode相比,UIImage似乎是偏移的.当我在屏幕上移动手指时它会返回值,但这是不正确的.我猜UIImage与SKSpriteNode的大小和位置不同.

我怎样才能解决这个问题?

我使用以下来获取像素数据

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)
}
Run Code Online (Sandbox Code Playgroud)

}

我已经像这样制作了我的SKSpriteNode

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)

}
Run Code Online (Sandbox Code Playgroud)

这是我实际获得像素颜色的地方

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)")

    }

}
Run Code Online (Sandbox Code Playgroud)

rak*_*hbs 1

你的图片尺寸和你的尺寸一样吗SKScene

touchesBegan函数中,尝试获取触摸的位置bgImage而不是SKScene.

theColor = (mazeMap.getPixelColor(touch.locationInNode(bgImage)))
Run Code Online (Sandbox Code Playgroud)