Hatena::ブログ(Diary)

伝書閑古鳥

2017年11月13日(月)

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公式のドキュメントです。


そしてこれをはてなダイアリーで公開するという。

もっといい場所あるだろうと。

でも面倒だしこれでいいや。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/unlow/20171113/1510570739