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