SKSceneのゲーム画面をPNG形式で保存する(Swift 4.0)
macOS向けのSpriteKitを使用したSwiftプログラムで
ゲーム画面をPNG形式で保存する方法がなかなか見つからなかったので、
とりあえず動いたものをメモがてら公開します。
なぜ動くのかは知らない。
バージョンはSwift 4.0.2です。
extension GameScene { func savePNG() { let texture = self.view!.texture(from: self) let image = texture?.cgImage() let bitmap = NSBitmapImageRep(cgImage: image!) let data = bitmap.representation(using: NSBitmapImageRep.FileType.png, properties: [:])! let filename = "test.png" if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last { do { try data.write(to: dir.appendingPathComponent(filename)) } catch let error as NSError { print("failed to write: \(error)") } } } }
前半部で、ゲーム画面から保存したい画像を取り出しています。
本体のSKScene内のSKViewを参照し、
SKScene自身に関連するSKTextureを取り出してる模様。
そのSKTextureをCGImage、NSBitmapImageRep、Dataと順々に変換し
保存可能な形式に持ち込んでいる模様。
(なんだか呪文みたい)
後半部は、データの保存部分ですね。
Data型のメソッドであるwrite関数で保存先を指定して保存します。
引数が、URL型とString型があるので注意(ここではURL型になっています)。
保存部分でエラー吐かれたら、頑張るしかありません。
色々変換しているのが遠回りなように見えて
もっとスマートに保存できないのかと思ってますが、
趣味のものなので、動けばそれでいいか、と。
検索すれば色々ヒットはするんですけど、
どうやらmacOSじゃない方の解決法っぽいのが多くて。
なお、たくさんのサイトを参考にしましたが、
組み合わせてるうちにどれを参考にしたかわからなくなったので、
紹介は省略します。
大体はApple公式のドキュメントです。
そしてこれをはてなダイアリーで公開するという。
もっといい場所あるだろうと。
でも面倒だしこれでいいや。