#ifndef RENDERER_H_6A58EC30 #define RENDERER_H_6A58EC30 #include #include #include #include #include #include #include #include #include #include "consts.h" class Game; class sdl_error : public std::logic_error { public: sdl_error() : std::logic_error(SDL_GetError()) { } }; class img_error : public std::logic_error { public: img_error() : std::logic_error(IMG_GetError()) { } }; class ttf_error : public std::logic_error { public: ttf_error() : std::logic_error(TTF_GetError()) { } }; class sdl_wrapper { public: sdl_wrapper() { if (SDL_Init(SDL_INIT_VIDEO) != 0) { sdl_error ex; SDL_Quit(); throw ex; } } ~sdl_wrapper() { SDL_Quit(); } }; class img_wrapper { public: img_wrapper() { if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) { img_error ex; IMG_Quit(); throw ex; } } ~img_wrapper() { IMG_Quit(); } }; class ttf_wrapper { public: ttf_wrapper() { if (TTF_Init() != 0) { ttf_error ex; TTF_Quit(); throw ex; } } ~ttf_wrapper() { TTF_Quit(); } }; class window_deleter { public: void operator()(SDL_Window* ptr) { SDL_DestroyWindow(ptr); } }; using window_ptr = std::unique_ptr; class renderer_deleter { public: void operator()(SDL_Renderer* ptr) { SDL_DestroyRenderer(ptr); } }; using renderer_ptr = std::unique_ptr; class surface_deleter { public: void operator()(SDL_Surface* ptr) { SDL_FreeSurface(ptr); } }; using surface_ptr = std::unique_ptr; class texture_deleter { public: void operator()(SDL_Texture* ptr) { SDL_DestroyTexture(ptr); } }; using texture_ptr = std::unique_ptr; class font_deleter { public: void operator()(TTF_Font* ptr) { TTF_CloseFont(ptr); } }; using font_ptr = std::unique_ptr; class Renderer { public: Renderer(); void renderGame( const Game& game, bool drawDark = true); void renderTitle(int num, double fade); TTF_Font* getFont() { return font_.get(); } void toggleFullscreen(); private: void loadTextureFromFile(std::string_view path, texture_ptr& texture); void loadAllTextures(); sdl_wrapper sdl_; img_wrapper img_; ttf_wrapper ttf_; window_ptr win_; renderer_ptr ren_; font_ptr font_; texture_ptr playerFade_; texture_ptr lampFade_; texture_ptr dustFade_; texture_ptr playerSheet_; texture_ptr tileset_; texture_ptr lamp_; texture_ptr readInstruction_; texture_ptr menuBg_; std::array titles_; std::array titleWidths_; std::array titleHeights_; // Text rendering struct MessageCache { texture_ptr renderedTex; std::vector charIndexToWidth; std::string line; std::string overflow; }; void renderMessageLine(MessageCache& line, const std::string& text, const Game& game); MessageCache messageLines_[2]; bool isFullscreen = false; void renderMenu(const Game& game); texture_ptr menu_; int menuWidth_ = 0; int menuHeight_ = 0; int menuSelected_ = 0; }; #endif /* end of include guard: RENDERER_H_6A58EC30 */