はじめに
今回の記事は #1 エントリーポイントからシーンの構造 についてです。
#0:https://qiita.com/komugikoShimizu/items/9e9a18232d2d5bf7db6a
#2:https://qiita.com/komugikoShimizu/items/efd31f4fa683fce4e9c1
#3:https://qiita.com/komugikoShimizu/items/6f0cc002f9f7fbd30760
今回の実装について
今回はまずエントリーポイントから更新処理を繋げていくような設計を目指します。
Main()
↓
SceneManagerの更新処理
↓
Sceneの更新処理
のようにUpdateが繋がれて呼ばれるものが完成形です。
また、Sceneのインスタンスを保管するのは1つだけとし、統一的に更新処理を実装できるのも条件です。
実際の実装
まず、Mainでwhileを回し、シーン管理クラスの更新処理を実行します。
int Main()
{
SceneManager instance = SceneManager();
while (true)
{
instance.SceneUpdate();
}
}
この様な実装をすることで、SceneManagerにも更新処理を実装することができるようになります。
bool SceneManager::SceneUpdate()
{
activeScene.SceneUpdate();
}
これでシーンを実装する準備が整いました。
シーンの実装
この処理をなるべく見やすく実装するために、シーンは統一的に扱いたいです。
そのために継承を使用します。
class SceneBase
{
public :
virtual void SceneUpdate(); // シーン更新用処理
virtual SceneType GetSceneType(); // 継承先がどのクラスであるかを知るため(enum class)
}
これを基底クラスとして実装して
class TitleScene : public SceneBase
{
public :
void SceneUpdate() override;
SceneType GetSceneType() override;
}
こうすることで SceneBase型のポインタさえあれば
すべてのシーンを統一的な使うことが可能になりました。
ただこれではシーン移動ができないので
コンストラクタでSceneType型のポインタを取得して変更を行うことで
SceneManagerにシーン移動を伝えることができます。
TitleScene::TitleScene(SceneType* ptr)
{
this->ptr = ptr;
}
void TitleScene::SceneUpdate()
{
if (/*ここでシーン変更の条件を記述*/)
{
ptr->/*ここで任意のシーンのタイプ*/;
}
}
このようにすることでシーン移動をすることができるようになりました。
あとはSceneManagerにその内容を記述すればシーン遷移が実装できます。
class SceneUpdate
{
public :
void SceneUpdate();
private :
SceneBase* activeScene;
SceneType sceneType;
}
void SceneUpdate()
{
if (sceneType != activeScene->GetSceneType())
{
activeScene->~SceneBase();
switch(sceneType)
{
// ここで各種シーンをactiveSceneに設定
}
}
}
#2 へつづく...