From f900c96ce44f83ed1d26de90761daef5751e642c Mon Sep 17 00:00:00 2001 From: shangfengh <3495281661@qq.com> Date: Sat, 22 Apr 2023 18:15:34 +0800 Subject: [PATCH 1/2] refactor: :zap: Try to fix the problem about Moving --- logic/GameEngine/CollisionChecker.cs | 15 +++++---------- logic/Preparation/Utility/XY.cs | 6 +++++- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/logic/GameEngine/CollisionChecker.cs b/logic/GameEngine/CollisionChecker.cs index c147c20..179ce30 100644 --- a/logic/GameEngine/CollisionChecker.cs +++ b/logic/GameEngine/CollisionChecker.cs @@ -123,12 +123,9 @@ namespace GameEngine /// 最大可能的移动距离 public double FindMax(IMoveable obj, XY nextPos, XY moveVec) { - double maxLen = (double)uint.MaxValue; - double tmpMax = maxLen; // 暂存最大值 + double tmpMax = uint.MaxValue; // 暂存最大值 - // 先找只考虑墙的最大距离 - // double maxOnlyConsiderWall = FindMaxOnlyConsiderWall(obj, moveVec); - double maxDistance = maxLen; + double maxDistance = uint.MaxValue; foreach (var listWithLock in lists) { var lst = listWithLock.Item1; @@ -159,13 +156,13 @@ namespace GameEngine { double tmp = mod - obj.Radius - listObj.Radius; // 计算能走的最长距离,好像这么算有一点误差? - tmp = tmp / Math.Cos(Math.Atan2(orgDeltaY, orgDeltaX) - moveVec.Angle()); - if (tmp < 0 || tmp > uint.MaxValue || tmp == double.NaN) + tmp = ((int)(tmp*1000 / Math.Cos(Math.Atan2(orgDeltaY, orgDeltaX) - moveVec.Angle()))); + if (tmp < 0 || tmp > uint.MaxValue || double.IsNaN(tmp)) { tmpMax = uint.MaxValue; } else - tmpMax = tmp; + tmpMax = tmp/1000.0; } break; } @@ -207,11 +204,9 @@ namespace GameEngine } finally { - // maxLen = Math.Min(maxOnlyConsiderWall, maxDistance); //最大可能距离的最小值 listLock.ExitReadLock(); } } - // return maxLen; return maxDistance; } diff --git a/logic/Preparation/Utility/XY.cs b/logic/Preparation/Utility/XY.cs index 6749526..9b70661 100644 --- a/logic/Preparation/Utility/XY.cs +++ b/logic/Preparation/Utility/XY.cs @@ -64,7 +64,11 @@ namespace Preparation.Utility } public static double Distance(XY p1, XY p2) { - return Math.Sqrt(((long)(p1.x - p2.x) * (p1.x - p2.x)) + ((long)(p1.y - p2.y) * (p1.y - p2.y))); + long c = (((long)(p1.x - p2.x) * (p1.x - p2.x)) + ((long)(p1.y - p2.y) * (p1.y - p2.y)))*1000000; + long t = c/2+1; + while (t*t>c||(t+1)*(t+1) Date: Sat, 22 Apr 2023 18:20:59 +0800 Subject: [PATCH 2/2] style: :art: Format --- logic/GameEngine/CollisionChecker.cs | 4 ++-- logic/Preparation/Utility/XY.cs | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/logic/GameEngine/CollisionChecker.cs b/logic/GameEngine/CollisionChecker.cs index 179ce30..0d1d3ea 100644 --- a/logic/GameEngine/CollisionChecker.cs +++ b/logic/GameEngine/CollisionChecker.cs @@ -156,13 +156,13 @@ namespace GameEngine { double tmp = mod - obj.Radius - listObj.Radius; // 计算能走的最长距离,好像这么算有一点误差? - tmp = ((int)(tmp*1000 / Math.Cos(Math.Atan2(orgDeltaY, orgDeltaX) - moveVec.Angle()))); + tmp = ((int)(tmp * 1000 / Math.Cos(Math.Atan2(orgDeltaY, orgDeltaX) - moveVec.Angle()))); if (tmp < 0 || tmp > uint.MaxValue || double.IsNaN(tmp)) { tmpMax = uint.MaxValue; } else - tmpMax = tmp/1000.0; + tmpMax = tmp / 1000.0; } break; } diff --git a/logic/Preparation/Utility/XY.cs b/logic/Preparation/Utility/XY.cs index 9b70661..3798bb5 100644 --- a/logic/Preparation/Utility/XY.cs +++ b/logic/Preparation/Utility/XY.cs @@ -64,11 +64,11 @@ namespace Preparation.Utility } public static double Distance(XY p1, XY p2) { - long c = (((long)(p1.x - p2.x) * (p1.x - p2.x)) + ((long)(p1.y - p2.y) * (p1.y - p2.y)))*1000000; - long t = c/2+1; - while (t*t>c||(t+1)*(t+1) c || (t + 1) * (t + 1) < c) + t = (c / t + t) / 2; + return (double)t / 1000.0; } public double Length() {