2015-10-05 15 views
6

Bir labirent oyunu yapıyorum ve gerçek 2d labirent olarak bir SKSpriteNode kullanıyorum.SpriteKit: Piksel rengini SKSpriteNode'daki bir noktadan nasıl alabilirim?

Kullanıcı tarafından dokunan SKSpriteNode üzerindeki noktanın siyah veya beyaz olup olmadığını belirlemek istiyorum. SKSpriteNode ile aynı görüntü olan bir UIImage yaptım ve piksel bilgisini almak için UIImage üzerinde bir yöntem kullanıyorum. Bununla birlikte, UIImage SKSpriteNode ile karşılaştırıldığında ofset görünüyor. Parmağımı ekranın etrafında hareket ettirdiğimde değerler geri geliyor ama yanlış. Sanırım UIImage, SKSpriteNode ile aynı boyutta ve konumda değil.

Bunu nasıl düzeltebilirim? Aslında piksel rengini nereden

Ben

Burada bu

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) 

} 

gibi benim SKSpriteNode yapılmış Ve ettik piksel verilerini

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

} almak için aşağıdaki kullanmak

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 kullanıcı duygulandırıcı SKSpriteNode üzerinde nokta siyahsa algılamak istiyorum ya white._ Neden 'SKSpriteNode' en' name' ayarlamak ve onun 'name' tarafından siyah ya da beyaz belirleyemez? – WangYudong

cevap

1

Görüntünüzün boyutu SKScene ile aynı boyutta mı?

touchesBegan işlevinde, SKScene yerine bgImage içine dokunarak konumunu bulmayı deneyin.

theColor = (mazeMap.getPixelColor(touch.locationInNode(bgImage))) 
İlgili konular