Siv3D(2016)のゲームをOpenSiv3D(0.6.6)に移植する

はじめに

今年も12月がやってまいりました。
毎年この季節になるとVisualStudioの新しいバージョンとOpenSiv3Dの新しいバージョンをインストールします。
あと冬至なのでかぼちゃの煮つけを作ったり年賀状を書こうとしたりします。師走というだけあります。こんにちはニシャスです。

私はOpenSiv3Dがリリースされる前の旧いSiv3Dでちょこちょことミニゲームなどを作っておりました。(最近あんまり作ってません)
そこで今回はこの「昔のSiv3Dを使ったプロジェクトデータ」をOpenSiv3Dに移植できるか、
できるとしてその負担感はどのくらいかを調べるべく、実際に過去に自分が制作したゲームのコードを
OpenSiv3D向けに書き直してみることにしました。

結論から言うと移植はそんなに苦労しませんでした。

移植したもの

「10秒シューティング」を移植に使用しました。

「冬至用のアプリケーションいくつか作って投稿日冬至選んでるのにそれかよ!」というツッコミはナシでお願いします。

遊びたい方はこちら

修正するポイント

文字列

多分一番変更箇所が多いやつです。
旧Siv3Dは文字列に L プレフィックス(ワイド文字)が使われていましたが、OpenSiv3Dは U プレフィックス(UTF-32)に変わっています。なので文字列を使ったメソッドなどはすべてエラーになり変換が必要です。

L" を U" に置換すると良いでしょう。Siv3Dの他にライブラリなど使っていなければズギャッと全置換して問題ないと思います。

ウィンドウの幅・高さ

OpenSiv3Dのプロジェクトは、特に指定がなければ800x600のウィンドウが表示されます。

旧SIv3Dは640x480だったので大きくなっています。もしウィンドウサイズを書き換えているのであれば心配いらないかもしれませんが、これも要修正です。

また、ウィンドウの幅や高さを取得するのはWindow::Width()ではなくScene::Width()となっています。Windowは表示のモードやウィンドウ位置などのデータ提供役になっていますが描画画面の幅などは受け持たなくなったようです。

イージング関係

以前イージングはEasingControllerというのが使えましたが、これはないと言われます。

Siv3D 0.6.6リファレンスには、EaseInBack(t)といった「そのまんま」の名前で、tに0~1を入れると0から始まって1で終わる値を得られる「イージング関数」を使用している例が、代わりに挙げられています。

しかしこれは「n秒かけて値Aから値Bの遷移を特定のイージングの種類を使って行う」というEasingControllerとは挙動が異なるのでちょっと困ります。

ただ、実はEasingControllerは、0.6.6にEasingABと名前を変えて生き続けています。

なのでコードをなるべく変えずに再利用を行いたいのであればEasingControllerの宣言をEasingABに変えてやれば良いと思われます。

アセット関係

アセットの利用は大きくは変わっていませんが、音声関係のアセットはSoundAssetからAudioAssetに名前が変わっているので、置換してしまいましょう。特に苦労はしないでしょう。

ちなみに画像ではなくテクスチャのデータや生成したAudioのデータからアセットを生成するような場合、TextureAssetDataなどのAssetDataを使うことになると思います。この使い方の作法が従来と変わっています。

上記は1枚の画像なのですが、これを分割して複数枚数の画像アセットにしたい場合などには使うんじゃないかな

TextureAssetDataについて説明すると、以前はtextureメンバにTextureを生成してそのオブジェクト自体をTextureAsset::Register()してやれば良かったですが、現在はTextureAssetDataはstd::unique_pointer<TextureAssetData>で宣言してやって、登録の際はstd::move()の形で渡してやる必要があります。書いていて分かりづらいのでRyoさんが書いてくれたこちらご覧いただければと思います。多分「一旦TextureAsset管轄にすると以降は他から触れなくなる」というのを実現しているのだと思います。

キー、マウス関係

キーが押されていることを判定するのはInput::KeySpace.pressed プロパティから KeySpace.down() へとメソッド化しました。Input要らなくなったよ!

マウスがクリックされたかどうかを以前はInput::MouseL.clicked プロパティで見ていましたが、現在はキーボードと同じInput型で扱われるためMouseL.down()をクリックした瞬間の検知に用います。
clickedは廃止されたようです。

数学定数

円周率などの数学の定数に関しては、以前はHalfPiと書けば1/2πが使えましたが、今はMath::HalfPiと名前空間が必要になりました。

スクリーンキャプチャ

画像を使いたい前のフレームでリクエストをしてから取得をするという操作の基本は同じですが

リクエストはScreenCapture::Request() から ScreenCapture::RequestCurrentFrame() に名前が変わりました。

画像取得はScreenCapture::GetFrame()で変更ありません。

描画関係の関数

Font.drawCenter() が廃止されました。drawCenter(x, y)とdrawCenter(y)がいますが、それぞれfont.drawAt(x, y)、font.draw(arg::topCenter = Point(x, y))で代用です。基準位置を文字の上側かつ左右中央で揃えます。

ちなみにfontの文字サイズ指定は旧Siv3Dの1.5倍くらいにしないと小さくなります。ただ、これはどこか他にオプションがあるかもしれません。

その他

playMulti() は playOneShot()へ名前を変えました。

そんなこんなで、割とVisualStudioの赤線を見て修正すればそれで大体できちゃうと言った感じでした。
名前の変更などは結構ありましたが本質的な部分は踏襲されている物が多く移行しやすい印象です。
まあ長らく更新をするようなアプリケーションというのはゲームよりもツールのほうが多そうなので本記事がどれくらい役に立つかは少々疑問ではありますが……。
Siv3Dは他にも機能がたくさんあるのでこれ以外にも移植で修正しなければならない点は出るかとは思いますが、気づいたり指摘されたりしたら追記していきます。