我正在尝试使用SpriteKit的SKMutableTexture
课程,但我不知道如何使用UnsafeMutablePointer< Void >
。我有一个含糊的想法,它是指向内存中一连串字节数据的指针。但是我该如何更新呢?这在代码中实际上是什么样的?
修改
这是一个可以使用的基本代码示例。我怎么能做到这一点就像在屏幕上创建一个红色方块一样简单?
let tex = SKMutableTexture(size: CGSize(width: 10, height: 10))
tex.modifyPixelDataWithBlock { (ptr:UnsafeMutablePointer<Void>, n:UInt) -> Void in
/* ??? */
}
答案 0 :(得分:12)
来自SKMutableTexture.modifyPixelDataWithBlock
的文档:
假设纹理字节存储为紧密压缩的32 bpp,8bpc(无符号整数)RGBA像素数据。您提供的颜色分量应该已经乘以alpha值。
因此,当您获得void*
时,基础数据采用4x8位流的形式。
您可以像这样操纵这样的结构:
// struct of 4 bytes
struct RGBA {
var r: UInt8
var g: UInt8
var b: UInt8
var a: UInt8
}
let tex = SKMutableTexture(size: CGSize(width: 10, height: 10))
tex.modifyPixelDataWithBlock { voidptr, len in
// convert the void pointer into a pointer to your struct
let rgbaptr = UnsafeMutablePointer<RGBA>(voidptr)
// next, create a collection-like structure from that pointer
// (this second part isn’t necessary but can be nicer to work with)
// note the length you supply to create the buffer is the number of
// RGBA structs, so you need to convert the supplied length accordingly...
let pixels = UnsafeMutableBufferPointer(start: rgbaptr, count: Int(len / sizeof(RGBA))
// now, you can manipulate the pixels buffer like any other mutable collection type
for i in indices(pixels) {
pixels[i].r = 0x00
pixels[i].g = 0xff
pixels[i].b = 0x00
pixels[i].a = 0x20
}
}
答案 1 :(得分:7)
UnsafeMutablePointer<Void>
是等同于void*
的Swift - 一个指向任何东西的指针。您可以将基础内存作为其memory
属性进行访问。通常,如果您知道底层类型是什么,则首先强制指向该类型的指针。然后,您可以使用下标来访问特定的&#34;插槽&#34;在记忆中。
例如,如果数据实际上是一系列UInt8值,您可以说:
let buffer = UnsafeMutablePointer<UInt8>(ptr)
您现在可以将{0}个{,1}},buffer[0]
等个人UIInt8值视为。