fwadrogic tek

主にプログラミングや開発ログなどを中心にお送りします

ゲームプログラミング:シーン遷移のテンプレ

スマートポインタ
・unique_ptrは、プログラムがunique_ptrが存在しているスコープを抜けた時に自動的にdeleteしてくれる賢いやつ。万一ゲームループ中で例外が起こってもだいじょうぶ!そして、その名の通りuniqueであるからpTmp = pState;みたいなことはできない。これによって開放されたメモリ領域の参照によるセグフォがおそらくなくなるんでしょう。
仕様
・IStateは状態のInterfaceという意味で、各シーンのクラスの基底クラス
・Applicationはシーンの状態名のenum
・DXライブラリ使ってる跡が見えます
・なぜかFpsクラスのDrawメソッドだけ頭文字Dが大文字できもちわるい
・大規模化したらswitch~caseどーなるの状態

std::unique_ptr<IState> pState(new Title);
if (pApp->init()) EXIT();

/* ゲームループ */
while (ScreenFlip() == 0 && 
       ProcessMessage() == 0 && 
       ClearDrawScreen() == 0 && 
       CheckHitKey(KEY_INPUT_ESCAPE) == 0){
  fps.Update();
  pState->update();
  pState->draw();
  fps.Draw();
  if (pState->next() != Application::NoChange){
    switch (pState->next()){
    case Application::Title:
      pState.reset(new Title);
      break;
    case Application::Stage1:
      pState.reset(new Stage1);
      break;
    }
    if (pState->init()) DxLib_End();
  }
  fps.Wait();
}