TIL: C++ TextRPG 팀플 37일차

박춘팔·4일 전

언리얼 TIL

목록 보기
36/39

누적 학습 시간 : 382시간 34분

📅 2026-05-26

C++ TRPG 팀플

Logging Manager/Gamemode

노션 명세 상 필요한 state는 3개다.

  • CreateCharacter
  • Battle
  • Shop

위 3가지 상태 클래스에서 MapBase 클래스를 상속받고
MapBase에 있는 Render()함수를 override 해서 구현하는 방향으로 설계햇는데
팀원분들이 UI를 각 상태에서 처리하겠다고 하셔서 내가 할 일이 대폭 줄어버렸다.

그래서 LoggingManager를 실제 게임처럼 작동하도록 해보려고한다.

LoggingManager.h

#pragma once
#include <fstream>
#include <string>
#include <sstream>

enum class LogHeader { Error, Warning, Info };

class LoggingManager
{
public:
    LoggingManager();
    ~LoggingManager();
    
    bool Initialize(const std::string& logDirectory = "Logs");
    
    template<typename T>
    void Add(LogHeader headText, std::string dataLabel, const T& data)
    {
        if (!logFile.is_open())
        {
            return;
        }
    
        std::string headTextToString;
        if (headText == LogHeader::Error)
        {
            headTextToString = "Error";
        }
        if (headText == LogHeader::Warning)
        {
            headTextToString = "Warning";
        }
        if (headText == LogHeader::Info)
        {
            headTextToString = "Info";
        }
    
        std::ostringstream logDataStream;
        logDataStream << data;
        std::string lineForLogging = "[" + headTextToString+ "] " + dataLabel +  logDataStream.str();
    
        logFile << lineForLogging << std::endl;
        logFile.flush();
    };

    void ViewLog() const;
    
private:
    std::string currentLogFilePath;
    std::ofstream logFile;
    
    std::string GetTimestamp() const;
};
#include "LoggingManager.h"
#include <filesystem>

LoggingManager::LoggingManager()
{
    Initialize();
}

LoggingManager::~LoggingManager()
{
    if (logFile.is_open())
    {
        logFile.close();
    }
}

bool LoggingManager::Initialize(const std::string& logDirectory)
{
    namespace fs = std::filesystem;
    
    if (!fs::exists(logDirectory))
    {
        fs::create_directory(logDirectory);
    }
    
    std::string timestamp = GetTimestamp();
    currentLogFilePath = logDirectory + "/log" + timestamp + ".txt";
    
    logFile.open(currentLogFilePath);
    
    return logFile.is_open();
}



void LoggingManager::ViewLog() const
{
    
}

std::string LoggingManager::GetTimestamp() const
{
    auto now = std::chrono::system_clock::now();
    auto timeT = std::chrono::system_clock::to_time_t(now);

    std::tm localTime{};
#ifdef _WIN32
    localtime_s(&localTime, &timeT);
#else
    localtime_r(&timeT, &localTime);
#endif

    std::ostringstream oss;
    oss << std::put_time(&localTime, "%Y%m%d_%H%M%S");
    return oss.str();
}

언리얼의 UE_LOG에서 영감을 얻었다.
log.Add(로그 중요도, 로그 헤더 메시지, 로깅 데이터) 순으로 작성하면 TXT 파일로 output이 만들어진다.

profile
이것 저것 다해보는 삶

0개의 댓글