Edited at
Siv3DDay 8

ネイティブC++とOpenSiv3Dで音ゲーを作った話


はじめに

はじめまして, shirryです.長野で高専生をしています.今回初めてadvent calenderに投稿させていただきます.

今年の学校の文化祭で,OpenSiv3Dを使って音楽ゲームを友達と合作したときの話をしたいと思います.

参考までに:僕のGithub 友達のGithub

今回作った音ゲーのリポジトリ:https://github.com/shirry0129/miditone


事の始まり

企画係:クラス企画なにする?

僕:音ゲーやりたい

クラス投票を経て...

企画係:音ゲーに決まりました


開発

一緒に開発をした友達が,過去に一人で音ゲーを作っていたので,そのときの知見を借りて作成しました.


システム

ノートの判定クラスや譜面の読み込みクラスといったI/Oまわりや,ノートの描画位置を決定するためのクラスなどの下請けクラスはネイティブC++を使って友達に書いてもらいました.任せっきりなので正直よく分かってない…


描画/データ構造

シーン遷移や各シーンの描画,読み込んだデータの管理の部分は僕が作りました.

判定エフェクトの部分は友達が作ってくれました.


シーン遷移/データ管理

HamFrameworkのSceneManagerを使用させていただきました.(hamukun様ありがとうございます)

各シーンでのデータの共有も,HamFrameworkのSceneManagerが提供する機能を用いて行いました.


各シーンの描画

今回の音ゲーはアーケードのものと似たシステムで作ったので,次のようなシーン構成で各シーンを作成しました.

タイトル

選曲
パラメータ設定
プレイ
リザルト
トータルリザルト
エンディング

基本的に画像を用いて描画を行い,スコアなどの可変な値のみStringを用いて動的に表示を行いました.

プレイシーンでは,ノートの降ってくるレーンを画面奥に消失点を置いて描画したので,つねに同じ速度で移動をしていると錯視?で速さが変わっているように見えてしまい,それを減らすための処理(速度,高さを1次関数で制御)しました.しかし,そのときの最適なパラメータが分からず苦労しました.



(念のため曲情報にぼかしを入れています)

また,文字列を表示する場所では,Glyphを使って文字幅を変化させることで枠内に収まるように表示させることができました.Glyphすごく便利.

他にも,選曲画面などで今選択されているものをハイライトするのにRectのメソッドで移動/拡大をしたり,Siv3Dにめちゃくちゃお世話になりました.



(パラメータ設定画面.まわりの1回り小さい四角はscaledとTransformer2Dでスケールを縮めている)


データ管理

実は開発の時点でAudioAssetが存在していることに気付いていなくて,毎回ファイルを読んでいます()

これが原因かどうかは分かりませんが,Windowsへ持っていって動かすとオーディオファイルのロードがかかるタイミングで落ちたり落ちなかったりして,本番中にリアルタイムデバッグをするはめになっていた(もうしたくない)

macだと落ちることなく動いたのはなんでだろう…

また,選曲画面で用いたジャケット写真をpngファイルで1つ1つ用意していたんですが,ID3タグ情報から直接引っぱってこれたらなー,とか思って音ゲー製作が終わった後でそれ用のクラスを作ろうとしています.


悩んだこと


視覚効果の軽減

先述したプレイシーンでの速さの変化の違和感をうまく無くす方法が全く分からず,あてずっぽうな実装になった.今思えばEasing使ったらうまく行ったんだろうか.


データ管理

AudioAssetなんで無いと思ってたんだろうか.それと,ディレクトリ構造をどうするべきかいい解が分からず,音源用,ジャケット写真用とだけしか分けていなくて,各データは曲idで名前を付けてしまったのですごく分かりづらくなってしまった.


得られたこと

ここまで大きなプログラムを書いたことは無かったので,オブジェクト指向のありがたみがすごく分かった.C++つえー.

あとは経験って大事だということ.

実際に自分で書いてみることで,ここはこうすればきれいだな,とか,ここもっと効率よく書きたいな,とかの新たな発見や疑問が出てきて,それによって次のコードがきれいに書けるようになるし,次の開発ではこの経験をふまえての試行錯誤が出来るようになると思った.


最後に

開発をいっしょにしてくれた友達ことnanamin,そして素晴らしいフレームワークを開発して下さったReputeless様,すごく便利なSceneManagerを作成してくれたhamukun8686様,ありがとうございました.

作者のReputeless様には夏に長野に来ていただき,直にお話を聞かせてもらうことができ,開発の大きな助けとなりました.

この場を借りてお礼申し上げます.

おかげで自分1人では出来ないことが簡単にでき,それによってさらにプログラムをやりたいと思えるようになりました.

今回の開発を通して,自分1人でやりたい,作りたいと思うものが出来たので,今度はそれをやっていこうかなと.

Siv3D関連でいえば,ID3タグが読めるようにしてプルリクエストを投げてみようかなと思っていたり(いつになることやら),SwiftにSiv3Dを移植してみたいな,ともぼんやり思ってたりします.

拙い文章ではありましたが,ここまで読んでいただきありがとうございました.