diff --git a/TdGame/TdGame.vcxproj b/TdGame/TdGame.vcxproj index 3b2d812..fb85356 100644 --- a/TdGame/TdGame.vcxproj +++ b/TdGame/TdGame.vcxproj @@ -137,6 +137,7 @@ + diff --git a/TdGame/TdGame.vcxproj.filters b/TdGame/TdGame.vcxproj.filters index 99fe9c8..4349838 100644 --- a/TdGame/TdGame.vcxproj.filters +++ b/TdGame/TdGame.vcxproj.filters @@ -35,5 +35,8 @@ 头文件 + + 头文件 + \ No newline at end of file diff --git a/TdGame/map.h b/TdGame/map.h index b30fe64..8160c8f 100644 --- a/TdGame/map.h +++ b/TdGame/map.h @@ -3,14 +3,19 @@ #define _MAP_H_ #include "tile.h" +#include "route.h" #include #include #include #include +#include //¹þÏ£±í£¬ÎÞÐò¹ØÁªÈÝÆ÷ class Map { +public: + typedef std::unordered_map SpawnerRoutePool; + public: Map() = default; ~Map() = default; @@ -54,9 +59,13 @@ public: tile_map = tile_map_temp; + generate_map_cache(); + return true; } + + size_t get_width() const //const²»»á¶ÔÀàÄÚ½øÐÐÐÞ¸Ä { if (tile_map.empty()) @@ -72,7 +81,8 @@ public: private: TileMap tile_map; - SDL_Point idx_home = { 0 }; + SDL_Point idx_home = { 0 };//·¿Îݵã + SpawnerRoutePool spawner_route_pool;//¹þÏ£±í¹¹½¨µÄ·¾¶³Ø private: @@ -118,7 +128,7 @@ private: } - //Éú³ÉµØͼ»º´æ + //Éú³ÉµØͼ»º´æ£¬¸½´øÉú³É·¾¶ void generate_map_cache() { for (int y = 0; y < get_height(); y++) @@ -126,14 +136,18 @@ private: for (int x = 0; x < get_width(); x++) { const Tile& tile = tile_map[y][x]; - if (tile.special_flag < 0) + if (tile.special_flag < 0)//ÆÕͨµ¥Ôª¸ñÊÇ-1 continue; - if (tile.special_flag == 0) + if (tile.special_flag == 0)//´ú±íÊÇ·¿ÎÝ£¬ÆäÓà1234ÊÇË¢¹Öµã { idx_home.x == x; idx_home.y == y; } + else + { + spawner_route_pool[tile.special_flag] = Route(tile_map, { x, y }); + } } } } diff --git a/TdGame/route.h b/TdGame/route.h new file mode 100644 index 0000000..e5da78d --- /dev/null +++ b/TdGame/route.h @@ -0,0 +1,86 @@ +#pragma once +#ifndef _ROUTE_H_ +#define _ROUTE_H_ + +#include "tile.h" + +#include +#include + +class Route +{ +public: + typedef std::vector Idxlist; + +public: + Route() = default; + + //Óвι¹Ô캯Êý + Route(const TileMap& map,SDL_Point& idx_origin) + { + size_t width_map = map[0].size(); + size_t height_map = map.size(); + SDL_Point idx_next = idx_origin; + + while (true) + { + if (idx_next.x >= width_map || idx_next.y >= height_map) + break; + + if (check_duplicate_idx(idx_next)) + break; + else + idx_list.push_back(idx_next); + + bool is_next_dir_exist = true; + const Tile& tile = map[idx_next.y][idx_next.x]; + + if (tile.special_flag == 0) + break; + switch (tile.direction) + { + case Tile::Direction::Up: + idx_next.y--; + break; + case Tile::Direction::Down: + idx_next.y++; + break; + case Tile::Direction::Left: + idx_next.x--; + break; + case Tile::Direction::Right: + idx_next.x++; + break; + default: + is_next_dir_exist = false; + break; + } + + if (!is_next_dir_exist) + break; + } + } + + ~Route() = default; + + const Idxlist& get_idx_list() const + { + return idx_list; + } + +private: + Idxlist idx_list; + +private: + bool check_duplicate_idx(const SDL_Point& target_idx) + { + for (const SDL_Point& idx : idx_list) + { + if (idx.x == target_idx.x && idx.y == target_idx.y) + return true; + } + + return false; + } +}; +#endif \ No newline at end of file