2.アプリケーションクラス


0.基本方針

今回はアプリケーションを作る際に毎回作らなければならない部分を括りだし
基底クラスで実装や枠組みを作ることで、が出来るようにしようという方向性でアプリケーションクラスについて考えてみます。

1.基底クラスの定義

0.ウィンドウズプログラミング事始 で書きましたが、ウィンドウズプログラムには、
ウィンドウの生成、メッセージループ、終了メッセージを受け取ると終了という基本的な流れがあります。
これを毎回書くのは面倒なのでこの流れを基底クラスで定義してみます。
流れの枠組み定義関数
//アプリケーションの基本の流れ定義関数
void AAppBase::Run(HINSTANCE hInst)
{
    hInst_ = hInst;
    if(Init() == false){ exitCode_ = EXIT_ERROR; return; }

    //メッセージループ
    MSG msg;
    while(1)
    {
        if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
            //終了メッセージがきたら終了フラグを立てておく
            if(msg.message == WM_QUIT)
            {
                quit_ = true;
                continue;
            }

            DispatchMessage(&msg);
        }
        else
        {
            switch(Update())
            {
            case AAppBase::UPDATE_RUN:
            break;
            case AAppBase::UPDATE_PAUSE:
                WaitMessage();
            break;
            case UPDATE_EXIT:
                goto EXIT;
            break;
            };
        }
    }
EXIT:
    if(Release() == false){ exitCode_ = EXIT_ERROR; return; }
}

//アプリケーションの各処理関数
//@memo 派生クラスで定義する

virtual bool AAppBase::Init() = 0;
virtual int AAppBase::Update() = 0;
virtual bool AAppBase::Release() = 0;
と、こんな感じになりました。
処理の流れはRun()で定義し、初期化、更新、解放といった処理の中身については仮想関数をオーバーライドする事で派生クラス側で定義できるようにしてみました。
またアプリケーションで共通して使うHINSTANCE、終了コードといった変数をメンバとして持たせました。

1.派生クラス側の定義

ということで上のような考え方で作ったアプリケーション基底クラスAAppBaseを使って派生クラス側を定義してみます。
実装アプリケーションクラス
class TestApp : public mmm::AAppBase
{
public:
    TestApp(){}
    virtual ~TestApp(){}
public:
    virtual bool Init()
    {
        //メインウィンドウ生成
        if(CreateMyWindow(&mainWnd_, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE) == false) return false;

        return true;
    }
    virtual int Update()
    {
        //終了通知が来ていたら終了
        if(IsQuit()) return UPDATE_EXIT;

        if(mainWnd_.IsActive())
            return UPDATE_RUN;
        else
            return UPDATE_PAUSE;
    }
    virtual bool Release()
    {
        return true;
    }
private:
    MainWindow mainWnd_;    //!<メインウィンドウ
};
と非常に関数ごとの役割が分かりやすいクラスになりました。

2.アプリケーションクラスを使ったWinMain()

上で作ったアプリケーションクラスを使ってWinMain()を作ってみます。
さっぱりしたWinMain()
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
    int exit = 0;
    {
        TestApp app;
        app.Run(hInst);
        exit = app.GetExitCode();
    }
    return exit;
}
とこんな感じになりました。
次回からは実際のゲーム開発と言いたいところですが、
今回までの流れで出来た画面に絵を描く為にDirectXの初期化をします。
今回のソース。
戻る。