2013-12-17 16 views
7

Sto solo giocando con SpriteKit e sto cercando di capire come catturare un "grab" di un SKNode in un UIImage.Come eseguire il rendering di un codice SKNode su UIImage

Con UIView (o una sottoclasse UIView), ho utilizzato la proprietà layer della vista per il rendering in un contesto grafico.

Es.

#import <QuartzCore/QuartzCore.h> 
+ (UIImage *)imageOfView:(UIView *)view { 
    UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, 0.0f); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [view.layer renderInContext:context]; 
    UIImage *viewShot = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return viewShot; 
} 

SKNode non è una sottoclasse di UIView e quindi non sembra essere sostenuta da uno strato.

Qualche idea su come posso rendere un determinato SKNode a un UIImage?

risposta

9

Questo sarà catturare l'intera scena:

CGRect bounds = self.scene.view.bounds; 
UIGraphicsBeginImageContextWithOptions(bounds.size, NO, [UIScreen mainScreen].scale); 
[self drawViewHierarchyInRect:bounds afterScreenUpdates:YES]; 
UIImage* screenshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Se si desidera solo un ramo particolare nodo è possibile nascondere tutti i nodi che non si desidera catturare prima di prendere screenshot. È inoltre possibile utilizzare il frame accumulato convertito in coordinate UIKit per acquisire solo l'area del nodo e dei relativi figli in questione.

In alternativa, è possibile ottenere un SKTexture da una parte specifica della gerarchia del nodo:

SKTexture* tex = [self.scene.view textureFromNode:yourNode]; 

Prima di iOS 9, non c'era modo per convertire un SKTexture di nuovo ad un UIImage. Ora, tuttavia, è banale:

UIImage *image = [UIImage imageWithCGImage:tex.CGImage]; 
+1

Grazie. I risultati dovevano essere usati di nuovo in Sprite Kit, quindi textureFromNode: funzionava meravigliosamente. Saluti! –

+0

@ learncocos2d è ancora il modo migliore per farlo? –

+0

@StevenRitchie Purtroppo Sì. – ColdSteel