From cd339962221a475692dc38eefa3a62b92ac98410 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Fri, 5 Jun 2020 19:55:00 +0300 Subject: [PATCH] External Configuration File Added a Configuration file to be able to change values --- .gitignore | 3 ++ .vscode/settings.json | 6 +++- GameConfiguration.hpp | 70 ++++++++++++++++++++++++++++++++++++++++--- SynEngine.hpp | 4 ++- main.cpp | 2 +- 5 files changed, 78 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 259148f..16f0b68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Game Configurations +Configurations + # Prerequisites *.d diff --git a/.vscode/settings.json b/.vscode/settings.json index 76a6193..b660c81 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -44,6 +44,10 @@ "sstream": "cpp", "stdexcept": "cpp", "streambuf": "cpp", - "typeinfo": "cpp" + "typeinfo": "cpp", + "filesystem": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "ratio": "cpp" } } \ No newline at end of file diff --git a/GameConfiguration.hpp b/GameConfiguration.hpp index 61db75f..da6e884 100644 --- a/GameConfiguration.hpp +++ b/GameConfiguration.hpp @@ -14,7 +14,11 @@ class GameConfiguration float audioVolume; void LoadDefaultValues(); + void LoadValuesFromFile(std::string); + void WriteValuesToFile(std::string); + std::istringstream GetNextNonCommentLine(std::istream &); bool LoadSpriteSheet(std::string); + bool IsFileExists(std::string); public: GameConfiguration(); GameConfiguration(sf::Vector2i, std::string = std::string()); @@ -32,15 +36,75 @@ GameConfiguration::GameConfiguration() GameConfiguration::GameConfiguration(sf::Vector2i windowDimensions, std::string configurationPath) { if(!configurationPath.empty()) - std::cout << "External Configurations Are Not Implemented Yet!\n"; - // else + if(IsFileExists(configurationPath)) + LoadValuesFromFile(configurationPath); + else + { + LoadDefaultValues(); + WriteValuesToFile(configurationPath); + } + else LoadDefaultValues(); + spriteSheetRect = sf::IntRect(sf::Vector2i(0, 0), spriteSheetCellSize); spriteSizeMultiplier = (float)windowDimensions.x / (float)referenceWindowDimensions.x * canvasSizeMultiplierRatio.x + (float)windowDimensions.y / (float)referenceWindowDimensions.y * canvasSizeMultiplierRatio.y; } +bool GameConfiguration::IsFileExists(std::string path) +{ + std::fstream file(path); + return file.good(); +} + +void GameConfiguration::LoadValuesFromFile(std::string path) +{ + std::ifstream confFile(path); + std::istream &stream = confFile; + char coma; // this is stupid there has to be a better way + + GetNextNonCommentLine(stream) >> referenceWindowDimensions.x >> coma >> referenceWindowDimensions.y; + GetNextNonCommentLine(stream) >> canvasSizeMultiplierRatio.x >> coma >> canvasSizeMultiplierRatio.y; + LoadSpriteSheet(GetNextNonCommentLine(stream).str()); + GetNextNonCommentLine(stream) >> spriteSheetCellSize.x >> coma >> spriteSheetCellSize.y; + GetNextNonCommentLine(stream) >> audioVolume; + + confFile.close(); +} + +std::istringstream GameConfiguration::GetNextNonCommentLine(std::istream &stream) +{ + std::string line; + while (std::getline(stream, line) && !stream.eof()) + switch (line[0]) + { + case '#': case '\n': case ' ': case NULL: break; + default: + return std::istringstream(line); + } + + return std::istringstream(); +} + +void GameConfiguration::WriteValuesToFile(std::string path) +{ + std::ofstream confFile(path); + + confFile << "# Reference Window Dimensions (x, y)\n"; + confFile << referenceWindowDimensions.x << ", " << referenceWindowDimensions.y << "\n\n"; + confFile << "# Canvas Size Multiplier Ratio (x, y)\n"; + confFile << canvasSizeMultiplierRatio.x << ", " << canvasSizeMultiplierRatio.y << "\n\n"; + confFile << "# Sprite Sheet Path\n"; + confFile << spriteSheetPath << "\n\n"; + confFile << "# Sprite Sheet Cell Size (x, y)\n"; + confFile << spriteSheetCellSize.x << ", " << spriteSheetCellSize.y << "\n\n"; + confFile << "# Audio Volume\n"; + confFile << audioVolume << "\n"; + + confFile.close(); +} + void GameConfiguration::LoadDefaultValues() { // !! Placeholder values! Change after real sprites are added! !! @@ -51,7 +115,6 @@ void GameConfiguration::LoadDefaultValues() LoadSpriteSheet("Data\\SpriteSheet.png"); // !! Placeholder values! Change after real sprites are added! !! spriteSheetCellSize = sf::Vector2i(50, 50); - spriteSheetRect = sf::IntRect(sf::Vector2i(0, 0), spriteSheetCellSize); audioVolume = 1.0; } @@ -76,7 +139,6 @@ sf::Sprite GameConfiguration::GetSprite(unsigned int index, sf::Vector2f positio sprite.setPosition(position * spriteSizeMultiplier); sprite.setRotation(rotation); sprite.setScale(spriteSizeMultiplier, spriteSizeMultiplier); - std::cout << spriteSizeMultiplier << "\n"; return sprite; } diff --git a/SynEngine.hpp b/SynEngine.hpp index bc6d025..84e8f6f 100644 --- a/SynEngine.hpp +++ b/SynEngine.hpp @@ -1,7 +1,9 @@ #ifndef SynEngine #define SynEngine #include + #include + #include #include - #include "GameWindow.hpp" #include "GameConfiguration.hpp" + #include "GameWindow.hpp" #endif diff --git a/main.cpp b/main.cpp index afedd78..3f71bae 100644 --- a/main.cpp +++ b/main.cpp @@ -2,7 +2,7 @@ int main(int argc, char const *argv[]) { - GameConfiguration config = GameConfiguration(sf::Vector2i(800, 600), "Alo"); + GameConfiguration config = GameConfiguration(sf::Vector2i(800, 600), "Configurations"); sf::RenderWindow render(sf::VideoMode(800, 600), "Test"); if (render.isOpen())