diff --git a/editor/editor_scene.cpp b/editor/editor_scene.cpp index 0c11be8..caf6e1c 100644 --- a/editor/editor_scene.cpp +++ b/editor/editor_scene.cpp @@ -85,15 +85,7 @@ void EditorScene::FrameEnd() { } void EditorScene::Render(SDL_Surface* const screen) { - for (auto& regionIter : *pager.GetRegions()) { - for (auto& tileIter : *regionIter.GetTiles()) { - for (auto& sheetIter : sheetList) { - if (sheetIter.InRange(tileIter.tileIndex)) { - sheetIter.DrawTo(screen, tileIter.x + regionIter.GetX(), tileIter.y + regionIter.GetY(), tileIter.tileIndex); - } - } - } - } + pager.DrawTo(screen, &sheetList, 0, 0); } //------------------------- @@ -124,7 +116,7 @@ void EditorScene::MouseButtonDown(SDL_MouseButtonEvent const& button) { << endl; ; - if (++incrementer >= 180) { + if (++incrementer >= TileSheet::GetRangeEnd()) { incrementer = 0; } } diff --git a/editor/region_pager.cpp b/editor/region_pager.cpp index 2f4d52f..0f9be2f 100644 --- a/editor/region_pager.cpp +++ b/editor/region_pager.cpp @@ -74,3 +74,36 @@ void RegionPager::DeleteRegion(int x, int y) { } } } + +void RegionPager::DrawTo(SDL_Surface* const dest, std::list* const sheetList, int camX, int camY) { + /* for each region: + * for each tile within that reagon + * if you have the correct tile sheet + * draw to the screen + * else + * error + */ + + for (auto& regionIter : regionList) { + for (auto& tileIter : *regionIter.GetTiles()) { + for (auto& sheetIter : *sheetList) { + if (sheetIter.InRange(tileIter.tileIndex)) { + sheetIter.DrawTo( + dest, + tileIter.x + regionIter.GetX() + camX, + tileIter.y + regionIter.GetY() + camY, + tileIter.tileIndex + ); + //skip to the next tile + goto continueTile; + } + } + + //reaching this point without rendering means that the tile is invalid + throw(std::runtime_error("Undrawable tile encountered")); + + continueTile: ; + //continue with the next tile + } + } +} \ No newline at end of file diff --git a/editor/region_pager.hpp b/editor/region_pager.hpp index 9c3b8ad..4e49d13 100644 --- a/editor/region_pager.hpp +++ b/editor/region_pager.hpp @@ -23,11 +23,15 @@ #define REGIONPAGER_HPP_ #include "region.hpp" +#include "tile_sheet.hpp" #include class RegionPager { public: + //for simplicity and consistency + typedef void (*regionCallback_t)(Region* const); + RegionPager(); ~RegionPager(); @@ -36,8 +40,12 @@ public: Region* GetRegion(int x, int y); void DeleteRegion(int x, int y); - void SetOnDelete(void(*f)(Region* const)) { onDelete = f; } - void SetOnNew(void(*f)(Region* const)) { onNew = f; } + //call this to draw to the screen + void DrawTo(SDL_Surface* const, std::list* const, int camX, int camY); + + //callback hooks + void SetOnNew(regionCallback_t f) { onNew = f; } + void SetOnDelete(regionCallback_t f) { onDelete = f; } //accessors and mutators int SetWidth(int i) { return regionWidth = i; } @@ -50,8 +58,9 @@ public: private: std::list regionList; int regionWidth = 0, regionHeight = 0; - void (*onDelete)(Region* const) = nullptr; - void (*onNew)(Region* const) = nullptr; + + regionCallback_t onNew = nullptr; + regionCallback_t onDelete = nullptr; }; #endif