音ゲーって作れるの?【新歓ブログリレー2019 3日目】
この記事は ICON 新歓ブログリレー2019 3日目の記事です。
はじめに
まずは新入生の皆さん、ご入学おめでとうございます!
初めまして、2019年度プログラミング班班長&プログラミング班所属の鈴木と申します。
ちなみに学部は工学部です。
プログラミング班ということでプログラミング、ゲーム制作関連の事を書こうと思います。
ただ、この記事を見ている方は新入生が多いと思うので、細かい事やプログラム自体を載せることは避け、なるべくプログラミングの知識がなくても読めるような内容にしていきたいと思います。
主にプログラミング班に興味がある人向けの記事にはなってしまいますが、今回は音ゲーの作り方に関する事を書いていこうかと思います。
音ゲーって作れるの?
最近人気ですよね、音ゲー。今はスマホでできる音ゲーなんかもたくさん出ていて、昔よりもかなり多くの人が音ゲーをプレイする機会が増えたのではないかと思います。
ICONでは様々なジャンルのゲームを作っていますが、その中でも何故音ゲーに焦点を当てたかと言いますと、そもそも僕自身が音ゲー好きなこともあり*1、ゲーム制作では音ゲーをよく制作しているのですが、僕が今まで音ゲーを作っていてよく言われたのが、「音ゲーって作れるの?」という言葉なんです。それはもう友達から文化祭のお客様まで様々な人に言われました。
僕は高校の部活でプログラミングに出会い、それからゲーム制作をしていますが、実際に僕自身もゲーム制作を始めた頃は、「音ゲーって作れるの?」と思っていました。そんな時に高校の部活の先輩方が音ゲーを作っていらっしゃって…それに憧れて僕も音ゲーを作り始めるようになりました。最初はシューティングやアクションなど色んなジャンルの制作に挑戦していたのですが、一度音ゲーを作ってからは音ゲーばかり触っている気がします()
そこで、せっかくの機会なので音ゲーが意外と簡単*2に作れることをほんの少しでも知ってもらえたらと思い今回記事にする事にしました。ゲーム制作で音ゲーを作っている人は他ジャンルのゲームより少ない気がするので、音ゲーを作る人が増えてくれたら嬉しいです。
そんなわけで今回は音ゲーの作り方(と言ってもプログラムのスクリプトを載せるわけではありませんが)を簡単に紹介しようかなと思います。ただ、全てを書いてしまうと量がとんでもないことになってしまうので、今回は特に判定の部分に着目していこうと思います。
音ゲー用語?の紹介
本記事では以下の言葉を多用するので基本的な用語の解説を先にしておきます
・譜面 曲に合わせてどのタイミングでどのような操作を行うかを記述したデータの事を言います。楽譜と同じようなものですね。
・ノーツ 音符のことです。プレイヤーは曲に合わせて流れてくるこれを見てタイミングよく操作をすることで音ゲーになりますね。大体の音ゲーでは様々な種類のノーツがあるかと思います。(TAPだとかHITだとかSLIDEだとかHOLDだとか…)
・BPM Beats Per Minute、曲のテンポの速さの事です。1分間に拍が何個置かれているかという意味で、この値が大きいほどテンポの速い曲と言えます。速い曲になると200を超えてきますね。*3
音ゲーの作り方
本題である作り方に入っていきます。作り方とは言っても、実際にプログラムを載せるわけではなく、「音ゲーを作る際に使う考え方」を並べていく感じです。(もしプログラムを見てみたい方がいましたらサークルの方で気軽に言ってくださいね!)
今回は画面の描画関係よりは、判定の方法について主に述べていこうと思います。また、プログラミングの知識がなくても&どの言語を使って作っても大丈夫なようにプログラムや細かい部分は省き、おおまかな考え方のみを書いています。
今回作る譜面
今回作ってみる譜面を用意しましょう。今回は曲を用意していないので適当にこんな感じで作ってみました。今回は簡単化のため、ノーツの種類は一番単純な「1つのボタンを叩く(1本指でタップする)」の1種類のノーツだけで構成します。
4分の4拍子で、BPMは130とします。
(一番長い縦線同士の間が1小節です)
上のノーツが左から右に流れてくる様子を想像してもらえると分かりやすいと思います。
この譜面で音ゲーを作って、プレイした時に判定をするにはどうしたら良いでしょう?
必要な情報
音ゲーは曲のタイミングに合わせてノーツを叩いていきますよね。その判定をするために時間を使っていきます。
では時間をどう使うのか。
音ゲーは言ってしまえば「ノーツを叩くべきタイミング」と「プレイヤーが操作をしたタイミング」のずれをできるだけ小さくするゲームですね。ですからこの2つのタイミングを知ることができればどれだけ正確に叩けたかの判定ができるのです(この2つのタイミングの差が小さければ小さいほど完璧に叩けたと言えますね)。
そこで、この2つのタイミングを取得する方法を以下に書いていきます。
ノーツを叩くべきタイミング
まずは「ノーツを叩くべきタイミング」の取得方法です。これは計算によって求めていきます。試しにさっき作った譜面で計算してみましょう。
まず、BPMが130ということは、1拍あたりにかかる時間は60/130 ≒ 0.4615秒ですね。1拍にかかる時間は上の図で言うと縦線と縦線の間隔になります。まずはこれを踏まえて曲が始まってからの時間を上の図に加えてみましょう。(小数第三位を四捨五入しています)
するとこれだけで0,1,3,6番目の音符を叩くべきタイミングがわかってしまいましたね。例えば、曲が始まってから1.85秒後にボタンを押せばほぼ完璧なタイミングで0番目の音符を叩くことができるわけです。
あとはもうこれを細かくしていくだけです!今回の譜面では16分音符が一番細かいのでそれに合わせてそれぞれの拍の時間を4等分してみましょう。
するとこうなります。
(前半部分は音符が置かれていないため省略しています)
これで全てのノーツを叩くべきタイミングがわかりましたね!
上の図に合わせたタイミングでボタンを叩けば完璧に演奏できるわけです。
プレイヤーが操作をしたタイミング
「ノーツを叩くべきタイミング」は取得できましたね。次に、「プレイヤーが操作をしたタイミング」を取得していきます。ここでは「Windowsを起動してから経過した時間」を用います。
Windowsを起動してから経過した時間??曲が始まってからの時間じゃないの??
と思うかもしれませんが、こうやるとちゃんと曲が始まってからの時間を計る事ができるようになります。
①音ゲーのプログラムを実行する。
②曲が始まる直前の時間を保存しておく。
③現在の時間から②の時間を引く
こうすることで曲が始まってから経過した時間を知ることができます。これを使えばストップウォッチやタイマーなどのツールを作ることもできますね。
さて、これで「曲が始まってから経過した時間」を知ることができました。そうしたらあとはプレイヤーが操作をした瞬間の「曲が始まってから経過した時間」が「プレイヤーが操作したタイミング」となります。
判定してみる
「ノーツを叩くべきタイミング」と「プレイヤーが操作をしたタイミング」が取得できました。あとはこれがどれだけずれていたかを計算するだけです。先ほど作った譜面の0番目の音符を例に考えてみましょう。
「0番目の音符を叩くべきタイミング」は1.846秒です。
これに対して「プレイヤーが操作をしたタイミング」が1.838秒だった場合、その差は8 ms*4ですね。0.008秒しかずれていないわけなのでこの人は上手いですね。
音ゲーではこの「どれだけずれていたか」の度合いを具体的な数字ではなく、何段階かに分けて表示することでプレイヤーに示していますよね。
ではここでは PERFECT>GOOD>MISS の3段階としましょう。
ここまできたらあとは判定の範囲を決めるだけです。
例えばこのように決めます。
2つのタイミングのずれが、
50ms以下だったらPERFECT
120ms以下だったらGOOD
120msよりも大きかったらMISS
図に表すとこうなります。
ちなみにこの一番良い判定の判定幅が±50msというのは音ゲーでは判定甘めの部類に入ると思います*5。アーケードの音ゲーだと±30ms前後が多いみたいです。
以上で音ゲーの判定ができるようになりましたね!
あとは以上のことをプログラムに書き起こして、ノーツやスコアを画面に描画したり、演出を付けたりすれば音ゲーの完成です!
おわりに
今回は音ゲーの判定方法をプログラムを使わずに紹介してみました。
ただ、あくまでもこの方法は一例であり、また、一部しか紹介していないのでまだまだ工夫ができるかと思います。
ここまで読んでいただきありがとうございました。
雑な紹介になってしまったかもしれませんが、今回の記事で少しでも音ゲー制作に興味を持っていただけたら幸いです。
音ゲーを作ってみたかったけれど、作り方がわからなかった方も、
音ゲーをやった事がなかったけれど、音ゲーを作ってみたいと思った方も、
ぜひ音ゲーを作ってみてはいかがでしょうか。
ICONに興味のある方は、まずは11日の説明会・展示会に気軽に参加してみてくださいね!
それでは、また~
2021.04追記:続編できました!!
*1:僕がAC版でデータを持っている音ゲーは、GROOVE COASTER,太鼓の達人,jubeat,maimai,CHUNITHM,SOUND VOLTEXあたりで、ここ4年ほどはメインでGROOVE COASTERをプレイしています。音ゲー好きの方はぜひ教えてください!
*2:簡単とは言いましたが、プログラミングを始めてすぐに作れるという意味ではありません。まずは単純なゲームから作ってみて、プログラミングによるゲーム制作に慣れていくことをお勧めします。
*3:一部の曲ではこのBPMが曲の途中で変化するものもあり、これに対応した音ゲーを作るにはひと工夫が必要です。ただ、ほとんどの曲のテンポは一定となっているのでとりあえず音ゲーを作ってみたい!という分にはBPM変化は考えなくてよいでしょう。
*4:ms ...ミリ秒、1/1000秒のことです。ゲーム制作ではよく使う単位です。
*5:僕がつくる音ゲーはだいたい一番良い判定の判定幅を±60msにしています。音ゲーとしてはかなーり甘い判定になりますが、自作ゲームなのでこれくらいのほうが気持ちよくプレイできるのではないかなと思ってこうしています。音ゲーガチ勢の方からは甘すぎだと怒られるかもしれませんが()