From 1e12c7b278e0c7c689a219e9120342218d4c0837 Mon Sep 17 00:00:00 2001 From: Tomas Vybiral <tomas@vybiral.me> Date: Tue, 8 Dec 2020 22:07:12 +0100 Subject: [PATCH] added rendering --- cmake/StaticAnalyzers.cmake | 4 +-- src/game/CMakeLists.txt | 2 ++ src/game/game.cpp | 6 ++++ src/game/game.h | 3 ++ src/game/renderer/CMakeLists.txt | 13 +++++++++ src/game/renderer/abstract_renderer.cpp | 1 + src/game/renderer/abstract_renderer.h | 12 ++++++++ src/game/renderer/sdl_renderer.cpp | 37 +++++++++++++++++++++++++ src/game/renderer/sdl_renderer.h | 24 ++++++++++++++++ src/game/state/CMakeLists.txt | 2 ++ 10 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 src/game/renderer/CMakeLists.txt create mode 100644 src/game/renderer/abstract_renderer.cpp create mode 100644 src/game/renderer/abstract_renderer.h create mode 100644 src/game/renderer/sdl_renderer.cpp create mode 100644 src/game/renderer/sdl_renderer.h diff --git a/cmake/StaticAnalyzers.cmake b/cmake/StaticAnalyzers.cmake index ca136aa..4396444 100644 --- a/cmake/StaticAnalyzers.cmake +++ b/cmake/StaticAnalyzers.cmake @@ -1,5 +1,5 @@ -option(ENABLE_CPPCHECK "Enable static analysis with cppcheck" ON) -option(ENABLE_CLANG_TIDY "Enable static analysis with clang-tidy" ON) +option(ENABLE_CPPCHECK "Enable static analysis with cppcheck" OFF) +option(ENABLE_CLANG_TIDY "Enable static analysis with clang-tidy" OFF) option(ENABLE_INCLUDE_WHAT_YOU_USE "Enable static analysis with include-what-you-use" OFF) if(ENABLE_CPPCHECK) diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 05287a7..ee9fdec 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -1,5 +1,6 @@ add_subdirectory(state) add_subdirectory(input) +add_subdirectory(renderer) add_library(game game.h game.cpp) @@ -11,4 +12,5 @@ target_link_libraries(game CONAN_PKG::spdlog state input + renderer ) \ No newline at end of file diff --git a/src/game/game.cpp b/src/game/game.cpp index e55f090..476163a 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -2,16 +2,19 @@ #include "spdlog/spdlog.h" #include "input/sdl_input.h" +#include "renderer/sdl_renderer.h" #include <variant> game::game(uint32_t fps):current_state(), input_processor(nullptr), + renderer(nullptr), player_position_delta(0), player_angle_delta(0.0), delta_time(1.0 / static_cast<double>(fps)), is_running(false) { input_processor = new sdl_input(); + renderer = new sdl_renderer(); spdlog::get("game")->debug("Fps set to: {} and delta_time set to: {}", fps, delta_time); spdlog::get("game")->info("Finished game component initialization."); } @@ -20,6 +23,9 @@ game::~game() { spdlog::get("game")->debug("Deleting allocated resources"); if (!input_processor) delete input_processor; + if (!renderer) { + delete renderer; + } } void game::run_loop() { diff --git a/src/game/game.h b/src/game/game.h index b9028d6..a58fe95 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -6,6 +6,7 @@ #include "state/state.h" #include "input/abstract_input.h" +#include "renderer/abstract_renderer.h" /** * Basic game structure - behaves like controler in MVC schema. @@ -32,6 +33,8 @@ protected: state current_state; /// Current input processor abstract_input* input_processor; + /// Current game renderer + abstract_renderer* renderer; /// Player position is updated every second by this value uint32_t player_position_delta; /// Player angle is updated every second by this value diff --git a/src/game/renderer/CMakeLists.txt b/src/game/renderer/CMakeLists.txt new file mode 100644 index 0000000..827c7b5 --- /dev/null +++ b/src/game/renderer/CMakeLists.txt @@ -0,0 +1,13 @@ +add_library(renderer + abstract_renderer.h abstract_renderer.cpp + sdl_renderer.h sdl_renderer.cpp) + +target_link_libraries(input + PUBLIC + project_options + project_warnings + CONAN_PKG::spdlog + ${SDL2_LIBRARY} + ${SDL2_IMAGE_LIBRARY} + ${SDL2_TTF_LIBRARY} + state) \ No newline at end of file diff --git a/src/game/renderer/abstract_renderer.cpp b/src/game/renderer/abstract_renderer.cpp new file mode 100644 index 0000000..d377f27 --- /dev/null +++ b/src/game/renderer/abstract_renderer.cpp @@ -0,0 +1 @@ +#include "abstract_renderer.h" \ No newline at end of file diff --git a/src/game/renderer/abstract_renderer.h b/src/game/renderer/abstract_renderer.h new file mode 100644 index 0000000..94d6912 --- /dev/null +++ b/src/game/renderer/abstract_renderer.h @@ -0,0 +1,12 @@ +#ifndef ABSTRACT_RENDERER_H +#define ABSTRACT_RENDERER_H + +#include "../state/state.h" + +class abstract_renderer{ +public: + virtual ~abstract_renderer() {} + virtual void render_state(const state& current_state) = 0; +}; + +#endif//ABSTRACT_RENDERER_H \ No newline at end of file diff --git a/src/game/renderer/sdl_renderer.cpp b/src/game/renderer/sdl_renderer.cpp new file mode 100644 index 0000000..e0dec3e --- /dev/null +++ b/src/game/renderer/sdl_renderer.cpp @@ -0,0 +1,37 @@ +#include "sdl_renderer.h" + +#include <SDL2/SDL.h> + +#include <stdexcept> + +sdl_renderer::sdl_renderer() { + SDL_Init(SDL_INIT_VIDEO); + window = SDL_CreateWindow("Window NAME - Replace me", + SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, + 640, 480, 0); + if (window == nullptr) { + throw std::runtime_error(SDL_GetError()); + } + + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (renderer == nullptr) { + throw std::runtime_error(SDL_GetError()); + } + + SDL_SetRenderDrawColor(renderer, 100, 100, 100, 0); + SDL_Rect screen{0, 0, 640, 480}; + SDL_RenderFillRect(renderer, &screen); +} + +sdl_renderer::~sdl_renderer() { + if (renderer != nullptr) + SDL_DestroyRenderer(renderer); + if (window != nullptr) + SDL_DestroyWindow(window); + SDL_QuitSubSystem(SDL_INIT_VIDEO); +} + +void sdl_renderer::render_state(const state& cs) { + +} \ No newline at end of file diff --git a/src/game/renderer/sdl_renderer.h b/src/game/renderer/sdl_renderer.h new file mode 100644 index 0000000..a4df68f --- /dev/null +++ b/src/game/renderer/sdl_renderer.h @@ -0,0 +1,24 @@ +#ifndef SDL_RENDERER_H +#define SDL_RENDERER_H + +#include <SDL2/SDL.h> + +#include "abstract_renderer.h" + +/// Game renderer class. Using SDL2 to render game +class sdl_renderer: public abstract_renderer { +public: + /// Default contructor (initializes SDL, window, renderer and loads texture into memory) + sdl_renderer(); + /// Closes window and deintializes sdl video module + virtual ~sdl_renderer(); + + /// Renders passed state to created window + void render_state(const state& current_state) override; +protected: + /// SDL window struct + SDL_Window* window; + SDL_Renderer* renderer; +}; + +#endif//SDL_RENDERER_H \ No newline at end of file diff --git a/src/game/state/CMakeLists.txt b/src/game/state/CMakeLists.txt index 469a40a..38db7a0 100644 --- a/src/game/state/CMakeLists.txt +++ b/src/game/state/CMakeLists.txt @@ -2,6 +2,8 @@ add_library(state state.h state.cpp shooter.h shooter.cpp) +target_include_directories(state PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(state PRIVATE project_options -- GitLab