< チュートリアル
チュートリアル:シーンの結合
多くのゲームではシーンが存在する。シーンとはゲームのある閉じた場面のことであり、例えばRPGならば町の中とフィールドは別のシーンとして定義されることが多い。サンプルではまずオリジナルのゲームを定義するIMyGameインターフェイスを独自の生成関数であるMyGame::CreateGameInstance関数より取得する。
IMyGame *pMyGame;
HRESULT hr;
hr = MyGame::CreateGameInstance( CLSID_MYGAME, (void**)&pMyGame );
if( FAILED( hr ) ){
return E_FAIL;
}
次に、IMyGame::QueryInterface関数によりゲームで使われるシーンインターフェイスを取得する。ここではITownSceneインターフェイスとIFieldSceneインターフェイスが公開されているとする。
ITownScene *pTownScene;
IFieldScene *pFieldScene;
// 町のインターフェイス取得
hr = pMyGame->QueryInterface( IID_TownScene, (void**)&pTownScene );
if( FAILED( hr ) ){
return E_FAIL;
}
// フィールドのインターフェイス取得
hr = pMyGame->QueryIntefface( IID_FieldScene, (void**)&pFieldScene );
if( FAILED( hr ) ){
return E_FAIL;
}
双方のシーンインターフェイスを取得後、IScene::Connect関数によりシーンを結合する。シーンの結合は単方向単位で行う。すなわち、町→フィールドとフィールド→町という2回の結合を必要とする。
pTownScene->Connect( 0, pFieldScene ); // Town -> Field
pFieldScene->Connect( 0, pTownScene ); // Field -> Town
シーン管理クラスにおいて、各シーンはIScene抽象インターフェイスによって保持される。
IScene *pCurScene; // 現在のシーンを保持
pCurScene = pTownScene; // 町のシーンを保持
町からフィールドに出る場合、シーン管理クラスにおいて町シーンインターフェイスよりフィールドのインターフェイスを取得する。
IScene *pNextScene;
pCurScene->GetNextScene( 0, pNextScene );
pCurScene = pNextScene;
これで、シーンの変更が完了する。