From 4722ef500e6ba27469dc37ff34fff041a459b7d0 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 3 Jun 2025 21:51:18 +0200 Subject: [PATCH 1/2] feat: added. the wizzard --- resources/wizard.png | Bin 0 -> 1392 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/wizard.png diff --git a/resources/wizard.png b/resources/wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..d242bb0a39413ef5d67354dc81c140e1d3dcc582 GIT binary patch literal 1392 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#RGX(gAxH2#>FfuYSF)=YS zGqbR;u(GnUv9YnUvvY88aB^~TadB~TbMx@<@bdEV@$vEV^9u+F2nq@c2?+@c3yX+| zh>D7eiHV7ei%UpINJ>gdNl8gdOUuZ}$jZvf$;rvf%PS}-C@Lx{DJdx{E32resH&=} zsi~=}t7~XzXliO|X=!O|YwPIf=<4d~>FMd~>l+vt7#bQH85tQH8=IJzn3|fJnVFfJ zn_E~|SXx?ISy@?ITie*!*xK6K+1c6K+dDWoI668yIXO8yJG;2JxVpN!xw*N!yL)(e zczSwzd3kwzd;9qK`1<<#`T6<#`v(LB1O^5M1qB5M2Zw}&gocKOg@uKOhet$2L`FtN zMMXtNN5{m(#Ky+P#l^+P$0sBtBqk;%B_$;%C#R&Oq^72(rKP2(r)OkjWM*b&Wo2b& zXXoVPlq)=NA+d6c!d16%`d17nhWjl$Ms3m6es3mseC&R9042RaI42SJ%|k z)YjJ4)z#J4*EcjYG&VLiH8nLiH@CF3w6?akwY9akw|8`Obar-jb#--jclY%4^!E1l z_4W1l_fMEGVdBJzlO|1?JbChzDO09SojPsWwCU5Q&zLb|=FFM1X3d&Cd-j|;bLP&S zJ8#~+`Sa&5Sg>H>!i9?#En2*I@scG=mM&eoY}vBq%a^ZMv0~-Qm8({*TD^Mpnl)?I zu3fus-MaPb*KgRcVdKV)n>KCQym|AMEnBv3-MVetw(Z-u@7S?p=gytGcJ11|d-t9_ zd-m?#yKmpV{rmSHIB?+L!Gnhm9XfpY@R1`&jvhUF?AWp6$B&;lapL63lc!FdI(_=| znKNh3o;`c++`04T&tJH3;o`-Mmo8npeEIT~D_5>wy?X81wd>cf-?(w(=FOY8Zr!?l z`}UnXckbT3d+*-8`}glZc<|ui!-tO^J$n53@slS{o<4p0?Af#D&!4||@#5vnm#<#E zdj0zKn>TOXzJ2@d-Mjbi-+%b<;p4}TpFVy1{Q2{jFJHcX{rc_Ox9{J-|M>Ca=g*(N ze*OCW`}dzefBydc`|sbs|Ns9#+7MgIz`)2*666>Be}sd&uP;_GFfht{x;TbJw7#7d z&38nB!*%!ns~c?WZU;JSSvl?WlF6Q@!jr4|_k?VFyOq6X^Di9*{~t^Wo(aDU8(!XL zY`1f^@QPr#bG0Zi;`i>F2~n|YvV#w}AHLFkmV4s*FL96UxvH;D|9ZaeHJ|15>?wP{ z>$NT2qqxVDDQ_kFwcO+Sb1lCHPMFF*D=Bo0&n8m=Fq0}s^`20{M zgGB;^8^c$fUDgbYCsG4AE{X&&e+W4Do571Ig7Nvh9)?-W77F4_&l>NZzs1JsV9OmK z%I@H?K7ZnohPf(}KHJp$=`*~IJuD}ho1&Q*lYc%rmpSD8HTS@Vy!^l;j5(ezpEQh{ z{4_*L7cEsVnX}{WRp#aVt_J5SJk+hi4}5&K^?43EQ{YDZ87b31MJI!&tDnm{r-UW| DKspjz literal 0 HcmV?d00001 From 78b67d67f3e6d6e1392374b6a5e50159fef9da7d Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 3 Jun 2025 21:51:47 +0200 Subject: [PATCH 2/2] feat: implemented rendering --- src/core/renderer.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++ src/core/renderer.h | 61 +++++++++++++++++++++++ src/core/roguedefs.h | 17 +++++++ 3 files changed, 188 insertions(+) create mode 100644 src/core/renderer.cpp create mode 100644 src/core/renderer.h create mode 100644 src/core/roguedefs.h diff --git a/src/core/renderer.cpp b/src/core/renderer.cpp new file mode 100644 index 0000000..d8c800d --- /dev/null +++ b/src/core/renderer.cpp @@ -0,0 +1,110 @@ +#include "renderer.h" +#include +#include +#include +#include +#include +#include + +namespace rogue { +RenderData::~RenderData() { + SDL_DestroyRenderer(this->renderer); // also frees textures + SDL_DestroyWindow(this->window); + Render::clear_render_data(); +} + +RenderDataSetup &RenderDataSetup::with_window(char const *name, Uint32 flags) { + assert(this->window == nullptr && "Cannot initialize window twice"); + SDL_DisplayMode mode; + SDL_GetCurrentDisplayMode(0, &mode); + this->window = SDL_CreateWindow(name, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, mode.w, mode.h, flags); + return *this; +} + +RenderDataSetup &RenderDataSetup::with_renderer(Uint32 flags) { + assert(this->renderer == nullptr && "Cannot initialize renderer twice"); + assert(this->window != nullptr && "Cannot initialize renderer before window"); + this->renderer = SDL_CreateRenderer(this->window, -1, flags); + return *this; +} + +RenderDataSetup &RenderDataSetup::with_resource_path(std::filesystem::path path) { + assert(!this->resource_base_path.has_value() && "Cannot set base resource path twice"); + this->resource_base_path = path; + return *this; +} + +RenderDataSetup &RenderDataSetup::with_sprite(std::filesystem::path sprite_path) { + assert(this->renderer != nullptr && "Cannot create sprites without a renderer"); + assert(this->resource_base_path.has_value() && "Resource base path has to be set before loading sprites"); + std::filesystem::path complete_path{this->resource_base_path.value()/sprite_path}; + SDL_Log("Adding sprite: %s", complete_path.c_str()); + assert(std::filesystem::exists(complete_path) && "Sprite path has to exist"); + if(SDL_Texture *texture{IMG_LoadTexture(this->renderer, complete_path.native().c_str())}) { + this->sprites.push_back(texture); + } else { + SDL_Log("Failed to load texture %s reason: %s", complete_path.c_str(), SDL_GetError()); + } + return *this; +} + +RenderData RenderDataSetup::build() { + assert(this->window != nullptr && "Cannot build RenderData without a window"); + assert(this->renderer != nullptr && "Cannot build RenderData without a renderer"); + assert(this->sprites.size() > 0 && "Cannot build RenderData with 0 sprites"); + RenderData data; + data.window=this->window; + data.renderer=this->renderer; + data.sprites = this->sprites; + return data; +} + +Tile Render::camera_center{0u, 0u}; +RenderData* Render::data{nullptr}; +unsigned Render::camera_width{10}; +Tile Render::camera_offset{0, 0}; +int Render::tile_screen_width{2}; +int Render::half_tile_screen_width{1}; + +#define assert_render_initialized() assert(Render::data != nullptr && __func__ && " provide_render_data has to be called before any other Render functions") + +void Render::clear_render_data() { + assert_render_initialized(); + Render::data = nullptr; +} + +void Render::provide_render_data(RenderData &data) { + Render::data = &data; +} + +void Render::clear(Tile camera_center) { + assert_render_initialized(); + SDL_SetRenderDrawColor(Render::data->renderer, 0u, 0u, 0u, 255u); + SDL_RenderClear(Render::data->renderer); + + int width, height; + SDL_GetWindowSize(Render::data->window, &width, &height); + Render::tile_screen_width = int(width / camera_width); + Render::half_tile_screen_width = Render::tile_screen_width >> 1; + + Render::camera_center = camera_center; + Render::camera_offset.x = -Render::camera_center.x * Render::tile_screen_width + (width >> 1); + Render::camera_offset.y = -Render::camera_center.y * Render::tile_screen_width + (height >> 1); +} + +void Render::draw(Tile world_space_tile, Sprite sprite) { + assert_render_initialized(); + SDL_Rect const rect{ + .x = (world_space_tile.x * Render::tile_screen_width) - Render::half_tile_screen_width + Render::camera_offset.x, + .y = (world_space_tile.y * Render::tile_screen_width) - Render::half_tile_screen_width + Render::camera_offset.y, + .w = Render::tile_screen_width, + .h = Render::tile_screen_width + }; + SDL_RenderCopy(Render::data->renderer, Render::data->sprites[sprite], 0 , &rect); +} + +void Render::present() { + assert_render_initialized(); + SDL_RenderPresent(Render::data->renderer); +} +} diff --git a/src/core/renderer.h b/src/core/renderer.h new file mode 100644 index 0000000..e2e287b --- /dev/null +++ b/src/core/renderer.h @@ -0,0 +1,61 @@ +#ifndef ROGUE_RENDERER_H +#define ROGUE_RENDERER_H + +#include "roguedefs.h" +#include +#include +#include +#include +#include +#include + +namespace rogue { +// Contains all data required to render the game world +class RenderData { + friend class RenderDataSetup; + friend class Render; +public: ~RenderData(); +private: RenderData() = default; + SDL_Window *window{nullptr}; + SDL_Renderer *renderer{nullptr}; + std::vector sprites{}; +}; + +// Global interface for rendering +class Render { +private: + friend class RenderData; + static void clear_render_data(); +public: + static void provide_render_data(RenderData &data); + + static void clear(Tile camera_center); + static void draw(Tile world_space_tile, Sprite sprite); + static void present(); +private: + static Tile camera_center; + static unsigned camera_width; + static Tile camera_offset; + static int tile_screen_width; + static int half_tile_screen_width; + static RenderData *data; +}; + +// Render configuration, builder for RenderData +class RenderDataSetup { +public: + RenderDataSetup() = default; + RenderDataSetup &with_window(char const *name, Uint32 flags); + RenderDataSetup &with_renderer(Uint32 flags); + RenderDataSetup &with_resource_path(std::filesystem::path base_path); + RenderDataSetup &with_sprite(std::filesystem::path sprite_path); + RenderData build(); +private: + std::optional resource_base_path; + SDL_Window *window{nullptr}; + SDL_Renderer *renderer{nullptr}; + std::vector sprites{}; +}; +} + +#endif // !ROGUE_RENDERER_H diff --git a/src/core/roguedefs.h b/src/core/roguedefs.h new file mode 100644 index 0000000..a750958 --- /dev/null +++ b/src/core/roguedefs.h @@ -0,0 +1,17 @@ +#ifndef ROGUEDEFS_H +#define ROGUEDEFS_H + +#include "SDL2/SDL_rect.h" + +enum class Directions : unsigned short { + NORTH = 0x1, + EAST = 0x2, + SOUTH = 0x4, + WEST = 0x8, +}; + +typedef SDL_Point Tile; +typedef SDL_Point Chunk; +typedef unsigned Sprite; + +#endif // !ROGUEDEFS_H