español - ios Sprite Kit screengrab?
setting up bandcamp (4)
Estoy intentando obtener una captura de pantalla de una vista que tiene un SKScene. La técnica que estoy usando es:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Esto funciona muy bien con UIViews normales, pero por cualquier razón está ignorando todos los sprites en el SKScene.
No estoy seguro si esto es un error, o si la representación del Sprite Kit es independiente de UIGraphics.
Pregunta: ¿Cómo obtengo una captura de pantalla de un SKScene cuando la forma en que funcionó para UIViews parece no funcionar con Sprite Kit, o si alguien tuvo éxito al utilizar el contexto UIGraphics con Sprite Kit?
// 1: obtener textura de "someNode"
let texture = skView.textureFromNode(someNode)
// 2: obtener UIImage de la textura del nodo
let image = UIImage(cgImage: texture!.cgImage())
Casi lo tienes, pero el problema es como se explica en el comentario anterior. Si desea capturar contenidos de SKScene
, intente algo como esto en su lugar:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);
[self.view drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
La solución es básicamente usar el nuevo método drawViewHierarchyInRect:afterScreenUpdates
en drawViewHierarchyInRect:afterScreenUpdates
lugar, que es el mejor que tenemos por ahora; nota, no es exactamente rápido, por lo que hacer esto en tiempo real no será bonito.
Como alternativa más rápida, puede usar el método textureFromNode
en SKView
, que devuelve una imagen de la vista como una SKTexture
. Simplemente pase el SKScene
como el argumento:
let texture = skView.textureFromNode(scene)
O para capturar parte de la escena:
let texture = skView.textureFromNode(scene, crop: cropRect)
Una solución para Swift :
func getScreenshot(scene: SKScene, duration:TimeInterval = 0.0001, completion:((_ txt:SKTexture) -> Void)?) {
let action = SKAction.run {
let bounds = scene.view?.bounds
var image = UIImage()
UIGraphicsBeginImageContextWithOptions(bounds!.size, true, UIScreen.main.scale)
scene.view?.drawHierarchy(in: bounds!, afterScreenUpdates: true)
if let screenshot = UIGraphicsGetImageFromCurrentImageContext() {
UIGraphicsEndImageContext()
image = screenshot
} else {
assertionFailure("Unable to make a screenshot for the scene /(type(of:scene))")
}
completion!(SKTexture(image: image))
}
let wait = SKAction.wait(forDuration: duration)
let seq = SKAction.sequence([wait,action])
scene.run(seq,withKey:"getScreenshot")
}
Uso :
getScreenshot(scene: self, completion:{ (txt) -> Void in
let thumbNode = SKSpriteNode(texture: txt, size:CGSize(width:300,height:224))
// do whatever you want with your screenshot..
}