sgdq español cuenta crear bandcamp app agdq ios objective-c swift sprite-kit uigraphicscontext

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.. }