2013-12-17 6 views
7

Просто играя с SpriteKit и пытаюсь понять, как захватить «захват» SKNode в UIImage.Как визуализировать SKNode для UIImage

С UIView (или подклассом UIView) я использовал свойство вида для визуализации в графическом контексте.

Например.

#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 не подкласс UIView и, таким образом, как представляется, не быть подкреплены слоем.

Любые идеи о том, как я мог бы сделать данный SKNode для UIImage?

ответ

9

Это будет захватить всю сцену:

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

Если вы хотите просто конкретный узел ветвления можно скрыть все узлы, которые не хотят, чтобы захватить, прежде чем принимать на скриншоте. Вы можете также использовать накопленный фрейм, преобразованный в координаты UIKit, для захвата только области узла и его дочерних элементов.

В качестве альтернативы, вы можете получить SKTexture от определенной части иерархии узлов:

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

Перед прошивкой 9, не было способа преобразовать SKTexture обратно в UIImage. Теперь, однако, это тривиально:

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

Спасибо. Результаты должны были снова использоваться в комплекте Sprite Kit - так что текстураFromNode: работала чудесно. Ура! –

+0

@ learncocos2d - это еще лучший способ сделать это? –

+0

@StevenRitchie К сожалению, да. – ColdSteel