2015-10-05 11 views
6

私は迷路ゲームを作っていて、私は実際の2D迷路としてSKSpriteNodeを使用しています。SpriteKit:SKSpriteNodeのポイントからピクセルの色を取得するにはどうすればよいですか?

ユーザーがタッチしているSKSpriteNodeのポイントが黒か白かを検出したいと思います。私は、SKSpriteNodeと同じイメージであるUIImageを作成しました。私はUIImageのメソッドを使用してピクセル情報を取得しています。ただし、UIImageはSKSpriteNodeと比較してオフセットされているようです。私は画面上で指を動かすと値を返しますが、間違っています。私はUIImageが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) 

} 

そして、ここのように私の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) 
} 

}

を取得するには、次の使用

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は、ユーザーが触れているSKSpriteNode上の点は、黒またはwhite._なぜ 'SKSpriteNode'の' name'のを設定し、その 'name'のことで黒または白を決定していないかどうかを検出したいですか? – WangYudong

答えて

1

画像のサイズはSKSceneと同じですか?

touchesBeganファンクションでは、の代わりにbgImageの内部にタッチの場所を表示してください。

theColor = (mazeMap.getPixelColor(touch.locationInNode(bgImage))) 
関連する問題