如何从 SKScene 内部获得触摸时的像素颜色?

Posted

技术标签:

【中文标题】如何从 SKScene 内部获得触摸时的像素颜色?【英文标题】:How do I get pixel color on touch from inside a SKScene? 【发布时间】:2014-11-11 17:10:31 【问题描述】:

我有一个用 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)

【问题讨论】:

你试过用kCGImageAlphaPremultipliedLast代替你的bitmapInfo吗? 【参考方案1】:

您是否尝试过先使用以下方法拍摄快照:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

然后从那个视图中挑选颜色?

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

希望对您有所帮助。

干杯

【讨论】:

以上是关于如何从 SKScene 内部获得触摸时的像素颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中从屏幕上的像素获取颜色?

使用 Swift/SKScene 检测触摸

如何从 SKScene 中执行 segue?

如何在 SKSpriteNode 中正确封装触摸事件处理并将数据传回 SKScene

如何从 SKScene 回到 UIViewController (MenuVC)?

如果我知道颜色(RGB),如何获得像素坐标?