SKTexure To UIImage,即 SpriteKit 截屏
问题来源
我们使用 SpriteKit 做游戏的时候,至少有两种时候需要写程序截屏:
- 完成游戏关卡后,分享到社交网络
- 自制关卡编辑器,并需要批量生成在选关界面显示关卡预览图
这个时候我们的第一反应差不多会是
SKView *skView = self.view;
SKTexutre *tex = [skView textureFromNode:skView.scene];
然而你会发现在 iOS 9 和 OS X 10.11 到来之前,这个东西并没有什么卵用,因为你踏破铁鞋也找不到能把 SKTexture 转成 UIImage/NSImage/CGImage 的方法,即使你发现 XCode 6 Debug 的时候,设置断点可以预览 SKTexture。(这个时候确实挺想逆向一下看看 XCode 是怎么做到的,可惜不会。。。ORZ)
问题解决
目前亲测可用的唯一方法,还只能用在 iOS 上,如下:
- (UIImage*) imageWithView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
然后
UIImage *img = [self imageWithView:self.skView];
如果想在 OS X 上用这个方法,抱歉不行,因为 上述方法 drawViewHierarchyInRect
只在 UIIVew 中有效,NSView 没有这个方法。如果一定要在 OS X 上截图,可能需要考虑使用 OS X 截屏方面的 API 了。
好消息是,iOS 9 和 OS X 10.11 的 SDK 里面,SKTexture 已经自带一个 CGImage 属性,自制关卡编辑器需要在 OS X 上截图的同学,看来需要尽快升级到 OS X 10.11 了。至于 iOS,显然还是需要继续使用老办法一段时间,毕竟用户的系统版本不归我们管。