#ifndef RENDERER_H_6A58EC30 #define RENDERER_H_6A58EC30 #include #include #include #include #include #include #include class Game; class Map; class Sprite; class Menu; 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 sdl_wrapper { public: sdl_wrapper() { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 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 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 Renderer { public: Renderer(); void render(Game& game); int loadImageFromFile(std::string filename); private: // Important wrappers sdl_wrapper sdl_; img_wrapper img_; window_ptr win_; renderer_ptr ren_; // Textures loaded from files std::vector textures_; std::map filenameToTexId_; // Menu rendering void renderMenu(Game& game, const Menu& menu); texture_ptr menuTex_; // Gameplay rendering void renderGame(Game& game); texture_ptr cameraTex_; // Sprite rendering void renderSprite(const Sprite& sprite); // Map rendering texture_ptr renderMapLayer(const Map& map, bool above); std::string cachedMapName_; std::string cachedTilesetName_; texture_ptr tilesetTex_; texture_ptr renLowerLayer_; texture_ptr renUpperLayer_; texture_ptr mapSwapTex_; // Text rendering struct MessageCache { texture_ptr renderedTex; std::vector charIndexToWidth; std::string line; std::string overflow; }; void renderMessageLine(MessageCache& line, const std::string& text, Game& game); MessageCache messageLines_[2]; int speakerHeaderTex_ = -1; MessageCache speakerHeaderLine_; int advMsgArrowTex_ = -1; int choiceArrowTex_ = -1; // Debug console texture_ptr debugConsoleTex_; std::string cachedDebugText_; SDL_Rect debugDestRect_; }; #endif /* end of include guard: RENDERER_H_6A58EC30 */