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の初期化をします。