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下的坐标,方法会自动转换到当前游戏捕获区域大小下的坐标并点击
///