diff --git a/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs b/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs
index caa6e6f..ec14d07 100644
--- a/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs
+++ b/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs
@@ -1,7 +1,12 @@
 
+using Godot;
+
 public class DoorAreaInfo
 {
     public DoorDirection Direction;
     public float Start = 0;
     public float End = 1;
+
+    public Vector2 StartPosition;
+    public Vector2 EndPosition;
 }
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs b/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs
index 0f4b386..8a34e5a 100644
--- a/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs
+++ b/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs
@@ -17,6 +17,7 @@
 
     //选中点
     private bool _hasActivePoint = false;
+    //选中左/右点
     private byte _activePointType = 0;
     private DoorAreaInfo _activeArea = null;
 
@@ -48,72 +49,86 @@
             var mousePosition = GetLocalMousePosition();
 
             var tileSize = TileSet.TileSize;
-            if (Mathf.Abs(mousePosition.Y - mapRect.Position.Y) <= 5 && mousePosition.X >= mapRect.Position.X &&
+            if (Mathf.Abs(mousePosition.Y - mapRect.Position.Y) <= 8 && mousePosition.X >= mapRect.Position.X &&
                 mousePosition.X <= mapRect.Position.X + mapRect.Size.X) //上
             {
                 _hover = true;
                 _hoverDirection = DoorDirection.N;
-                _hoverPoint1 = new Vector2(Approach(mousePosition.X, tileSize.X) - tileSize.X * 2, mapRect.Position.Y);
+                var mouseOffset = Approach(mousePosition.X, tileSize.X);
+                _hoverPoint1 = new Vector2(mouseOffset - tileSize.X * 2, mapRect.Position.Y);
                 _hoverPoint2 = new Vector2(_hoverPoint1.X + tileSize.X * 4, _hoverPoint1.Y);
 
+                //判断是否能放下新的门
                 if (_hoverPoint1.X <= mapRect.Position.X || _hoverPoint2.X >= mapRect.Position.X + mapRect.Size.X || CheckDoorCollision(mapRect))
                 {
                     _canPut = false;
+                    FindHoverPoint(mouseOffset);
                 }
                 else
                 {
                     _canPut = true;
+                    _hasActivePoint = false;
+                    _activeArea = null;
                 }
             }
-            else if (Mathf.Abs(mousePosition.X - mapRect.Position.X) <= 5 && mousePosition.Y >= mapRect.Position.Y &&
+            else if (Mathf.Abs(mousePosition.X - mapRect.Position.X) <= 8 && mousePosition.Y >= mapRect.Position.Y &&
                      mousePosition.Y <= mapRect.Position.Y + mapRect.Size.Y) //左
             {
                 _hover = true;
                 _hoverDirection = DoorDirection.W;
-                _hoverPoint1 = new Vector2(mapRect.Position.X, Approach(mousePosition.Y, tileSize.Y) - tileSize.Y * 2);
+                var mouseOffset = Approach(mousePosition.Y, tileSize.Y);
+                _hoverPoint1 = new Vector2(mapRect.Position.X, mouseOffset - tileSize.Y * 2);
                 _hoverPoint2 = new Vector2(_hoverPoint1.X, _hoverPoint1.Y + tileSize.X * 4);
 
+                //判断是否能放下新的门
                 if (_hoverPoint1.Y <= mapRect.Position.Y || _hoverPoint2.Y >= mapRect.Position.Y + mapRect.Size.Y || CheckDoorCollision(mapRect))
                 {
                     _canPut = false;
+                    FindHoverPoint(mouseOffset);
                 }
                 else
                 {
                     _canPut = true;
                 }
             }
-            else if (Mathf.Abs(mousePosition.Y - (mapRect.Position.Y + mapRect.Size.Y)) <= 5 &&
+            else if (Mathf.Abs(mousePosition.Y - (mapRect.Position.Y + mapRect.Size.Y)) <= 8 &&
                      mousePosition.X >= mapRect.Position.X &&
                      mousePosition.X <= mapRect.Position.X + mapRect.Size.X) //下
             {
                 _hover = true;
                 _hoverDirection = DoorDirection.S;
-                _hoverPoint1 = new Vector2(Approach(mousePosition.X, tileSize.X) - tileSize.X * 2,
+                var mouseOffset = Approach(mousePosition.X, tileSize.X);
+                _hoverPoint1 = new Vector2(mouseOffset - tileSize.X * 2,
                     mapRect.Position.Y + mapRect.Size.Y);
                 _hoverPoint2 = new Vector2(_hoverPoint1.X + tileSize.X * 4, _hoverPoint1.Y);
 
+                //判断是否能放下新的门
                 if (_hoverPoint1.X <= mapRect.Position.X || _hoverPoint2.X >= mapRect.Position.X + mapRect.Size.X || CheckDoorCollision(mapRect))
                 {
                     _canPut = false;
+                    FindHoverPoint(mouseOffset);
                 }
                 else
                 {
                     _canPut = true;
                 }
             }
-            else if (Mathf.Abs(mousePosition.X - (mapRect.Position.X + mapRect.Size.X)) <= 5 &&
+            else if (Mathf.Abs(mousePosition.X - (mapRect.Position.X + mapRect.Size.X)) <= 8 &&
                      mousePosition.Y >= mapRect.Position.Y &&
                      mousePosition.Y <= mapRect.Position.Y + mapRect.Size.Y) //右
             {
                 _hover = true;
                 _hoverDirection = DoorDirection.E;
+                var mouseOffset = Approach(mousePosition.Y, tileSize.Y);
                 _hoverPoint1 = new Vector2(mapRect.Position.X + mapRect.Size.X,
-                    Approach(mousePosition.Y, tileSize.Y) - tileSize.Y * 2);
+                    mouseOffset - tileSize.Y * 2);
                 _hoverPoint2 = new Vector2(_hoverPoint1.X, _hoverPoint1.Y + tileSize.X * 4);
 
+                //判断是否能放下新的门
                 if (_hoverPoint1.Y <= mapRect.Position.Y || _hoverPoint2.Y >= mapRect.Position.Y + mapRect.Size.Y || CheckDoorCollision(mapRect))
                 {
                     _canPut = false;
+                    FindHoverPoint(mouseOffset);
                 }
                 else
                 {
@@ -124,18 +139,24 @@
             {
                 _hover = false;
                 _canPut = false;
+                _hasActivePoint = false;
+                _activeArea = null;
             }
 
-            QueueRedraw();
-
+            //判断是否可以创建新的点
             if (isClick && _canPut)
             {
                 CreateDoorArea(mapRect);
             }
+            
+            QueueRedraw();
         }
         else
         {
             _hover = false;
+            _canPut = false;
+            _hasActivePoint = false;
+            _activeArea = null;
         }
     }
 
@@ -152,9 +173,9 @@
             //绘制悬停
             if (_hover)
             {
-                if (_canPut)
+                if (!_hasActivePoint) //这里判断是否悬停在拖动点上
                 {
-                    var color = new Color(0, 1, 0, 0.2f);
+                    var color = _canPut ? new Color(0, 1, 0, 0.2f) : new Color(1, 0, 0, 0.2f);
                     switch (_hoverDirection)
                     {
                         case DoorDirection.E:
@@ -193,6 +214,9 @@
             //绘制已经存在的
             foreach (var doorAreaInfo in _doorConfigs)
             {
+                var flag = _hasActivePoint && _activeArea == doorAreaInfo;
+                var color3 = (flag && _activePointType == 0) ? new Color(1, 1, 1, 0.8f) : color2;
+                var color4 = (flag && _activePointType == 1) ? new Color(1, 1, 1, 0.8f) : color2;
                 switch (doorAreaInfo.Direction)
                 {
                     case DoorDirection.E:
@@ -203,11 +227,11 @@
                                 doorAreaInfo.End - doorAreaInfo.Start), color2);
                         DrawCircle(
                             new Vector2(mapRange.Position.X + mapRange.Size.X,
-                                mapRange.Position.Y + doorAreaInfo.Start + 2), 5, color2);
+                                mapRange.Position.Y + doorAreaInfo.Start + 2), 5, color3);
                         DrawCircle(
                             new Vector2(mapRange.Position.X + mapRange.Size.X,
                                 mapRange.Position.Y + doorAreaInfo.End + 2),
-                            5, color2);
+                            5, color4);
                         break;
                     case DoorDirection.W:
                         DrawRect(
@@ -215,9 +239,9 @@
                                 new Vector2(mapRange.Position.X - 30, mapRange.Position.Y + doorAreaInfo.Start + 2),
                                 30, doorAreaInfo.End - doorAreaInfo.Start), color2);
                         DrawCircle(new Vector2(mapRange.Position.X, mapRange.Position.Y + doorAreaInfo.Start + 2), 5,
-                            color2);
+                            color3);
                         DrawCircle(new Vector2(mapRange.Position.X, mapRange.Position.Y + doorAreaInfo.End + 2), 5,
-                            color2);
+                            color4);
                         break;
                     case DoorDirection.S:
                         DrawRect(
@@ -227,11 +251,11 @@
                             color2);
                         DrawCircle(
                             new Vector2(mapRange.Position.X + doorAreaInfo.Start + 2,
-                                mapRange.Position.Y + mapRange.Size.Y), 5, color2);
+                                mapRange.Position.Y + mapRange.Size.Y), 5, color3);
                         DrawCircle(
                             new Vector2(mapRange.Position.X + doorAreaInfo.End + 2,
                                 mapRange.Position.Y + mapRange.Size.Y),
-                            5, color2);
+                            5, color4);
                         break;
                     case DoorDirection.N:
                         DrawRect(
@@ -239,9 +263,9 @@
                                 new Vector2(mapRange.Position.X + doorAreaInfo.Start + 2, mapRange.Position.Y - 30),
                                 doorAreaInfo.End - doorAreaInfo.Start, 30), color2);
                         DrawCircle(new Vector2(mapRange.Position.X + doorAreaInfo.Start + 2, mapRange.Position.Y), 5,
-                            color2);
+                            color3);
                         DrawCircle(new Vector2(mapRange.Position.X + doorAreaInfo.End + 2, mapRange.Position.Y), 5,
-                            color2);
+                            color4);
                         break;
                 }
             }
@@ -253,6 +277,8 @@
     {
         var doorAreaInfo = new DoorAreaInfo();
         doorAreaInfo.Direction = _hoverDirection;
+        doorAreaInfo.StartPosition = _hoverPoint1;
+        doorAreaInfo.EndPosition = _hoverPoint2;
         switch (_hoverDirection)
         {
             case DoorDirection.E:
@@ -270,6 +296,7 @@
         _doorConfigs.Add(doorAreaInfo);
     }
 
+    //检查是否能放下门
     private bool CheckDoorCollision(Rect2 mapRect)
     {
         foreach (var doorAreaInfo in _doorConfigs)
@@ -280,14 +307,14 @@
                 {
                     case DoorDirection.E:
                     case DoorDirection.W:
-                        if (CheckValueCollision(mapRect.Position.Y + doorAreaInfo.Start, mapRect.Position.Y + doorAreaInfo.End,  _hoverPoint1.Y, _hoverPoint2.Y))
+                        if (CheckValueCollision(doorAreaInfo.StartPosition.Y, doorAreaInfo.EndPosition.Y,  _hoverPoint1.Y, _hoverPoint2.Y))
                         {
                             return true;
                         }
                         break;
                     case DoorDirection.S:
                     case DoorDirection.N:
-                        if (CheckValueCollision(mapRect.Position.X + doorAreaInfo.Start, mapRect.Position.X + doorAreaInfo.End,  _hoverPoint1.X, _hoverPoint2.X))
+                        if (CheckValueCollision(doorAreaInfo.StartPosition.X, doorAreaInfo.EndPosition.X,  _hoverPoint1.X, _hoverPoint2.X))
                         {
                             return true;
                         }
@@ -304,6 +331,62 @@
         var size = TileSet.TileSize.X;
         return !(h2 < o1 - 3 * size || o2 + 3 * size < h1);
     }
+
+    private void FindHoverPoint(float mouseOffset)
+    {
+        //检测是否有碰撞的点
+        var flag = false;
+        foreach (var doorAreaInfo in _doorConfigs)
+        {
+            if (doorAreaInfo.Direction == _hoverDirection)
+            {
+                if (_hoverDirection == DoorDirection.N || _hoverDirection == DoorDirection.S)
+                {
+                    if (Math.Abs(doorAreaInfo.StartPosition.X - mouseOffset) < 0.0001f)
+                    {
+                        _hasActivePoint = true;
+                        _activePointType = 0;
+                        _activeArea = doorAreaInfo;
+                        flag = true;
+                        break;
+                    }
+                    else if (Math.Abs(doorAreaInfo.EndPosition.X - mouseOffset) < 0.0001f)
+                    {
+                        _hasActivePoint = true;
+                        _activePointType = 1;
+                        _activeArea = doorAreaInfo;
+                        flag = true;
+                        break;
+                    }
+                }
+                else
+                {
+                    if (Math.Abs(doorAreaInfo.StartPosition.Y - mouseOffset) < 0.0001f)
+                    {
+                        _hasActivePoint = true;
+                        _activePointType = 0;
+                        _activeArea = doorAreaInfo;
+                        flag = true;
+                        break;
+                    }
+                    else if (Math.Abs(doorAreaInfo.EndPosition.Y - mouseOffset) < 0.0001f)
+                    {
+                        _hasActivePoint = true;
+                        _activePointType = 1;
+                        _activeArea = doorAreaInfo;
+                        flag = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (!flag)
+        {
+            _hasActivePoint = false;
+            _activeArea = null;
+        }
+    }
     
     private Rect2 CalcTileRange()
     {