如何从 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 中从屏幕上的像素获取颜色?
如何在 SKSpriteNode 中正确封装触摸事件处理并将数据传回 SKScene