< チュートリアル

チュートリアル:シーンの結合


 多くのゲームではシーンが存在する。シーンとはゲームのある閉じた場面のことであり、例えば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;

 これで、シーンの変更が完了する。