とりあえず落ち着け

サブカル系webエンジニア見習いの備忘録

【C++】ゲームのシーン管理について

GameFrameクラスを作ってそこでメッセージを受け取るとシーンをswitchで変更するという力技処理を書いていたのでもうちょっとスマートにするべく勉強した覚書。

ソースは大学の先輩。

 

・方針

子クラスのポインタは親クラスのポインタとして宣言された変数にも入れられる。

これを使ってstateパターンっぽく管理する

・親クラスの設計

class Base{

           public:

           //純粋仮想関数として実装

           virtual void update() = 0;

}

純粋仮想関数としたのは継承先で必ずオーバーライドするようにするため。
いわゆる抽象クラス。(インターフェースもコレに近いもと解釈してるけど合ってるかな?)
で、今回はシーンAとBを実装するとして各クラスをこうする。
  
//Baseを継承したクラスA
class A : public Base{
    void update(){
             printf("A");
     }
}
//Baseを継承したクラスB
class B : public Base{
    void update(){
            printf("B");
    }
}
 このようにupdateメソッドをオーバーライドしている。
 そしてメインの方ではシーン遷移のフラグを管理してフラグによってBase*の内容を変えるという処理をする。
int main(){
        //子クラスも入れられる
       Base* GameFrame = new A();
       //メインループ
       while(1){
               //最初はAのupdate関数が回る
              GameFrame->update();
              //フラグが立ったら
              if(ChangeFlag == 1){
                    //Aのインスタンスを消さないとメモリリーク
                   delete GameFrame;
                   //GameFrameの中身をBに入れ替える
                   GameFrame = new B();
             }
      }
}
 こんな感じでシーン変更フラグに応じて中身を切り替えていく。
この例では使わなくなったインスタンスを削除しているが、シーンのデータを保持しておきたいのであれば、予めインスタンスの配列でも用意しておけば使わなくなったシーンも取っておけると思う。(メモリの消費量は確実に増えるが...)
発展した感じだとシーン遷移をスタックに積んで管理するといった手法もあるみたい。
 
車輪の再発明的な記事ですが個人的な備忘録として書いておく。
さらに具体的な内容はコチラの方に紹介されてたので参考に。
P.S.手動インデント辛れぇ...