FWAppの初期化処理は仮想関数Initで行います.
FWApp |
|
virtual void Init(int argc, char* argv[]) |
以下にInit関数のデフォルトの実装を示します.
void FWApp::Init(int argc, char* argv[]){ // create SDK CreateSdk(); // create a single scene GetSdk()->CreateScene(); // initialize window manager GRInit(argc, argv); // create main window CreateWin(); // create timer CreateTimer(); }
はじめに
CreateSdk();
でSDKを作成します. つぎに
GRInit(argc, argv);
でウィンドウマネジャが作成されます. デフォルトではGLUTを用いるウィンドウマネジャが作成されます. さらに
GetSdk()->CreateScene();
でFWSceneを1つ作成します. つづいて
CreateWin();
でメインウィンドウを作成します. 最後に
CreateTimer();
でタイマを作成します.
この基本処理に追加してなんらかの処理を行う場合は
virtual void Init(int argc = 0, char* argv[] = 0){ // select GLUI window manager SetGRAdaptee(TypeGLUI); // call base Init FWApp::Init(argc, argv); // do extra initialization here }
のように,FWApp:Initを実行してから追加の処理を行うのが良いでしょう. 一方,以下に挙げるようなカスタマイズが必要な場合はInit関数の処理全体を派生クラスに記述する必要があります.
シーン生成をカスタマイズしたい
ウィンドウの初期サイズやタイトルを変更したい
異なる種類のタイマが使いたい
この場合は,上に載せたInitのデフォルト処理をもとに必要な部分に修正を加えるのが良いでしょう.
プログラムの全体の構造は通常以下のようになります.
MyApp app; int main(int argc, char* argv[]){ app.Init(argc, argv); app.StartMainLoop(); return 0; }
ここでMyAppはユーザが定義したFWAppの派生クラスです(もちろん他の名前でも構いません). MyAppのインスタンスをグローバル変数として定義し, main関数でInit,StartMainLoopを順次実行します. StartMainLoop関数はアプリケーションのメインループを開始します.