diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c6a0e3..e4f447e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,6 @@ include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) # Includes the contents of th conan_basic_setup() # Prepares the CMakeList.txt for Conan. # $source_files is a space-delimited list of filenames. -add_executable(rla_iipp src/main.cpp src/engine/engine.hpp src/engine/game/game.hpp src/engine/rendering/renderer.hpp src/game/visualizer.hpp src/game/visualizer.cpp src/engine/rendering/sdl/sdlrenderer.cpp src/engine/rendering/sdl/sdlrenderer.hpp src/engine/rendering/sdl/sdlrenderer.cpp src/engine/rendering/sdl/sdlrenderer.hpp src/engine/engine.cpp src/engine/engine.hpp) # Specifies the executable to build. +add_executable(rla_iipp src/main.cpp src/engine/engine.hpp src/engine/game/game.hpp src/engine/rendering/renderer.hpp src/game/visualizer.hpp src/game/visualizer.cpp src/engine/rendering/sdl/sdlrenderer.cpp src/engine/rendering/sdl/sdlrenderer.hpp src/engine/rendering/sdl/sdlrenderer.cpp src/engine/rendering/sdl/sdlrenderer.hpp src/engine/engine.cpp src/engine/engine.hpp src/engine/rendering/sdl/sdltexturemanager.cpp src/engine/rendering/sdl/sdltexturemanager.hpp) # Specifies the executable to build. target_link_libraries(rla_iipp ${CONAN_LIBS}) # Specifies what libraries to link, using Conan. file(COPY assets DESTINATION ${CMAKE_BINARY_DIR}/bin) \ No newline at end of file diff --git a/conanfile.txt b/conanfile.txt index cdca3ed..00c6c16 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -1,4 +1,7 @@ [requires] sdl/2.0.16 +sdl_ttf/2.0.15 +sdl_image/2.0.5 +lua/5.4.3 [generators] cmake \ No newline at end of file diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index abdc8bb..b164880 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -4,10 +4,8 @@ #include "engine.hpp" #include -#include #include #include -#include using namespace std::chrono_literals; void Engine::start_loop() { const auto one_second_milli = std::chrono::milliseconds(1s); @@ -55,3 +53,5 @@ Engine::render_fps(std::chrono::time_point end, return end; } +Engine::~Engine() = default; + diff --git a/src/engine/engine.hpp b/src/engine/engine.hpp index c66b12d..df87efa 100644 --- a/src/engine/engine.hpp +++ b/src/engine/engine.hpp @@ -9,14 +9,18 @@ #include "game/game.hpp" #include "rendering/renderer.hpp" static const bool SHOW_FPS = true; +static const std::string RESOURCE_DIR = "assets"; class Engine { public: Engine(std::unique_ptr game, std::unique_ptr renderer); void start_loop(); std::chrono::time_point render_fps(std::chrono::time_point end, std::chrono::time_point lastframe); + + virtual ~Engine(); + private: - std::unique_ptr game; - std::unique_ptr renderer; + std::unique_ptr game = nullptr; + std::unique_ptr renderer = nullptr; }; diff --git a/src/engine/rendering/renderer.hpp b/src/engine/rendering/renderer.hpp index 1f493d9..c10b35d 100644 --- a/src/engine/rendering/renderer.hpp +++ b/src/engine/rendering/renderer.hpp @@ -4,6 +4,7 @@ #ifndef RLA_IIPP_RENDERER_HPP #define RLA_IIPP_RENDERER_HPP +#include struct Color { public: @@ -16,7 +17,7 @@ public: }; struct RendererParams { - char* title; + std::string title; unsigned int width; unsigned int height; }; @@ -26,6 +27,7 @@ public: virtual void initialize(RendererParams params)=0; virtual void flush() = 0; virtual void draw_point(int x, int y, Color color) = 0; + virtual void draw_text(std::string text,int x, int y)=0; }; #endif //RLA_IIPP_RENDERER_HPP diff --git a/src/engine/rendering/sdl/sdlrenderer.cpp b/src/engine/rendering/sdl/sdlrenderer.cpp index 5fc4e3a..d5ec4b3 100644 --- a/src/engine/rendering/sdl/sdlrenderer.cpp +++ b/src/engine/rendering/sdl/sdlrenderer.cpp @@ -7,15 +7,25 @@ void SdlRenderer::initialize(RendererParams params) { if(SDL_Init(SDL_INIT_VIDEO) < 0) { printf("SDL vide oinit failed: %s\n", SDL_GetError()); + return; } - SDL_Window* sdl_window = SDL_CreateWindow(params.title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, params.width, params.height, SDL_WINDOW_SHOWN); + auto img_flags = IMG_INIT_PNG; + if(!(IMG_Init(img_flags) & img_flags)) { + printf("Failed to init image loading: %s", IMG_GetError()); + return; + } + SDL_Window* sdl_window = SDL_CreateWindow(params.title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, params.width, params.height, SDL_WINDOW_SHOWN); if(sdl_window == nullptr) { printf("error making window: %s\n", SDL_GetError()); + return; } else { this->window = sdl_window; SDL_Renderer* sdl_renderer = SDL_CreateRenderer(this->window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); this->renderer = sdl_renderer; + + this->texture_manager = std::make_unique(); + SDL_RenderClear(this->renderer); } } @@ -30,3 +40,19 @@ void SdlRenderer::draw_point(int x, int y, Color color) { SDL_SetRenderDrawColor(this->renderer, color.r, color.g, color.b, color.a); SDL_RenderDrawPoint(this->renderer, x, y); } + +void SdlRenderer::draw_text(std::string text, int x, int y) { + +} + +SdlRenderer::~SdlRenderer() { + // destroy components + SDL_DestroyRenderer(this->renderer); + this->renderer = nullptr; + SDL_DestroyWindow(this->window); + this->window = nullptr; + + // exit subsystems + IMG_Quit(); + SDL_Quit(); +} diff --git a/src/engine/rendering/sdl/sdlrenderer.hpp b/src/engine/rendering/sdl/sdlrenderer.hpp index 75d2ce0..409efc3 100644 --- a/src/engine/rendering/sdl/sdlrenderer.hpp +++ b/src/engine/rendering/sdl/sdlrenderer.hpp @@ -5,7 +5,10 @@ #ifndef RLA_IIPP_SDLRENDERER_HPP #define RLA_IIPP_SDLRENDERER_HPP #include "../renderer.hpp" +#include "sdltexturemanager.hpp" #include +#include +#include class SdlRenderer : public Renderer { void initialize(RendererParams params) override; @@ -13,9 +16,17 @@ class SdlRenderer : public Renderer { void flush() override; void draw_point(int x, int y, Color color) override; + +public: + ~SdlRenderer(); + +public: + void draw_text(std::string text, int x, int y) override; + private: SDL_Window* window = nullptr; SDL_Renderer* renderer = nullptr; + std::unique_ptr texture_manager = nullptr; }; diff --git a/src/engine/rendering/sdl/sdltexturemanager.cpp b/src/engine/rendering/sdl/sdltexturemanager.cpp new file mode 100644 index 0000000..0eff93b --- /dev/null +++ b/src/engine/rendering/sdl/sdltexturemanager.cpp @@ -0,0 +1,40 @@ +// +// Created by m on 12/3/21. +// + +#include "sdltexturemanager.hpp" + +SdlTextureManager::SdlTextureManager() { + this->texture_map = std::unordered_map(); +} + +SDL_Texture *SdlTextureManager::load_texture(const std::string &path, SDL_Renderer *renderer) { + std::string full_path = RESOURCE_DIR + "/" + path; + if(this->texture_map.find(full_path) == this->texture_map.end()) { + SDL_Surface* surface = load_surface(full_path); + if(surface == nullptr) { + return nullptr; + } + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); + if(texture == nullptr) { + printf("failed ot load image into texture: %s\n", IMG_GetError()); + } + this->texture_map[path] = texture; + SDL_FreeSurface(surface); + } + return this->texture_map[path]; +} + +SDL_Surface *SdlTextureManager::load_surface(const std::string& path) { + SDL_Surface* surface = IMG_Load(path.c_str()); + if(surface == nullptr) { + printf("failed ot load image: %s\n", IMG_GetError()); + } + return surface; +} + +SdlTextureManager::~SdlTextureManager() { + std::for_each(this->texture_map.begin(), this->texture_map.end(), [](const std::pair& pair) { + SDL_DestroyTexture(pair.second); + }); +} diff --git a/src/engine/rendering/sdl/sdltexturemanager.hpp b/src/engine/rendering/sdl/sdltexturemanager.hpp new file mode 100644 index 0000000..6134de2 --- /dev/null +++ b/src/engine/rendering/sdl/sdltexturemanager.hpp @@ -0,0 +1,27 @@ +// +// Created by m on 12/3/21. +// + +#ifndef RLA_IIPP_SDLTEXTUREMANAGER_HPP +#define RLA_IIPP_SDLTEXTUREMANAGER_HPP +#include +#include +#include +#include "../../engine.hpp" +#include +#include + +class SdlTextureManager { +public: + SDL_Texture *load_texture(const std::string &path, SDL_Renderer *renderer); + SdlTextureManager(); + + virtual ~SdlTextureManager(); + +private: + std::unordered_map texture_map; + static SDL_Surface* load_surface(const std::string& path); +}; + + +#endif //RLA_IIPP_SDLTEXTUREMANAGER_HPP diff --git a/src/game/visualizer.cpp b/src/game/visualizer.cpp index 71724ff..9363e7f 100644 --- a/src/game/visualizer.cpp +++ b/src/game/visualizer.cpp @@ -17,7 +17,7 @@ bool Visualizer::update() { } RendererParams Visualizer::get_renderer_params() { - return {.title = TITLE, .width = WIN_WIDTH, .height = WIN_HEIGHT}; + return {TITLE, WIN_WIDTH, WIN_HEIGHT}; } unsigned int Visualizer::get_framerate() { @@ -30,3 +30,5 @@ void Visualizer::render(Renderer *renderer) { renderer->draw_point(this->x, y, color); } } + +Visualizer::~Visualizer() = default; diff --git a/src/game/visualizer.hpp b/src/game/visualizer.hpp index 46e108a..1d907a2 100644 --- a/src/game/visualizer.hpp +++ b/src/game/visualizer.hpp @@ -16,6 +16,9 @@ public: unsigned int get_framerate() override; + ~Visualizer(); + + private: int x = 0; diff --git a/src/main.cpp b/src/main.cpp index 6c8ea02..1ba0734 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,11 +6,10 @@ #include "game/visualizer.hpp" int main() { - const char* TITLE = "Test"; std::unique_ptr renderer = std::make_unique(); std::unique_ptr game = std::make_unique(); - Engine* engine = new Engine(std::move(game), std::move(renderer)); + auto* engine = new Engine(std::move(game), std::move(renderer)); engine->start_loop(); return 0;