3

从 pixelData 创建 SKSpriteNode 时遇到问题。

下面是我的代码。

var pixelData: [UInt32] = [UInt32](count: 256, repeatedValue: 0xff0000ff)
pixelData.appendContentsOf([UInt32](count: 256, repeatedValue: 0xff00ff00))
pixelData.appendContentsOf([UInt32](count: 256, repeatedValue: 0xffff0000))
pixelData.appendContentsOf([UInt32](count: 256, repeatedValue: 0x000000ff))

let data = NSData(bytes: pixelData, length: pixelData.count * sizeof(UInt32))

let texture = SKTexture(data: data, size: CGSize(width: 32, height: 32))

let node = SKSpriteNode(texture: texture, size: CGSize(width: 32, height: 32))
node.position.x = self.frame.midX
node.position.y = self.frame.midY

self.addChild(node)

对于底部的三行(这是 pixelData 数组中的前 3 部分,0xff0000ff, 0xff00ff00, 0xffff0000: Red、Green 和 Blue),它如我所愿。

但是,我希望第一行是完全透明的:0x000000ff,这应该意味着 rgba(1, 0, 0, 0)。但它看起来像这样:

我不知道为什么会这样。我对pixelData的理解错了吗?或者它是 SpriteKit 中的错误或什么?

非常感谢您的帮助!

4

1 回答 1

1

从将像素数据转换为 的便捷方法的文档中SKTexture

颜色分量应该已经乘以 alpha 值。

因此,该值是未定义的,因为如果 alpha 值为 0,则0x000000ff红色分量不能是。此外,用十六进制值表示像素颜色有些不直观,特别是当分量以相反的顺序排列时。0xff

或者,您可以定义一个数据结构来表示一种颜色,然后在初始化期间将每个颜色分量预乘以 alpha 值:

struct Color {
    var red:UInt8
    var green:UInt8
    var blue:UInt8
    var alpha:UInt8

    // You can omit the parameters that have default values.
    init(red:UInt8=0, green:UInt8=0, blue:UInt8=0, alpha:UInt8=UInt8.max) {
        let alphaValue:Float = Float(alpha) / 255
        self.red = UInt8(round(Float(red) * alphaValue))
        self.green = UInt8(round(Float(blue) * alphaValue))
        self.blue = UInt8(round(Float(green) * alphaValue))
        self.alpha = alpha
    }
}

pixelData然后,您可以使用与您的代码“相同”的值定义和初始化一个数组

    var pixelData:[Color] = [Color](count: 256, repeatedValue: Color(red: UInt8.max))
    pixelData += [Color](count:256, repeatedValue: Color(green: UInt8.max))
    pixelData += [Color](count:256, repeatedValue: Color(blue: UInt8.max))
    pixelData += [Color](count:256, repeatedValue: Color(red: UInt8.max, alpha: 0))

并创建NSData对象

    let data = NSData(bytes: pixelData, length: pixelData.count * sizeof(Color))
于 2016-08-31T09:57:32.170 回答