[ios]SKSpriteNode 创建的 SKTexture(data:size:) 问题与 α (不透明度)

标签: sprite-kit ios Swift
发布时间: 2017/4/3 19:48:25
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

从 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 部分 0xff0000ff0xff00ff000xffff0000 ︰ 红色、 绿色和蓝色)。

然而,我预期将会完全透明的顶行︰ 0x000000ff ,这应该意味着 rgba (1,0,0,0)。但它出现如下︰

我不知道为什么会这样。我的 pixelData 的理解是错了?或者是一个 bug,或者在 SpriteKit 的东西?

非常感谢你的帮助 !

解决方法 1:

从方便方法将转换到像素数据的文档 SKTexture

颜色分量应该已被已经相乘的 alpha 值。

因此,价值 0x000000ff 不确定,因为红色分量不能 0xff 如果 alpha 值为 0。它也有点非直观来表示一个像素的颜色的十六进制值,特别是当组件的反向顺序。

或者,您可以定义一个数据结构来代表一种颜色,然后预乘以每个颜色分量的 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))
官方微信
官方QQ群
31647020