LoginSignup
0
0

More than 1 year has passed since last update.

C++を使ってシューティングを作った話 #1

Last updated at Posted at 2023-05-16

はじめに

今回の記事は #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を回し、シーン管理クラスの更新処理を実行します。

C++ Main.cpp
int Main()
{
    SceneManager instance = SceneManager();
    
    while (true)
    {
        instance.SceneUpdate();
    }
}

この様な実装をすることで、SceneManagerにも更新処理を実装することができるようになります。

C++ SceneManager.cpp
bool SceneManager::SceneUpdate()
{
    activeScene.SceneUpdate();
}

これでシーンを実装する準備が整いました。

シーンの実装

この処理をなるべく見やすく実装するために、シーンは統一的に扱いたいです。

そのために継承を使用します。

C++ SceneBase.cpp
class SceneBase
{
    public :
        virtual void SceneUpdate();        // シーン更新用処理
        virtual SceneType GetSceneType();  // 継承先がどのクラスであるかを知るため(enum class)
}

これを基底クラスとして実装して

C++ TitleScene.h
class TitleScene : public SceneBase
{
    public :
        void SceneUpdate() override;
        SceneType GetSceneType() override;
}

こうすることで SceneBase型のポインタさえあれば
すべてのシーンを統一的な使うことが可能になりました。

ただこれではシーン移動ができないので
コンストラクタでSceneType型のポインタを取得して変更を行うことで
SceneManagerにシーン移動を伝えることができます。

C++ TitleScene.cpp
TitleScene::TitleScene(SceneType* ptr)
{
    this->ptr = ptr;
}

void TitleScene::SceneUpdate()
{
    if (/*ここでシーン変更の条件を記述*/)
    {
        ptr->/*ここで任意のシーンのタイプ*/;
    }
}

このようにすることでシーン移動をすることができるようになりました。
あとはSceneManagerにその内容を記述すればシーン遷移が実装できます。

C++ SceneManager.h
class SceneUpdate
{
    public :
        void SceneUpdate();
    private :
        SceneBase* activeScene;
        SceneType sceneType;
}
C++ SceneManager.cpp
void SceneUpdate()
{
    if (sceneType != activeScene->GetSceneType())
    {
        activeScene->~SceneBase();
        
        switch(sceneType)
        {
            // ここで各種シーンをactiveSceneに設定
        }
    }
}

#2 へつづく...

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0