龍神録プログラミングの館の方法で弾幕を管理しようとすると非常に大変なことでしょう。
例えば弾幕には「ボス」が出す弾幕と「雑魚」が出す弾幕があります。
そしてそれ全てに
・Easy
・Normal
・Hard
・Lunatic
があるわけですので、100種類(本来もっとありますが)弾幕があったとすれば、
弾幕メソッド数は単純計算で合計800個以上になります。
これ全部に関数ポインタを登録するのは大変です。
そこで楽ちん弾幕メソッド管理方法です。
弾幕(Barrage)クラスの抽象クラスをBarrageとして定義し、
そこから雑魚とボスにわけ、さらに全レベルに継承していきます。
Barrageクラスには
純粋仮装関数
virtual void Barrage000() = 0;
virtual void Barrage001() = 0;
virtual void Barrage002() = 0;
・・・を定義していきます。
ここで関数ポインタの登録は継承先で800個もいちいち格納したくないですよね。
そこで、継承元で登録してみます。
class Barrage
{
protected:
std::list> _bulletList;
typedef void(Barrage::*FUNC)();
std::vector _funcList;
virtual void Barrage000() = 0;
virtual void Barrage001() = 0;
virtual void Barrage002() = 0;
virtual void Barrage003() = 0;
virtual void Barrage004() = 0;
virtual void Barrage005() = 0;
virtual void Barrage006() = 0;
virtual void Barrage007() = 0;
virtual void Barrage008() = 0;
virtual void Barrage009() = 0;
virtual void Barrage010() = 0;
...(略)
という疑問にお答えするのがこのコード
typedef void(Barrage::*FUNC)();
の定義に対して
std::vector _funcList;
を定義
void Barrage::setFunc() {
_funcList.push_back(&Barrage::Barrage000);
_funcList.push_back(&Barrage::Barrage001);
_funcList.push_back(&Barrage::Barrage002);
_funcList.push_back(&Barrage::Barrage003);
_funcList.push_back(&Barrage::Barrage004);
_funcList.push_back(&Barrage::Barrage005);
_funcList.push_back(&Barrage::Barrage006);
_funcList.push_back(&Barrage::Barrage007);
_funcList.push_back(&Barrage::Barrage008);
_funcList.push_back(&Barrage::Barrage009);
_funcList.push_back(&Barrage::Barrage010);
}
すると継承先ではもう登録する必要はありません。
例えば雑魚のイージーだったら
Barrage* _barrage = new BarrageZakoEasy();
でインスタンスを作り、
その中で
_funcList[id]();
するだけで対象(id)のメソッドを呼び出せます。
どの弾幕であるかを示すidは館で紹介している方法でエクセルから取ってきます。