如何从SKScene内部获得像素颜色?

时间:2014-11-11 17:10:32

标签: ios objective-c swift sprite-kit

我有一个用swift编写的spritekit应用程序,我希望得到手指触摸的像素上的颜色。

我已经看过多篇关于此事的帖子,并尝试了全部,但不能缝合以让它为我工作。参考其他帖子应该可以从UIView获得颜色,并且SKScene有一个继承自UIView的SKIView,应该可以从那里获得颜色。

因此,为了使问题变得简单易懂,我有一个例子。

创建一个新的spritekit应用程序并向其添加图像。 在我的情况下,我创建了一个200x200像素的png图像,其中包含许多不同的颜色。

这是GameScene.swift文件,它是我自动生成的唯一文件:

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

按下显示屏上的图像并不重要,结果总是如下: Optional(UIDeviceRGBColorSpace 0 0 0 0)

1 个答案:

答案 0 :(得分:0)

您是否尝试使用以下方式拍摄快照:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

然后从该视图中选择颜色?

不确定系统如何在SKView中呈现.layer。

希望有所帮助。

干杯