0
0
mirror of https://github.com/Nimac0/SDL_Minigame synced 2026-01-12 22:23:43 +00:00

Compare commits

..

No commits in common. "361687f09f5218d2e7f8cf1dbc2e7b81d0e722b4" and "7c50c8d1fb622cfa37ba91b42e65c5afe5512443" have entirely different histories.

14 changed files with 16 additions and 165 deletions

3
.gitmodules vendored
View File

@ -17,6 +17,3 @@
path = docs/doxygen-awesome-css path = docs/doxygen-awesome-css
url = https://github.com/jothepro/doxygen-awesome-css.git url = https://github.com/jothepro/doxygen-awesome-css.git
[submodule "extern/nlohmann_json"]
path = extern/nlohmann_json
url = https://github.com/nlohmann/json.git

View File

@ -24,7 +24,6 @@ add_subdirectory(extern/SDL_image EXCLUDE_FROM_ALL)
add_subdirectory(extern/SDL_mixer EXCLUDE_FROM_ALL) add_subdirectory(extern/SDL_mixer EXCLUDE_FROM_ALL)
add_subdirectory(extern/SDL_ttf EXCLUDE_FROM_ALL) add_subdirectory(extern/SDL_ttf EXCLUDE_FROM_ALL)
add_subdirectory(extern/tmxlite/tmxlite EXCLUDE_FROM_ALL) add_subdirectory(extern/tmxlite/tmxlite EXCLUDE_FROM_ALL)
add_subdirectory(extern/nlohmann_json EXCLUDE_FROM_ALL)
file(GLOB_RECURSE SOURCES ${ENGINE_SOURCE_DIR}/src/*.cpp) file(GLOB_RECURSE SOURCES ${ENGINE_SOURCE_DIR}/src/*.cpp)
@ -37,7 +36,6 @@ target_link_libraries(${PROJECT_NAME} PUBLIC # should be private when all SDL fu
SDL3_image::SDL3_image-static SDL3_image::SDL3_image-static
SDL3_mixer::SDL3_mixer-static SDL3_mixer::SDL3_mixer-static
SDL3_ttf::SDL3_ttf-static SDL3_ttf::SDL3_ttf-static
nlohmann_json::nlohmann_json
tmxlite tmxlite
) )

View File

@ -1,7 +0,0 @@
{
"fullscreen": false,
"title": "VGG (Very Good Game)",
"screen_height": 600,
"screen_width": 800,
"icon": "./engine/internalAssets/iconImage.bmp"
}

@ -1 +0,0 @@
Subproject commit a006a7a48bb30a247f0344b788c62c2806edd90b

View File

@ -1,62 +0,0 @@
#pragma once
#include <nlohmann/json.hpp>
using json = nlohmann::json;
/*!
* \class ConfigLoader
* \brief Enables configuration of specific engine variables via a custom JSON file.
*
* The Config loader is responsible to handling customization for engine parameters like the
* window icon, window title, ... through json files.
*
* It includes a standard config file and the option to add a custom one by overwriting the setConfigFilePath()
* function within the implementation of the \ref Game class. Those files get merged, with a priorization on
* the parameters set within the custom config file.
*
*
* The currently available config parameters with their default values are:
* \include ../config.json
*
*/
class ConfigLoader {
public:
ConfigLoader();
~ConfigLoader();
/*!
* \brief Creates the final config for the engine
*
* Loads the default config and then creates the final config by either merging
* (if the custom config has been set) or by implementing the standard config (if no custom
* config was set).
*
* \private
*/
void init();
/*!
* \brief Sets the customConfigPath variable
*
* \param path optional variable that should include the path to the custom config JSON file
*
* \private
*/
void setCustomConfig(const std::optional<std::string>& path);
/*!
* \brief Gets final configuration
* \return `json` variable containing the final config
* \private
*/
json getFinalConfig();
private:
std::optional<std::string> customConfigPath;
json finalConfig;
json loadConfigFromJSON(const std::string& path);
json mergeConfigs(json baseConfig, json customConfig); //<! Merges 2 config.json files, prioritising the custom to the base one
};

View File

@ -11,6 +11,9 @@ constexpr std::size_t MAX_GROUPS = 32;
constexpr std::size_t MAX_STATS = 8; constexpr std::size_t MAX_STATS = 8;
constexpr std::size_t MAX_TEAMS = 8; constexpr std::size_t MAX_TEAMS = 8;
constexpr int SCREEN_SIZE_HEIGHT = 640;
constexpr int SCREEN_SIZE_WIDTH = 800;
constexpr int FPS = 60; constexpr int FPS = 60;
constexpr int TILE_SIZE = 32; constexpr int TILE_SIZE = 32;

View File

@ -10,16 +10,6 @@ public:
virtual void init() = 0; virtual void init() = 0;
virtual void update(uint_fast16_t diffTime) = 0; virtual void update(uint_fast16_t diffTime) = 0;
/*!
* \brief Sets the path for a custom config file.
*
* Virtual function to be overwritten in the implementation to return the path of a custom config JSON file.
* \sa Layout of the config file is shown in ConfigLoader
*
* \return std::optional<std::string>
*/
virtual std::optional<std::string> setConfigFilePath() {return std::nullopt;}
GameInternal* gameInternal; //!< \deprecated GameInternal* gameInternal; //!< \deprecated
}; };

View File

@ -11,7 +11,6 @@
#include "Vector2D.h" #include "Vector2D.h"
#include "Entity.h" #include "Entity.h"
#include "RenderManager.h" #include "RenderManager.h"
#include "ConfigLoader.h"
typedef std::function<void()> gamefunction; typedef std::function<void()> gamefunction;
@ -28,7 +27,7 @@ public:
GameInternal(); GameInternal();
~GameInternal(); ~GameInternal();
SDL_AppResult init(); SDL_AppResult init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen);
void handleEvents(); void handleEvents();
void update(Uint64 frameTime); void update(Uint64 frameTime);
@ -49,8 +48,6 @@ public:
RenderManager renderManager; RenderManager renderManager;
Map* map; // game specific, might not be needed for all types of games Map* map; // game specific, might not be needed for all types of games
ConfigLoader* config;
std::vector<Entity*>& tiles; std::vector<Entity*>& tiles;
std::vector<Entity*>& players; std::vector<Entity*>& players;
std::vector<Entity*>& projectiles; std::vector<Entity*>& projectiles;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -14,7 +14,6 @@
#include "Vector2D.h" #include "Vector2D.h"
#include "PowerupComponent.h" #include "PowerupComponent.h"
#include <iostream> #include <iostream>
#include <VEGO.h>
#include "Textures.h" #include "Textures.h"
@ -77,8 +76,8 @@ Vector2D AssetManager::calculateSpawnPosition()
{ {
SDL_Rect spawnRect; SDL_Rect spawnRect;
spawnRect.h = spawnRect.w = 32; spawnRect.h = spawnRect.w = 32;
spawnRect.x = rand() % (VEGO_Game().config->getFinalConfig().at("screen_width").get<int>() - spawnRect.w); spawnRect.x = rand() % (SCREEN_SIZE_WIDTH - spawnRect.w);
spawnRect.y = rand() % (VEGO_Game().config->getFinalConfig().at("screen_height").get<int>() - spawnRect.h); spawnRect.y = rand() % (SCREEN_SIZE_HEIGHT - spawnRect.h);
conflict = false; conflict = false;
for (auto cc : this->man->getGame()->collisionHandler->getColliders({ Entity::GroupLabel::MAPTILES })) for (auto cc : this->man->getGame()->collisionHandler->getColliders({ Entity::GroupLabel::MAPTILES }))
{ {

View File

@ -10,7 +10,6 @@
#include <bitset> #include <bitset>
#include <cstdio> #include <cstdio>
#include <memory> #include <memory>
#include <VEGO.h>
IntersectionBitSet CollisionHandler::getIntersection(Entity* entityA, Entity* entityB, Vector2D posModA, Vector2D posModB) IntersectionBitSet CollisionHandler::getIntersection(Entity* entityA, Entity* entityB, Vector2D posModA, Vector2D posModB)
{ {
@ -67,20 +66,20 @@ IntersectionBitSet CollisionHandler::getIntersectionWithBounds(Entity* entity, V
// all 4 directions and both sides to allow checking for fully out of bounds // all 4 directions and both sides to allow checking for fully out of bounds
if (collider->x + posMod.x < 0 || if (collider->x + posMod.x < 0 ||
collider->x + posMod.x > VEGO_Game().config->getFinalConfig().at("screen_width")) { collider->x + posMod.x > SCREEN_SIZE_WIDTH) {
intersections.set((size_t) Direction::LEFT); intersections.set((size_t) Direction::LEFT);
} }
if (collider->x + collider->w + posMod.x < 0 || if (collider->x + collider->w + posMod.x < 0 ||
collider->x + collider->w + posMod.x > VEGO_Game().config->getFinalConfig().at("screen_width")) collider->x + collider->w + posMod.x > SCREEN_SIZE_WIDTH)
intersections.set((size_t) Direction::RIGHT); intersections.set((size_t) Direction::RIGHT);
if (collider->y + posMod.y < 0 || if (collider->y + posMod.y < 0 ||
collider->y + posMod.y > VEGO_Game().config->getFinalConfig().at("screen_height")) collider->y + posMod.y > SCREEN_SIZE_HEIGHT)
intersections.set((size_t) Direction::UP); intersections.set((size_t) Direction::UP);
if (collider->y + collider->h + posMod.y < 0 || if (collider->y + collider->h + posMod.y < 0 ||
collider->y + collider->h + posMod.y > VEGO_Game().config->getFinalConfig().at("screen_height")) collider->y + collider->h + posMod.y > SCREEN_SIZE_HEIGHT)
intersections.set((size_t) Direction::DOWN); intersections.set((size_t) Direction::DOWN);
return intersections; return intersections;

View File

@ -1,51 +0,0 @@
#include "ConfigLoader.h"
#include <fstream>
ConfigLoader::ConfigLoader() {}
ConfigLoader::~ConfigLoader() {}
void ConfigLoader::init() {
//TODO: look into adaptive paths for better handling as this requires the implemented game
// to have ./engine in the root folder (very low prio)
const json baseConfig = loadConfigFromJSON("./engine/config.json");
if (!customConfigPath.has_value()) {
finalConfig = baseConfig;
return;
}
finalConfig = mergeConfigs(baseConfig, loadConfigFromJSON(customConfigPath.value()));
}
json ConfigLoader::loadConfigFromJSON(const std::string& path) {
std::ifstream config_file(path);
json config;
if (!config_file.is_open()) {
throw std::runtime_error(std::string("Could not load config file at: " + path));
}
config_file >> config;
return config;
}
void ConfigLoader::setCustomConfig(const std::optional<std::string>& path) {
customConfigPath = path;
}
json ConfigLoader::mergeConfigs(json baseConfig, json customConfig) {
for (auto& entry : customConfig.items()) {
baseConfig[entry.key()] = entry.value();
}
return baseConfig;
}
json ConfigLoader::getFinalConfig() {
return finalConfig;
}

View File

@ -15,8 +15,6 @@
#include <VEGO.h> #include <VEGO.h>
#include "ConfigLoader.h"
GameInternal::GameInternal() : GameInternal::GameInternal() :
manager(this), manager(this),
renderManager(), renderManager(),
@ -29,23 +27,15 @@ GameInternal::GameInternal() :
GameInternal::~GameInternal() = default; GameInternal::~GameInternal() = default;
SDL_AppResult GameInternal::init() SDL_AppResult GameInternal::init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen)
{ {
config = new ConfigLoader();
this->gameInstance = GameFactory::instance().create(this);
config->setCustomConfig(this->gameInstance->setConfigFilePath());
config->init();
json finalConfig = config->getFinalConfig();
GameInternal::assets = new AssetManager(&manager); GameInternal::assets = new AssetManager(&manager);
GameInternal::textureManager = new TextureManager(&manager); GameInternal::textureManager = new TextureManager(&manager);
GameInternal::soundManager = new SoundManager(); GameInternal::soundManager = new SoundManager();
GameInternal::collisionHandler = new CollisionHandler(manager); // why does this use a referrence, but AssetManager a pointer? GameInternal::collisionHandler = new CollisionHandler(manager); // why does this use a referrence, but AssetManager a pointer?
int flags = 0; int flags = 0;
if (finalConfig.at("fullscreen")) if (fullscreen)
{ {
flags = SDL_WINDOW_FULLSCREEN; flags = SDL_WINDOW_FULLSCREEN;
} }
@ -62,9 +52,7 @@ SDL_AppResult GameInternal::init()
return SDL_APP_FAILURE; return SDL_APP_FAILURE;
} }
window = SDL_CreateWindow(finalConfig.at("title").get<std::string>().c_str(), window = SDL_CreateWindow(title, width, height, flags);
finalConfig.at("screen_width"), finalConfig.at("screen_height"), flags);
if (!window) if (!window)
{ {
std::cout << "ERROR: Window couldnt be created! " << SDL_GetError() << std::endl; std::cout << "ERROR: Window couldnt be created! " << SDL_GetError() << std::endl;
@ -74,7 +62,7 @@ SDL_AppResult GameInternal::init()
// bad // bad
SDL_Surface* icon; SDL_Surface* icon;
if((icon = SDL_LoadBMP(finalConfig.at("icon").get<std::string>().c_str()))) if((icon = SDL_LoadBMP("assets/iconImage.bmp")))
{ {
SDL_SetWindowIcon(window, icon); SDL_SetWindowIcon(window, icon);
} }
@ -107,6 +95,7 @@ SDL_AppResult GameInternal::init()
// loading music // loading music
// assets->addMusic("background_music", "assets/sound/background_music.mp3"); // assets->addMusic("background_music", "assets/sound/background_music.mp3");
this->gameInstance = GameFactory::instance().create(this);
this->gameInstance->init(); this->gameInstance->init();
return SDL_APP_CONTINUE; return SDL_APP_CONTINUE;

View File

@ -19,7 +19,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) {
*appstate = vego::game = new GameInternal(); *appstate = vego::game = new GameInternal();
return vego::game->init(); return vego::game->init("No_Name_Chicken_Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT, false);
} }
SDL_AppResult SDL_AppIterate(void *appstate) { SDL_AppResult SDL_AppIterate(void *appstate) {