2013-12-17 12 views
7

Po prostu bawić się z SpriteKit i próbuję dowiedzieć się, jak przechwycić "przechwytywania" SKNode do UIImage.Jak renderować SKNode do UIImage

W UIView (lub podklasę UIView) użyłem właściwości layer widoku do renderowania w kontekście graficznym.

Np.

#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 nie jest podklasą UIView i dlatego nie wydaje się być wspierany przez warstwę.

Jakieś pomysły na temat renderowania danego kodu SKNode do UIImage?

Odpowiedz

9

To będzie uchwycić całą scenę:

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

Jeśli chcesz po prostu dana gałąź węzeł można ukryć wszystkie węzły, których nie chcesz, aby uchwycić przed wykonaniem zrzutu ekranu. Możesz także użyć skumulowanej ramki skonwertowanej na współrzędne UIKit, aby uchwycić tylko obszar węzła i jego dzieci.

Alternatywnie, można uzyskać SKTexture z określonej części hierarchii węzła:

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

Przed iOS 9, nie było sposobu, aby przekształcić SKTexture z powrotem do UIImage. Teraz jednak jest to banalne:

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

Dziękuję. Wyniki miały być ponownie użyte w Sprite Kit - więc textureFromNode: działało cudownie. Twoje zdrowie! –

+0

@ learncocos2d jest to nadal najlepszy sposób na zrobienie tego? –

+0

@StevenRitchie Niestety Tak. – ColdSteel