C++ TRPG 팀플
노션 명세 상 필요한 state는 3개다.
위 3가지 상태 클래스에서 MapBase 클래스를 상속받고
MapBase에 있는 Render()함수를 override 해서 구현하는 방향으로 설계햇는데
팀원분들이 UI를 각 상태에서 처리하겠다고 하셔서 내가 할 일이 대폭 줄어버렸다.
그래서 LoggingManager를 실제 게임처럼 작동하도록 해보려고한다.
#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이 만들어진다.