diff --git a/resources/images/cannon.png b/resources/images/cannon.png new file mode 100644 index 0000000000000000000000000000000000000000..5115e91a87e65716e4837264551eab1586f4ef60 Binary files /dev/null and b/resources/images/cannon.png differ diff --git a/resources/images/collision.png b/resources/images/collision.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e600ac3e0b6aeb35620167dc974f4e156eb65b Binary files /dev/null and b/resources/images/collision.png differ diff --git a/resources/images/enemy1.png b/resources/images/enemy1.png new file mode 100644 index 0000000000000000000000000000000000000000..5b42602df2fe3df79ab8260a0967a6c04d70611c Binary files /dev/null and b/resources/images/enemy1.png differ diff --git a/resources/images/enemy2.png b/resources/images/enemy2.png new file mode 100644 index 0000000000000000000000000000000000000000..979d1d6f3a2d48a2ab53fefd08d3ea395a6cc381 Binary files /dev/null and b/resources/images/enemy2.png differ diff --git a/resources/images/missile.png b/resources/images/missile.png new file mode 100644 index 0000000000000000000000000000000000000000..d9dc5c954d5f3c1b95724a878080dc5f885462a8 Binary files /dev/null and b/resources/images/missile.png differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8c88a75a5e7a52784437d9ad9a3a74fd60b82db4..68ad61a0ca98e7e1765d3aea76fd37de3394d1af 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,6 +2,8 @@ add_subdirectory(game) add_executable(shooter main.cpp) +add_custom_command(TARGET shooter PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/resources/ $<TARGET_FILE_DIR:shooter>) + target_link_libraries( shooter PRIVATE project_options diff --git a/src/game/renderer/CMakeLists.txt b/src/game/renderer/CMakeLists.txt index 827c7b5ad63c01a8f4ad1d4b3f489e0ed979aa73..1120a8653e7489f8368a930506eedb817fff617b 100644 --- a/src/game/renderer/CMakeLists.txt +++ b/src/game/renderer/CMakeLists.txt @@ -1,6 +1,7 @@ add_library(renderer abstract_renderer.h abstract_renderer.cpp - sdl_renderer.h sdl_renderer.cpp) + sdl_renderer.h sdl_renderer.cpp + sdl_resources.h sdl_resources.cpp) target_link_libraries(input PUBLIC diff --git a/src/game/renderer/abstract_renderer.h b/src/game/renderer/abstract_renderer.h index 94d69125426f8154544c81a3fca60b7661e95e70..0cbfca5249c4b250464b0ad4bff62c35e3171d6e 100644 --- a/src/game/renderer/abstract_renderer.h +++ b/src/game/renderer/abstract_renderer.h @@ -3,9 +3,12 @@ #include "../state/state.h" +/// Abstract class that represents generic renderer template that can be used by any framework. class abstract_renderer{ public: + /// Virtual destructor to prevent memory leaks virtual ~abstract_renderer() {} + /// Virtual draw method that is called by the game controller. virtual void render_state(const state& current_state) = 0; }; diff --git a/src/game/renderer/sdl_renderer.cpp b/src/game/renderer/sdl_renderer.cpp index c3251e7250847095b3987828c940d6633f8c5145..3d796f829eac7d6d716ceb0884075159bd036658 100644 --- a/src/game/renderer/sdl_renderer.cpp +++ b/src/game/renderer/sdl_renderer.cpp @@ -4,7 +4,7 @@ #include <stdexcept> -sdl_renderer::sdl_renderer() { +sdl_renderer::sdl_renderer(): window(nullptr), renderer(nullptr), resources(nullptr) { if (SDL_Init(SDL_INIT_VIDEO) != 0) { throw std::runtime_error(SDL_GetError()); } @@ -21,8 +21,10 @@ sdl_renderer::sdl_renderer() { throw std::runtime_error(SDL_GetError()); } + resources = new sdl_resources(renderer); + SDL_RenderClear(renderer); - SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255); + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_Rect screen{0, 0, 640, 480}; SDL_RenderFillRect(renderer, &screen); SDL_RenderPresent(renderer); @@ -33,6 +35,8 @@ sdl_renderer::~sdl_renderer() { SDL_DestroyRenderer(renderer); if (window != nullptr) SDL_DestroyWindow(window); + if (resources != nullptr) + delete resources; SDL_QuitSubSystem(SDL_INIT_VIDEO); } diff --git a/src/game/renderer/sdl_renderer.h b/src/game/renderer/sdl_renderer.h index a4df68fc9cc36b0c189323613983a07bb9a08892..59aaf290e12953805e3db22a8babce764d84569e 100644 --- a/src/game/renderer/sdl_renderer.h +++ b/src/game/renderer/sdl_renderer.h @@ -4,6 +4,7 @@ #include <SDL2/SDL.h> #include "abstract_renderer.h" +#include "sdl_resources.h" /// Game renderer class. Using SDL2 to render game class sdl_renderer: public abstract_renderer { @@ -16,9 +17,13 @@ public: /// Renders passed state to created window void render_state(const state& current_state) override; protected: - /// SDL window struct + /// SDL window struct pointer SDL_Window* window; + /// SDL renderer struct pointer SDL_Renderer* renderer; + + /// Collection of resources used to render. + sdl_resources* resources; }; #endif//SDL_RENDERER_H \ No newline at end of file diff --git a/src/game/renderer/sdl_resources.cpp b/src/game/renderer/sdl_resources.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3dc6145794960f598f32f5487a393e102f9091fa --- /dev/null +++ b/src/game/renderer/sdl_resources.cpp @@ -0,0 +1,33 @@ +#include "sdl_resources.h" + +#include <SDL2/SDL_image.h> + +#include <stdexcept> + +sdl_resources::sdl_resources(SDL_Renderer* renderer): renderer(renderer) { + if (! (IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG)) { + throw std::runtime_error(IMG_GetError()); + } + shooter = load_texture("images/cannon.png"); + enemy = load_texture("images/enemy1.png"); + projectile = load_texture("images/missile.png"); +} + +sdl_resources::~sdl_resources() { + IMG_Quit(); +} + +SDL_Texture* sdl_resources::load_texture(const std::string& path_to_image) { + SDL_Surface * surface = nullptr; + SDL_Texture* texture = nullptr; + surface = IMG_Load(path_to_image.c_str()); + if (surface == nullptr) { + throw std::runtime_error(IMG_GetError()); + } + texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + if (texture == nullptr) { + throw std::runtime_error(SDL_GetError()); + } + return texture; +} \ No newline at end of file diff --git a/src/game/renderer/sdl_resources.h b/src/game/renderer/sdl_resources.h new file mode 100644 index 0000000000000000000000000000000000000000..1977fe5cb22152f3527022bee9433f527ba80b06 --- /dev/null +++ b/src/game/renderer/sdl_resources.h @@ -0,0 +1,28 @@ +#ifndef SDL_RESOURCES_H +#define SDL_RESOURCES_H + +#include <SDL2/SDL.h> + +#include <string> + +/// Resource class that load all the resources for game rendering. +class sdl_resources { +public: + /// Loads resources + explicit sdl_resources(SDL_Renderer* renderer); + /// Unloads resources + ~sdl_resources(); + + /// Shooter texture + const SDL_Texture* shooter; + /// Projectile texture + const SDL_Texture* projectile; + /// Enemy texture + const SDL_Texture* enemy; +protected: + SDL_Renderer* renderer; + /// Loads texture by path defined by path + SDL_Texture* load_texture(const std::string& path_to_image); +}; + +#endif//SDL_RESOURCES_H \ No newline at end of file