diff --git a/assets/sprites/map0.bmp b/assets/sprites/map0.bmp new file mode 100644 index 0000000..bc1144e Binary files /dev/null and b/assets/sprites/map0.bmp differ diff --git a/assets/sprites/map1.bmp b/assets/sprites/map1.bmp new file mode 100644 index 0000000..fff4c4b Binary files /dev/null and b/assets/sprites/map1.bmp differ diff --git a/assets/sprites/map2.bmp b/assets/sprites/map2.bmp new file mode 100644 index 0000000..85cbffe Binary files /dev/null and b/assets/sprites/map2.bmp differ diff --git a/conanfile.txt b/conanfile.txt index bdee208..e17ba29 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -3,5 +3,7 @@ sdl/2.0.16 sdl_ttf/2.0.15 sdl_image/2.0.5 fmt/8.0.1 +tomlplusplus/2.5.0 +sol2/3.2.3 [generators] cmake \ No newline at end of file diff --git a/src/engine/engine.hpp b/src/engine/engine.hpp index 840b927..8a551c3 100644 --- a/src/engine/engine.hpp +++ b/src/engine/engine.hpp @@ -25,7 +25,7 @@ public: Engine(std::unique_ptr game, std::unique_ptr renderer, std::unique_ptr input_processor); void start_loop(); - std::chrono::time_point render_fps(std::chrono::time_point end, std::chrono::time_point lastframe); + virtual ~Engine(); @@ -33,6 +33,7 @@ private: std::unique_ptr game = nullptr; std::unique_ptr renderer = nullptr; std::unique_ptr input_processor = nullptr; + std::chrono::time_point render_fps(std::chrono::time_point end, std::chrono::time_point lastframe); }; class MissingGameException : public std::exception { diff --git a/src/engine/input/sdlinputprocessor.cpp b/src/engine/input/sdlinputprocessor.cpp index 49de00c..ac44f6d 100644 --- a/src/engine/input/sdlinputprocessor.cpp +++ b/src/engine/input/sdlinputprocessor.cpp @@ -290,6 +290,5 @@ InputProcessorKeycode SdlInputProcessor::get_keycode(SDL_Keycode keycode) { if(this->keycode_map.find(keycode) == this->keycode_map.end()) { return KEY_UNKNOWN; } - printf("Detected keypress for %i\n", this->keycode_map[keycode]); return this->keycode_map[keycode]; } diff --git a/src/engine/rendering/sdl/sdlfontmanager.cpp b/src/engine/rendering/sdl/sdlfontmanager.cpp index 72a8192..e7794de 100644 --- a/src/engine/rendering/sdl/sdlfontmanager.cpp +++ b/src/engine/rendering/sdl/sdlfontmanager.cpp @@ -8,12 +8,12 @@ std::string SdlFontManager::get_key(SdlFontArgs args) { return fmt::format("{}_{}", args.size, get_resource_path(args.font_path)); } -TTF_Font *SdlFontManager::load_resource(SdlFontArgs args) { +std::shared_ptr SdlFontManager::load_resource(SdlFontArgs args) { std::string path = get_resource_path(args.font_path); TTF_Font *font = TTF_OpenFont(path.c_str(), args.size); if(font == nullptr) { printf("Could not load font: %s\n", TTF_GetError()); return nullptr; } - return font; + return std::shared_ptr(font, TTF_CloseFont); } diff --git a/src/engine/rendering/sdl/sdlfontmanager.hpp b/src/engine/rendering/sdl/sdlfontmanager.hpp index b222310..7fa886f 100644 --- a/src/engine/rendering/sdl/sdlfontmanager.hpp +++ b/src/engine/rendering/sdl/sdlfontmanager.hpp @@ -18,10 +18,10 @@ struct SdlFontArgs { SdlFontArgs(int size, std::string fontPath) : size(size), font_path(std::move(fontPath)) {} }; -class SdlFontManager : public ResourceManager { +class SdlFontManager : public ResourceManager, std::string, SdlFontArgs> { std::string get_key(SdlFontArgs args) override; - TTF_Font *load_resource(SdlFontArgs args) override; + std::shared_ptr load_resource(SdlFontArgs args) override; }; diff --git a/src/engine/rendering/sdl/sdlrenderer.cpp b/src/engine/rendering/sdl/sdlrenderer.cpp index 72fec1e..467132d 100644 --- a/src/engine/rendering/sdl/sdlrenderer.cpp +++ b/src/engine/rendering/sdl/sdlrenderer.cpp @@ -48,10 +48,9 @@ void SdlRenderer::draw_point(int x, int y, Color color) { } void SdlRenderer::draw_text(TextRenderDetails details, std::string text, int x, int y) { - TTF_Font *font = this->font_manager->fetch_resource(SdlFontArgs(details.size, details.font_path)); - SDL_Texture *texture = this->texture_manager->load_text_as_texture(text, font, details.color); + std::shared_ptr font = this->font_manager->fetch_resource(SdlFontArgs(details.size, details.font_path)); + std::shared_ptr texture = this->texture_manager->load_text_as_texture(text, font, details.color); render_texture(x, y, texture, nullptr); - SDL_DestroyTexture(texture); } SdlRenderer::~SdlRenderer() { @@ -67,30 +66,24 @@ SdlRenderer::~SdlRenderer() { SDL_Quit(); } -void SdlRenderer::render_texture(int x, int y, SDL_Texture *texture, SDL_Rect *src) { +void SdlRenderer::render_texture(int x, int y, const std::shared_ptr& texture, SDL_Rect *src) { int w, h; if(src == nullptr) { - SDL_QueryTexture(texture, nullptr, nullptr, &w, &h); + SDL_QueryTexture(texture.get(), nullptr, nullptr, &w, &h); } else { w = src->w; h = src->h; } - if(x+w >= renderer_params.width) { - x = renderer_params.width - w; - } - if(y+h >= renderer_params.height) { - y = renderer_params.height - h; - } SDL_Rect rect = {x,y,w,h}; - SDL_RenderCopy(this->renderer, texture, src, &rect); + SDL_RenderCopy(this->renderer, texture.get(), src, &rect); } void SdlRenderer::draw_sprite(Sprite sprite, int x, int y) { SpriteSheet *sprite_sheet = sprite.sprite_sheet; - SDL_Texture *texture = this->texture_manager->fetch_resource(sprite_sheet->path); + std::shared_ptr texture = this->texture_manager->fetch_resource(sprite_sheet->path); int w, h; - SDL_QueryTexture(texture, nullptr, nullptr, &w, &h); + SDL_QueryTexture(texture.get(), nullptr, nullptr, &w, &h); int l = (sprite_sheet->sprite_width * sprite.index) / w; int src_y = l*sprite_sheet->sprite_height; int src_x = (sprite_sheet->sprite_width * sprite.index) % w; diff --git a/src/engine/rendering/sdl/sdlrenderer.hpp b/src/engine/rendering/sdl/sdlrenderer.hpp index 7347b0a..fc9356f 100644 --- a/src/engine/rendering/sdl/sdlrenderer.hpp +++ b/src/engine/rendering/sdl/sdlrenderer.hpp @@ -28,7 +28,7 @@ private: std::unique_ptr texture_manager = nullptr; std::unique_ptr font_manager = nullptr; - void render_texture(int x, int y, SDL_Texture *texture, SDL_Rect *src); + void render_texture(int x, int y, const std::shared_ptr& texture, SDL_Rect *src); }; diff --git a/src/engine/rendering/sdl/sdltexturemanager.cpp b/src/engine/rendering/sdl/sdltexturemanager.cpp index 66fe717..5e10b3b 100644 --- a/src/engine/rendering/sdl/sdltexturemanager.cpp +++ b/src/engine/rendering/sdl/sdltexturemanager.cpp @@ -12,13 +12,7 @@ SDL_Surface *SdlTextureManager::load_surface(const std::string& path) { return surface; } -SdlTextureManager::~SdlTextureManager() { - std::for_each(this->resource_map.begin(), this->resource_map.end(), [](const std::pair& pair) { - SDL_DestroyTexture(pair.second); - }); -} - -SDL_Texture *SdlTextureManager::load_resource(std::string args) { +std::shared_ptr SdlTextureManager::load_resource(std::string args) { std::string full_path = get_resource_path(args); SDL_Surface* surface = load_surface(full_path); if(surface == nullptr) { @@ -26,19 +20,19 @@ SDL_Texture *SdlTextureManager::load_resource(std::string args) { } SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); - return texture; + return std::shared_ptr(texture, SDL_DestroyTexture); } std::string SdlTextureManager::get_key(std::string args) { return get_resource_path(args); } -SDL_Texture *SdlTextureManager::load_text_as_texture(const std::string& text, TTF_Font *font, Color color) { - SDL_Surface *surface = TTF_RenderText_Solid(font, text.c_str(), {color.r, color.g, color.b}); +std::shared_ptr SdlTextureManager::load_text_as_texture(const std::string& text, const std::shared_ptr& font, Color color) { + SDL_Surface *surface = TTF_RenderText_Solid(font.get(), text.c_str(), {color.r, color.g, color.b}); if(surface == nullptr) { return nullptr; } SDL_Texture *texture = SDL_CreateTextureFromSurface(this->renderer, surface); SDL_FreeSurface(surface); - return texture; + return std::shared_ptr(texture, SDL_DestroyTexture); } diff --git a/src/engine/rendering/sdl/sdltexturemanager.hpp b/src/engine/rendering/sdl/sdltexturemanager.hpp index 3e3ae50..b81a267 100644 --- a/src/engine/rendering/sdl/sdltexturemanager.hpp +++ b/src/engine/rendering/sdl/sdltexturemanager.hpp @@ -13,15 +13,14 @@ #include #include -class SdlTextureManager : public ResourceManager { +class SdlTextureManager : public ResourceManager, std::string, std::string> { protected: - SDL_Texture *load_resource(std::string args) override; + std::shared_ptr load_resource(std::string args) override; std::string get_key(std::string args) override; public: explicit SdlTextureManager(SDL_Renderer *renderer) : renderer(renderer) {} - SDL_Texture *load_text_as_texture(const std::string& text, TTF_Font *font, Color color); - ~SdlTextureManager(); + std::shared_ptr load_text_as_texture(const std::string& text, const std::shared_ptr& font, Color color); private: diff --git a/src/engine/resources/resourcemanager.hpp b/src/engine/resources/resourcemanager.hpp index f1527af..ad8928f 100644 --- a/src/engine/resources/resourcemanager.hpp +++ b/src/engine/resources/resourcemanager.hpp @@ -10,19 +10,19 @@ template class ResourceManager { public: - virtual T* fetch_resource(A args) { + virtual T fetch_resource(A args) { K key = get_key(args); if(this->resource_map.find(key) == this->resource_map.end()) { - T* resource = this->load_resource(args); + T resource = this->load_resource(args); this->resource_map[key] = resource; } return this->resource_map[key]; } protected: - std::unordered_map resource_map; + std::unordered_map resource_map; virtual K get_key(A args)=0; - virtual T* load_resource(A args)=0; + virtual T load_resource(A args)=0; std::string get_resource_path(std::string path) { return fmt::format("{}/{}", RESOURCE_DIR, path); } diff --git a/src/game/visualizer.cpp b/src/game/visualizer.cpp index 11aa249..b1315a8 100644 --- a/src/game/visualizer.cpp +++ b/src/game/visualizer.cpp @@ -4,9 +4,7 @@ #include "visualizer.hpp" bool Visualizer::update(InputResult input) { - this->x += 1; - if(this->x > WIN_WIDTH || input.keycode == KEY_ESCAPE) { - this->x = 0; + if(input.keycode == KEY_ESCAPE) { return true; } if(input.keycode == KEY_RIGHT) { @@ -25,13 +23,22 @@ unsigned int Visualizer::get_framerate() { void Visualizer::render(Renderer *renderer) { Color color = COLOR_WHITE; - SpriteSheet sheet = SpriteSheet{"sprites/character.bmp", 48, 48}; - auto sprite = Sprite{&sheet, this->sprite_index}; RendererParams window_params = get_renderer_params(); - renderer->draw_sprite(sprite, window_params.width/2, window_params.height/2); - for(int y=0;ydraw_point(this->x, y, color); + SpriteSheet tiles = SpriteSheet{"sprites/map1.bmp", 48, 48}; + auto grass = Sprite{&tiles, 0}; + int tilesx = (window_params.width / 48)+1; + int tilesy = (window_params.height / 48)+1; + for(int x=0;xdraw_sprite(grass, x*48, y*48); + } } + + + SpriteSheet characters = SpriteSheet{"sprites/character.bmp", 48, 48}; + auto character = Sprite{&characters, this->sprite_index}; + + renderer->draw_sprite(character, window_params.width / 2, window_params.height / 2); } Visualizer::~Visualizer() = default;