Siv3D January 2016が来たので昔のコードを書き換えてみた
延期に延期を重ねたSiv3D January 2016がついにリリースされました!一か月ぐらい前に笑
当時は試験中だったのであんまり遊べなかったんです。VS2015、x64対応、シリアライズ・デシリアライズ機能追加と盛りだくさんでしたが、自分のお気に入りはこの機能です。
January 2016からexeファイルのリソースの読み込みというかなり強力な機能が追加されました。
プログラマーからすれば実行ファイルとリソースが分かれているのなんて当たり前ですが、普通の人からすればそんなことなくて、ダウンロードしたゲームを移動させようとして、アプリ感覚でexeファイルだけ移動させて起動できない、、、なんてざらです。
ってことでこの機能追加されたら絶対対応させよう、でも今までとやり方変わったら面倒だなと思ったんですが、ファイルパスのところをリソース番号に置き換えるだけとかなり簡単だったんで驚きました。
ちなみに今まで面倒だったアーカイブファイルとアセット管理の連携も追加されてました。
TextureAssetDataというクラスを通じてやりとりするのでちょっとわかりづらいですが、ファイルパスが入ってたとこにTextureAssetData型が入ってると覚えれば大丈夫です。
さて、今回のSiv3Dのアップデート対応のために今まで公開していたプログラムを書き換えたので、Siv3Dの変更を見つつ宣伝させてもらいます。
AscAnime
もう一年以上前のコードなので自分の技術的成長もあったんですが大幅に変更しました。
まず、今までupdate関数の呼ばれた回数でアニメーションを進める、つまり更新の時間がFPSに依存していたんですが、内部でStopwatchを使ってFPSに依存しないようにしました。Siv3Dは基本60FPS以上行かないようになっているんですが、60FPSの制限を設けるVSyncを切る機能ができたのでこっちに合わせました。Siv3Dの機能でFPS依存なものって見かけないのでいまのところ困ってはないです。
そして、豊富なSiv3DのTexture::draw系の関数をラップしてたのをヘッダーに戻してインライン化を期待してみました(昔インライン化とか知らなかった)まぁ、書き直すのが面倒というのもあったんですが、、、
あと、Texture型じゃなくてTextureAssetに登録した名前で管理するAssetAnime型を追加しました。プリロードやリリースがしやすいのでこっちの方がいいかもしれません。
AscSavedata
MemoryReaderがByteArrayに、Crypto系関数がCrypto2に移行した以外APIの変更はありませんでしたが、シリアライズが実装されたのでわざわざ文字列で管理してるこいつはもういらないかもしれません。
一応、今までプリプロセッサで暗号化するかだとか、AppDataに保存するかを使い分けていたのですが、最近はそういうのあんまりしないそうなので暗号化か否かは関数でAppDataの取得にいたっては新しくSpecialFoldersモジュールを作成しました。
単なるSHGetSpecialFolderPathのラッパーなんですが、これのあるshlobj.hをインクルードするとSiv3DのSystem::CreateProcess関数が衝突するので要注意です。
AscInput
これはかなり最近ですし、アップデート見越してたので変更はなかったです。強いて言えばライセンスを加えました。Unlicenseなので煮るなり、焼くなり、たこ焼きに入れるなりお好みでどうぞ。
振り返ってみて
一年もすると書くコードもかなり変わりますね。昔こんな書き方してたのかよって思ったところが多々ありましたが、来年の自分にもまたそう言ってもらえるようになりたいものです。