太鼓さん次郎をつくってみる 2日目

前回の記事では,プログラムの骨格となる部分をInput,Game,Graphicの3クラスに分け,メインループをWinMain関数に作成しました.今回は,ゲーム中の音符データの構造を作成していきます.

音符クラスの作成

音符を表すためのデータ構造は複数考えられます.音符の種類だけでも,

  • 音符の種類を表すenumを作成し音符クラスのメンバ変数にする
  • 音符クラスから面クラス,縁クラス等の子クラスを作成する

等の方法があります.今回は,管理が楽で,tja形式とも相性のいいenumを用いることにします.なお,内部的な音符として,BPMやHSの変化を表したり,小節線を表す音符も用います.これらの処理は譜面中に埋め込まれるので,一つの音符として扱えます.

また,それぞれの音符には叩くべき時間(判定枠と重なる時間)があります.これもメンバ変数としましょう1

それから,音符が流れる速さはBPMとHSの値から計算できますが,これらの値もメンバ変数とした方が描画プログラムが簡単に書けるでしょう.

最後に,それぞれの音符にパラメータを一つ持たせることにします.これが表すのは,

  • 通常音符ならその判定(良,不可,まだ叩いていない,など)
  • 黄色連打では連打した数
  • 風船およびくすだまでは残りの連打数

とします.

というわけで,Noteクラスの構成はこんな感じ.

class Note{
    NoteName type;
    int time;
    double bpm;
    double scroll;
}

enum class NoteName{
    NOTHING,DON,KATSU,LDON,LKATSU,ROLL,LROLL,BALLON,ROLLEND,IMO,BARLINE,CHANGEBPM,CHANGESCROLL,GOGOSTART,GOGOEND
};

NoteNameは仮に作成したものなので今後変更があるかもしれません, で,tja読み取り部分から作りやすいようにコンストラクタを作り,描画用のgetterを作成します.

Note::Note(int type,int time,double bpm,double scroll,int param):type(static_cast<NoteName>(type)),time(time),bpm(bpm),scroll(scroll),param(param){}

NoteName Note::getType(){
    return type;
}
double Note::getBPM(){
    return bpm;
}
double Note::getHS(){
    return scroll;
}

次回は,tjaファイルを読み取って譜面データに変換するプログラムを作成します.

参考サイト

  1. http://dxlib.o.oo7.jp/ DXライブラリ公式サイト
  2. http://dixq.net/g/ DXライブラリでのゲーム制作について基本的なことから詳細に書かれています.
このプログラムは自学用に制作するものであり,バンダイナムコエンターテインメント様の権利の侵害を目的としたものではありません.もし問題がありましたらすぐに本記事およびソースコードを削除いたします.

  1. プログラム内部では,DXライブラリに合わせint型のミリ秒単位で時間を扱います.