#pragma once
#include "Include.h"

class GameManager
{
private:
    GameManager() = default;
    GameManager(const GameManager&) = delete;
    GameManager& operator = (const GameManager&) = delete;

    static GameManager* m_pInstance;

public:
    ~GameManager() = default;

public:
    static GameManager& GetInstance()
    {
        static GameManager Instance;
        return Instance;
    }

// --- >밑에는 예전 스타일 정의부 <----
    //static GameManager* GetInstance()
    //{
    //    if (m_pInstance == nullptr)
    //        m_pInstance = new GameManager();
    //
    //    return m_pInstance;
    //}

    //static void DestroyInstance()
    //{
    //    delete m_pInstance;
    //    m_pInstance = nullptr;
    //}

public:
    void GameStart();
};
#include "GameManager.h"
#include "BattleManager.h"
#include "MonsterFactory.h"
#include "Player.h"
#include "Monster.h"
#include "BattleLogger.h"

GameManager* GameManager::m_pInstance = nullptr;

void GameManager::GameStart()
{
    system("cls");
    cout << "게임이 시작되었다." << endl;

    BattleManager BattleManagerClass;
    BattleLogger Logger;

    //BattleManagerClass.Get_Subject().Add_Observer(&Logger);
    BattleManagerClass.Get_Subject()->Add_Observer(&Logger);

    unique_ptr<Player> pPlayer = make_unique<Player>();
    BattleManagerClass.Set_Player(move(pPlayer));

    shared_ptr<Monster> pMonster1 = MonsterFactory::CreateMonster(MONSTERTYPE::Slime);
    shared_ptr<Monster> pMonster2 = MonsterFactory::CreateMonster(MONSTERTYPE::Orc);
    shared_ptr<Monster> pMonster3 = MonsterFactory::CreateMonster(MONSTERTYPE::Dragon);

    BattleManagerClass.Add_Unit(pMonster1);
    BattleManagerClass.Add_Unit(pMonster2);
    BattleManagerClass.Add_Unit(pMonster3);

    BattleManagerClass.Print_All_Status();

    BattleManagerClass.Run_Battle();
}

→ GameManager 가 플레이어 객체를 소유하고 게임 전반에서 참조되는 핵심 상태로 유지한다.

#pragma once
#include "Include.h"
#include "Player.h"

class GameManager
{
private:
    GameManager() = default;
    GameManager(const GameManager&) = delete;
    GameManager& operator = (const GameManager&) = delete;

    static GameManager* m_pInstance;

public:
    ~GameManager() = default;

public:
    static GameManager& GetInstance()
    {
        static GameManager Instance;
        return Instance;
    }

    Player* Get_Player() { return m_pPlayer.get(); }

public:
    void GameStart();

    unique_ptr<Player> m_pPlayer;
};
#include "GameManager.h"
#include "BattleManager.h"
#include "MonsterFactory.h"
#include "Monster.h"
#include "BattleLogger.h"

GameManager* GameManager::m_pInstance = nullptr;

void GameManager::GameStart()
{
    srand((unsigned)time(nullptr));

    system("cls");
    cout << "게임이 시작되었다." << endl;

    m_pPlayer = make_unique<Player>();

    BattleManager BattleManagerClass;
    BattleLogger Logger;

    BattleManagerClass.Get_Subject()->Add_Observer(&Logger);
    BattleManagerClass.Set_Player(m_pPlayer.get());

    shared_ptr<Monster> pMonster1 = MonsterFactory::CreateMonster(MONSTERTYPE::Slime);
    shared_ptr<Monster> pMonster2 = MonsterFactory::CreateMonster(MONSTERTYPE::Orc);
    shared_ptr<Monster> pMonster3 = MonsterFactory::CreateMonster(MONSTERTYPE::Dragon);

    BattleManagerClass.Add_Unit(pMonster1);
    BattleManagerClass.Add_Unit(pMonster2);
    BattleManagerClass.Add_Unit(pMonster3);

    BattleManagerClass.Print_All_Status();

    BattleManagerClass.Run_Battle();
}