iOS, SpriteKit конвертирует SKTextureAtlas / SKTexture в UIImage - PullRequest
4 голосов
/ 09 марта 2020

Я пытаюсь получить UIImage из SKTexture, откуда SKTexture происходит из SKTextureAtlas. Который делает сложнее из-за того, что .cgImage () не работает на Atlases.

В любом случае, я придумала решение использовать CoreGraphi c, но, похоже, оно тоже не работает. Может быть, вы можете помочь мне, что я сделал не так здесь?

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. Есть идеи, что я сделал пропустил, как это сделать?

Ура, Шимон

1 Ответ

2 голосов
/ 09 марта 2020

ок, после выходных у меня наконец-то все заработало. Важная часть -

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

, которую я получил благодаря этому ответу

Полный рабочий код:

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, но пользовательский интерфейс сделан с помощью SwiftUI.

...