From 969ba7e94aba6a400a307c2fb3b3a02f2f368bd7 Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Mon, 30 Sep 2024 13:31:50 +0200 Subject: [PATCH] Make game class singleton --- CMakeLists.txt | 37 +++++++++++++++++++++++++++++++------ Game.cpp | 3 ++- Game.hpp | 12 ++++++++++-- ProtoTank.cpp | 4 ++-- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1729e35..94f321f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,9 +20,12 @@ set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation direc set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) # define project -project(ProtoTank VERSION 0.1.0 DESCRIPTION "Arcade 80s-style game with tanks" LANGUAGES C;CXX) +project(ProtoTank VERSION 0.1.0 DESCRIPTION "Arcade 80s-style game with tanks" LANGUAGES C CXX) #configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h @ONLY) +# Compilation option +option(DISABLE_CPU_OPTI "Disable CPU optimizations" OFF) + include(FindPkgConfig) include(CheckIncludeFile) include(CheckCSourceCompiles) @@ -34,13 +37,35 @@ include_directories(sfml::sfml) # define src/headers files groups include(srcs.list) +set(BUILDNAME_SUFFIX _v${PROJECT_VERSION}) +if(DISABLE_CPU_OPTI) + set(BUILDNAME_SUFFIX ${BUILDNAME_SUFFIX}_noSIMD) +endif() + # targets declarations add_executable(${PROJECT_NAME} ${MAIN_SCRS} ${UTILS_SCRS} ${MISC_SCRS} ${GAME_SCRS} ${GRAPHS_SCRS} ${SOUNDS_SCRS}) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17) -set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) -set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME}-v${PROJECT_VERSION}) +target_link_libraries(${PROJECT_NAME} sfml::sfml) +set_target_properties(${PROJECT_NAME} PROPERTIES + OUTPUT_NAME ${PROJECT_NAME}${BUILDNAME_SUFFIX} + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON +) + +# targets build options if(MSVC) # msvc does not append 'lib' - do it here to have consistent name - set_target_properties(AST PROPERTIES IMPORT_PREFIX "lib") + set_target_properties(${PROJECT_NAME} PROPERTIES IMPORT_PREFIX "lib") endif() -target_link_libraries(${PROJECT_NAME} sfml::sfml) \ No newline at end of file +if (DISABLE_CPU_OPTI) + target_compile_definitions(${PROJECT_NAME} PUBLIC DISABLE_INTRINSICS) +endif() + +# GPG signature custom command +#add_custom_command( +# OUTPUT "" +# COMMAND gpg --batch --detach-sign +# -o ${PROJECT_NAME}_${CI_SYS_TARGET}.gpg +# ${PROJECT_NAME} +# DEPENDS ${PROJECT_NAME} +# VERBATIM +#) \ No newline at end of file diff --git a/Game.cpp b/Game.cpp index 141e9e9..019ae46 100644 --- a/Game.cpp +++ b/Game.cpp @@ -18,8 +18,9 @@ using std::make_unique; std::unique_ptr mPerfsTimer = nullptr; +Game* Game::smInstance = nullptr; -Game::Game(bool dbg) : mbDbgModeEnabled(dbg) { +Game::Game(bool dbgFlag) : mbDbgModeEnabled(dbgFlag) { InitWindows(); mCockpitUI = make_unique(); diff --git a/Game.hpp b/Game.hpp index 68ceb67..49a4458 100644 --- a/Game.hpp +++ b/Game.hpp @@ -17,8 +17,13 @@ typedef enum eGameStatus { class Game final { public: - Game(bool dbg) noexcept(false); - ~Game() {} + static Game& getInstance(bool dbgFlag) { + if (smInstance == nullptr) + smInstance = new Game(dbgFlag); + + return *smInstance; + } + ~Game() = default; Game(Game&&) = default; Game& operator= (Game&&) = default; @@ -28,6 +33,9 @@ public: GAME_STATUS Tick(SysTimer& time); private: + Game(bool dbgFlag) noexcept(false); + static Game* smInstance; + void InitWindows(); void Update(); void Render(); diff --git a/ProtoTank.cpp b/ProtoTank.cpp index a5686f6..f3f46c8 100644 --- a/ProtoTank.cpp +++ b/ProtoTank.cpp @@ -14,10 +14,10 @@ int main(int argc, char** argv) { GAME_STATUS status = GAME_INIT; std::cout << "[" << mSysTimer.GetElapsedTimeS() << "] Init game instance" << std::endl; - auto arcadeGame = std::make_unique(true); + Game& arcadeGame = Game::getInstance(true); for ( ;; ) { - status = arcadeGame->Tick(mSysTimer); + status = arcadeGame.Tick(mSysTimer); if (status == GAME_QUIT) break;