Blog

新人日記

音楽ゲームの実装の際の話

こんにちは。新人プログラマーの住友です。今年もあと一か月を切りました。クリスマス、年越し、お正月とイベントの多い時期ですね。まあ、自分は基本的に毎年家で一人なのでこれらのイベントで心底盛り上がるというわけではないですが、割と雰囲気自体は好きな時期です。クリスマスの日にすき焼きを作って高い日本酒を一人で傾ける。それだけでなんだかんだ楽しい気分にはなれますから。

さて、以前も少し書きましたが、自分は音楽ゲームが好きで、個人で遊ぶ用にいくつか自分で作成したことがあります。今回はプログラマーらしく、音楽ゲームの実装の流れについて書いてみたいと思います。細かい部分は書くのが大変なので、大まかに書きます。また、今回はノートが流れてくる部分の実装の話となります。

※用語集
ノート:音楽ゲームで楽曲に沿って流れてくる譜面1つ1つのこと。
レーン:ノートが流れてくる軌道。
判定タイミング:各ノートに対して入力をするタイミング。
BPM:Beat Per Minute。1分間の拍数のこと。

音楽ゲームの実装は大きく分けて以下の3つの工程に分かれます。
1.譜面ファイルの読み込み
2.読み込んだ内容を、譜面データに変換
3.譜面データを処理して画面に描画

まず、譜面ファイルの読み込みですが、これはゲーム中流れてくるノートがどのタイミングで判定されるのかを記載しているファイルを読み取る工程です。譜面ファイルの内容としては、使用楽曲の基本情報部分と譜面本体部分があれば良いかと思います。例えば、4つのレーンが横に並んでいる、画面上部からノートが流れてくるタイプのゲームの場合、
TITLE:xxxxx
BPM:160
——–
1000
0100
0010
1111,
——–
という感じで譜面を記載していくフォーマットが考えられます。上のデータの意味をざっくり説明すると、1小節で4分音符間隔のノートが左レーン、左中レーン、右中レーン、全部のレーン、に順番に流れてくる、となります。楽譜のようなイメージです。譜面ファイルが書けたら後はこれを読み込むプログラムを書くだけですが、この際、各ノートが何分音符なのかという情報(各ノートが存在する小節の分割数)をどこかに保持しておくことが大事となります。この情報は後に各ノートの判定タイミングの導出に使用します。

次に譜面ファイルの内容を、譜面データに変換する工程です。この部分では譜面ファイルの内容をもとに、各ノートの判定タイミング、出現時間、初期座標、移動速度、種類等を内部データとして決定していきます。ここで決定したデータをもとにゲーム中の処理を行うので、どのデータを用意する必要があるのかをしっかり考えることが大事となります。ネックになりそうなのが各ノートの判定タイミングですが、これは以下の式で簡単に導くことができます。


N番目のノートの判定タイミング = N – 1番目のノートの判定タイミング + 60.0 / N – 1番目のノート時点での楽曲BPM / (N – 1番目のノートが存在する小節の分割数 / 4.0)


上式で行っている計算は、1つ前のノートの判定タイミングに、その次の判定タイミングまでの時間を足しこんでいくだけとなります。足しこむ数値はBPMを使用して計算します。

さて、次はいよいよ実際に動作させる工程となります。と言ってもこの部分は正直軽く書ける内容ではないので非常に大雑把にはなりますが、基本的に使用楽曲の再生時間をもとに各ノートの出現、判定、移動等をさせていきます。音楽ゲームは楽曲に合わせて各ノートを表示させることが重要ですので、表示させる処理も楽曲の再生時間に沿っている必要があります。設定した譜面データと再生時間でうまく計算をすれば、ノートが楽曲に沿って流れていきます。

大まかではありますが、音楽ゲームの実装工程について書いてみました。もちろん、これは自分が考えたもので、人によっては全く違う実装となると思いますので、1つの例だと思っていただければと思います。本当はもう少し詳しく書いてみたいと思ったのですが、少々文章が長くなりすぎるので大まかな説明となってしまいました。

最後に、せっかくなので自分の作成した音楽ゲームのプレイ動画の一部を入れたいと思います。結構頑張って作ったものになりますので見ていただければ嬉しいです。

画面奥からノートが流れてくる音楽ゲームです
音声は無しにしています。


次の記事へ