iOS, SpriteKit 将SKTextureAtlas/SKTexture 转换成UIImage
iOS, SpriteKit convert SKTextureAtlas/SKTexture into UIImage
我正在尝试从 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"))[!
[]
此解决方案既不工作 SKTextureAtlas 也不工作 SKTextureAtlas
知道我错过了什么吗?如何实现?
干杯,
西蒙
好的,周末后我终于让它工作了。
重要部分是
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 编写游戏,但是 UI 是用 SwiftUI 完成的。
我正在尝试从 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"))[!
[
此解决方案既不工作 SKTextureAtlas 也不工作 SKTextureAtlas 知道我错过了什么吗?如何实现?
干杯, 西蒙
好的,周末后我终于让它工作了。 重要部分是
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 编写游戏,但是 UI 是用 SwiftUI 完成的。