LoginSignup
8
4

More than 3 years have passed since last update.

【GameMaker Studio2】リズムゲームの作り方

Last updated at Posted at 2020-07-31

はじめに

今回はGameMaker Studio2での、リズムゲームのざっくりとした作り方を紹介します。

サウンドデータの用意

まずリズムゲームに必要なサウンドデータですが、".wav" で用意します。
というのも、".mp3" といった圧縮されたサウンドファイルの場合、GameMaker Studioでは、再生開始時やループ時にラグで発生します。
そのため、通常は ".wav" ファイルで用意したほうがよいです。

".wav" の場合、ファイルサイズが大きくなりますが、
サウンドエディタで Attribute を "Compressed" (圧縮有効)の設定にすると、最終的なファイルサイズを小さくすることができます。

gms2_poker2_-_GameMaker_Studio_2-2.png

拍の計算方法

ゲームで使用する譜面は "拍" を基準に作ることになります。
というのも、"拍" がリズムの基本的な単位となるためです。

リズムゲームはタイミングに合わせてボタンを押す(またはタッチする)
というのが基本のゲーム性となるので、現在の曲の再生位置が何拍目であるかという情報が必要となります。

そして再生中の曲の現在の拍(位置)は曲のBPMから求めるのが良いです。

BPMとは1分間あたりの拍数(4分音符の数)です。
そして、以下の計算式で1秒あたりの拍数を求めます。

BPM ÷ 60秒 = 1秒あたりの拍数

例えば BPM が 120 の場合、1秒あたりの拍数は、

120 ÷ 60 = 2

となり、現在の経過秒数が "4秒" であれば、

2 x 4秒 = 8
で "8拍目" となります。

名称未設定.png

譜面データの単位

さきほど拍を基準とする……と書きましたが、
譜面の単位は「小節」を基準にすると扱いやすいかもしれません。

というのも拍を基準にした譜面データだと DAW の表記から連想しにくいためです。

スクリーンショット_2020_07_30_23_54.png

例えば、DAW はこのように 小節数 で表示され、小節単位で演奏データの区切りがされています。
そして多くのリズムゲームでも、小節単位で区切り線が引かれています。

Made_in_GameMaker_Studio_2.png

そのため、例えば、"0, 1, 2, 3, 4, 5, 6, 7, 8, ……" という拍を、4拍子であれば、
"1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, ……" という数値で扱ったほうが、
整数値の部分がちょうど小節数と一致するので、譜面データが作りやすいような気がします。

名称未設定.png

GMLの制御

では、GMLで再生中のBGMの再生位置を取る方法です。
例えば Createイベントで audio_play_sound() を使って BGM を再生し、サウンド再生番号を変数 "bgm" に保持します。

Createイベント
// BGMをループ再生
bgm = audio_play_sound(snd_Bgm, 10, true);

次に、再生番号から audio_sound_get_track_position() で再生位置を取り、BPMから現在の拍数(小節数)を計算して判定を行います。
以下は BPMが 132 の場合の例です。

Stepイベント
// 現在の再生位置を取得する
var pos = audio_sound_get_track_position(bgm);

var bpm = 132; // BPMは132とする
// 現在の再生位置を拍に変換
var note_pos = pos * bpm / 60;
// 拍から小節数に変換
note_pos /= 4;

これにより、note_pos が現在の再生位置(判定ライン)となるので、そこから譜面データの位置と差分を取って、譜面データ(ノーツ)を描画します。

Made_in_GameMaker_Studio_2-2.png

ボタンを押したときの判定は、現在位置からどれだけ離れているかで計算できます。

// 譜面の位置との差分の絶対値を計算
var diff = abs(notes - note_pos);
if(diff < 0.05) {
  // GREAT判定
}
else if(diff < 0.15) {
  // GOOD判定
}
else if(diff < 0.25) {
  // 1拍近く離れていたらBAD判定
}
else if(diff < 0.5) {
  // 1拍以上離れていたらPOOR判定
}
else {
  // 2拍ぶん離れているので判定なし
}

あと、判定するノーツは "一番近いノーツのみ" 行うようにします。

これでリズムゲームの基本的な部分を作ることができます。

rhythm.gif

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4