6
我正在製作迷宮遊戲,並將SKSpriteNode用作實際的2D迷宮。SpriteKit:如何從SKSpriteNode中的點獲取像素顏色?
我想檢測用戶觸摸的SKSpriteNode上的點是黑色還是白色。我製作了一個UIImage,它與SKSpriteNode的圖像相同,並且我在UIImage上使用了一個方法來獲取像素信息。但是,UIImage與SKSpriteNode相比似乎偏移了一些。當我在屏幕上移動手指時它返回值,但這是不正確的。我猜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)
}
}
我做了我的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)
}
這裏是我真正得到的像素顏色
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)")
}
}
_I要檢測是否在SKSpriteNode一個用戶觸摸點是黑色或white._爲什麼不設置'SKSpriteNode'的'name',並確定它的'name'黑色或白色? – WangYudong