Mam aplikację spritekit napisaną w szybkim tempie i chcę uzyskać kolor w pikselu, który dotyka mojego palca.Jak uzyskać piksel w dotyku z wnętrza SKScene?
Widziałem wiele postów na ten temat i wypróbowałem je wszystkie, ale nie mogę się zgrać, żeby to zadziałało. Po przejściu do innego postu powinno być możliwe uzyskanie koloru z UIView, a ponieważ SKScene ma SKIView, który dziedziczy z UIView, powinno być możliwe uzyskanie koloru z tego miejsca.
Aby sprawić, by pytanie było łatwe i zrozumiałe, mam przykład.
Utwórz nową aplikację spritekit i dodaj do niej zdjęcie. W moim przypadku stworzyłem obraz png o wymiarach 200x200 pikseli z wieloma różnymi kolorami.
Jest to plik GameScene.swift, że jest to jedyny plik mam zmiany w porównaniu z auto generowane:
import SpriteKit
extension UIView {
func getColorFromPoint(point:CGPoint) -> SKColor {
var pixelData:[UInt8] = [0,0,0,0]
let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.toRaw())
let context = CGBitmapContextCreate(&pixelData, 1, 1, 8, 4, colorSpace, bitmapInfo)
CGContextTranslateCTM(context, -point.x, -point.y);
self.layer.renderInContext(context)
var red:CGFloat = CGFloat(pixelData[0])/CGFloat(255.0)
var green:CGFloat = CGFloat(pixelData[1])/CGFloat(255.0)
var blue:CGFloat = CGFloat(pixelData[2])/CGFloat(255.0)
var alpha:CGFloat = CGFloat(pixelData[3])/CGFloat(255.0)
var color:SKColor = SKColor(red: red, green: green, blue: blue, alpha: alpha)
return color
}
}
class GameScene: SKScene {
var myColorWheel:SKSpriteNode!
override func didMoveToView(view: SKView) {
let recognizerTap = UITapGestureRecognizer(target: self, action:Selector("handleTap:"))
view.addGestureRecognizer(recognizerTap)
myColorWheel = SKSpriteNode(imageNamed: "ColorWheel.png")
myColorWheel.anchorPoint = CGPoint(x: 0, y: 0)
myColorWheel.position = CGPoint(x: 200, y: 200)
self.addChild(myColorWheel)
}
func handleTap(recognizer : UITapGestureRecognizer)
{
let location : CGPoint = self.convertPointFromView(recognizer.locationInView(self.view))
if(myColorWheel.containsPoint(location))
{
let color = self.view?.getColorFromPoint(location)
println(color)
}
}
}
To nie ma znaczenia, gdzie pędzę obrazu na wyświetlaczu, wynik jest zawsze: Optional(UIDeviceRGBColorSpace 0 0 0 0)
Czy próbowali za pomocą 'kCGImageAlphaPremultipliedLast' w miejscu swojego' bitmapInfo'? – rmp