diff --git a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs index 65e3fdc8..518e849e 100644 --- a/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs +++ b/BetterGenshinImpact/GameTask/AutoTrackPath/TpTask.cs @@ -476,11 +476,13 @@ public class TpTask(CancellationToken ct) /// 鼠标移动后位置y public async Task MouseClickAndMove(int x1, int y1, int x2, int y2) { - GlobalMethod.MoveMouseTo(x1, y1); + // GlobalMethod.MoveMouseTo(x1, y1); + GameCaptureRegion.GameRegionMove((rect, scale) => (x1 * scale, y1 * scale)); await Delay(50, ct); GlobalMethod.LeftButtonDown(); await Delay(50, ct); - GlobalMethod.MoveMouseTo(x2, y2); + // GlobalMethod.MoveMouseTo(x2, y2); + GameCaptureRegion.GameRegionMove((rect, scale) => (x2 * scale, y2 * scale)); await Delay(50, ct); GlobalMethod.LeftButtonUp(); await Delay(50, ct); @@ -541,31 +543,9 @@ public class TpTask(CancellationToken ct) private async Task MouseMoveMap(int pixelDeltaX, int pixelDeltaY, int steps = 10) { - // 确保不影响总移动距离 - int totalX = 0; - int totalY = 0; - // 梯形缩放因子 - double scaleFactor = 0.75; - // 计算每一步的位移,从steps/2逐渐减小到0 - int[] stepX = new int[steps]; - int[] stepY = new int[steps]; - for (int i = 0; i < steps; i++) - { - double factor = ((double)(steps - Math.Max(i, steps / 2)) / (steps / 2)) / scaleFactor; - stepX[i] = (int)(pixelDeltaX * factor / steps); - stepY[i] = (int)(pixelDeltaY * factor / steps); - totalX += stepX[i]; - totalY += stepY[i]; - } - // 均匀分配多余的部分到前半段 - int remainingX = (pixelDeltaX - totalX); - int remainingY = (pixelDeltaY - totalY); - for (int i = 0; i < steps / 2 + 1; i++) - { - stepX[i] += remainingX / (steps / 2 + 1) + ((remainingX % (steps / 2 + 1) > i) ? 0 : 1); - stepY[i] += remainingY / (steps / 2 + 1) + ((remainingX % (steps / 2 + 1) > i) ? 0 : 1); - } + int[] stepX = GenerateSteps(pixelDeltaX, steps); + int[] stepY = GenerateSteps(pixelDeltaY, steps); // 随机起点以避免地图移动无效 GameCaptureRegion.GameRegionMove((rect, _) => @@ -575,13 +555,42 @@ public class TpTask(CancellationToken ct) Simulation.SendInput.Mouse.LeftButtonDown(); for (var i = 0; i < steps; i++) { - Simulation.SendInput.Mouse.MoveMouseBy(stepX[i], stepY[i]); + var i1 = i; await Delay(_tpConfig.StepIntervalMilliseconds, ct); + // Simulation.SendInput.Mouse.MoveMouseBy(stepX[i], stepY[i]); + GameCaptureRegion.GameRegionMoveBy((_, scale) => (stepX[i1] * scale, stepY[i1] * scale)); } Simulation.SendInput.Mouse.LeftButtonUp(); } + private int[] GenerateSteps(int delta, int steps) { + double[] factors = new double[steps]; + double sum = 0; + for (int i = 0; i < steps; i++) { + factors[i] = Math.Cos(i * Math.PI / (2 * steps)); + sum += factors[i]; + } + + int[] stepsArr = new int[steps]; + int remaining = delta; + + // 两阶段分配:基础值 + 余数补偿 + for (int i = 0; i < steps; i++) { + double ratio = factors[i] / sum; + stepsArr[i] = (int)(delta * ratio); // 基础值 + remaining -= stepsArr[i]; + } + + int center = steps / 2; + for (int r = 0; r < Math.Abs(remaining); r++) { + int target = (center + r) % steps; // 从中点开始螺旋分配 + stepsArr[target] += remaining > 0 ? 1 : -1; + } + + return stepsArr; + } + public Point2f GetPositionFromBigMap() { return GetBigMapCenterPoint(); diff --git a/BetterGenshinImpact/GameTask/Model/Area/DesktopRegion.cs b/BetterGenshinImpact/GameTask/Model/Area/DesktopRegion.cs index c4e34395..1c4607cc 100644 --- a/BetterGenshinImpact/GameTask/Model/Area/DesktopRegion.cs +++ b/BetterGenshinImpact/GameTask/Model/Area/DesktopRegion.cs @@ -61,6 +61,11 @@ public class DesktopRegion : Region Simulation.SendInput.Mouse.MoveMouseTo(cx * 65535 * 1d / PrimaryScreen.WorkingArea.Width, cy * 65535 * 1d / PrimaryScreen.WorkingArea.Height); } + + public static void DesktopRegionMoveBy(double dx, double dy) + { + Simulation.SendInput.Mouse.MoveMouseBy((int)dx, (int)dy); + } public GameCaptureRegion Derive(Bitmap captureBitmap, int x, int y) { diff --git a/BetterGenshinImpact/GameTask/Model/Area/GameCaptureRegion.cs b/BetterGenshinImpact/GameTask/Model/Area/GameCaptureRegion.cs index b960689b..4e497304 100644 --- a/BetterGenshinImpact/GameTask/Model/Area/GameCaptureRegion.cs +++ b/BetterGenshinImpact/GameTask/Model/Area/GameCaptureRegion.cs @@ -102,6 +102,14 @@ public class GameCaptureRegion(Bitmap bitmap, int initX, int initY, Region? owne DesktopRegion.DesktopRegionMove(captureAreaRect.X + cx, captureAreaRect.Y + cy); } + public static void GameRegionMoveBy(Func deltaFunc) + { + var captureAreaRect = TaskContext.Instance().SystemInfo.CaptureAreaRect; + var assetScale = TaskContext.Instance().SystemInfo.ScaleTo1080PRatio; + var (dx, dy) = deltaFunc(new Size(captureAreaRect.Width, captureAreaRect.Height), assetScale); + DesktopRegion.DesktopRegionMoveBy(dx, dy); + } + /// /// 静态方法,输入1080P下的坐标,方法会自动转换到当前游戏捕获区域大小下的坐标并点击 ///