iOS、SpriteKit 将 SKTextureAtlas/SKTexture 转换为 UIImage

标签 ios sprite-kit uiimage sktexture sktextureatlas

我正在尝试从 SKTexture 检索 UIImage,其中 SKTexture 来自 SKTextureAtlas。
由于 .cgImage() 不适用于 Atlases,哪个 make 更难。

无论如何,我想出了使用 CoreGraphic 的解决方案,但是,这似乎也不起作用。
也许你能帮助我我在这里做错了什么?

func image(with view: SKView) -> UIImage {
    let format = UIGraphicsImageRendererFormat.default()
    format.scale = UIScreen.main.scale
    format.opaque = false
    let renderer = UIGraphicsImageRenderer(size: view.bounds.size, format: format)
    let image = renderer.image { ctx in
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
    }
    return image
}

func image(texture: SKTexture) -> UIImage {
    let view = SKView(frame:CGRect(x: 0, y: 0, width: texture.size().width, height: texture.size().height))
    let scene = SKScene(size: texture.size())
    let sprite  = SKSpriteNode(texture: texture)
    sprite.position = CGPoint(x: view.frame.midX, y: view.frame.midY)
    scene.addChild(sprite)
    view.presentScene(scene)
    return image(with: view)
}

let uiImage = image(texture: SKTexture(imageNamed: "HeavyCrossbow.png"))[!

[ enter image description here ]

此解决方案不适用于 SKTextureAtlas 或 SKTextureAtlas
知道我错过了什么,如何让它发生?

干杯,
席蒙

最佳答案

好的,周末后我终于让它工作了。
重要的部分是

guard let render = view.texture(from: sprite) else { return UIImage() }
return UIImage(cgImage: render.cgImage())

我对此表示感谢 answer

完整的工作代码:
func image(texture: SKTexture) -> UIImage {
    let view = SKView(frame:CGRect(x: 0, y: 0, width: texture.size().width, height: texture.size().height))
    let scene = SKScene(size: texture.size())
    let sprite  = SKSpriteNode(texture: texture)
    sprite.position = CGPoint(x: view.frame.midX, y: view.frame.midY)
    scene.addChild(sprite)
    view.presentScene(scene)

    guard let render = view.texture(from: sprite) else { return UIImage() }
    return UIImage(cgImage: render.cgImage())
}

我想让它工作的原因是我正在用 SpriteKit 编写游戏,但是 UI 是用 SwiftUI 完成的。

关于iOS、SpriteKit 将 SKTextureAtlas/SKTexture 转换为 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60593925/

相关文章:

换行后 iOS 7.1 UITextView 仍未滚动到光标/插入符号

ios - NSTimer暂停计时器

xcode - 如何获得合适的场景尺寸

ios - 如何在 SpriteKit 中为带有物理体的迷宫创建路径

ios - 获取 SKSpriteNode 的位置

ios - 使用 arc4random 的更好方法

ios - block /闭包理解

swift - 如何在 dequeueReusablecell 中显示适当的图像?

iOS 用户界面测试 : Get image filename (Swift)

ios - 正确裁剪和缩放 UIImage