From b483ec2d848d7be50d5a1fa01e106aac97d2b74a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Tue, 17 Dec 2024 01:30:45 +0800 Subject: [PATCH] play with merge event --- .../Core/Recorder/KeyMouseMacroPlayer.cs | 3 +- .../Core/Recorder/KeyMouseRecorder.cs | 55 +-------------- .../Core/Recorder/Model/KeyMouseScript.cs | 69 ++++++++++++++++++- 3 files changed, 71 insertions(+), 56 deletions(-) diff --git a/BetterGenshinImpact/Core/Recorder/KeyMouseMacroPlayer.cs b/BetterGenshinImpact/Core/Recorder/KeyMouseMacroPlayer.cs index 9a9ae9b5..c565f89a 100644 --- a/BetterGenshinImpact/Core/Recorder/KeyMouseMacroPlayer.cs +++ b/BetterGenshinImpact/Core/Recorder/KeyMouseMacroPlayer.cs @@ -30,11 +30,12 @@ public class KeyMouseMacroPlayer var script = JsonSerializer.Deserialize(macro, KeyMouseRecorder.JsonOptions) ?? throw new Exception("Failed to deserialize macro"); script.Adapt(TaskContext.Instance().SystemInfo.CaptureAreaRect, TaskContext.Instance().DpiScale); + script.Merge(); SystemControl.ActivateWindow(); if (withDelay) { - for (var i = 1; i >= 1; i--) + for (var i = 2; i >= 1; i--) { TaskControl.Logger.LogInformation("{Sec}秒后进行重放...", i); await Task.Delay(1000, ct); diff --git a/BetterGenshinImpact/Core/Recorder/KeyMouseRecorder.cs b/BetterGenshinImpact/Core/Recorder/KeyMouseRecorder.cs index cc92bc0f..c5608529 100644 --- a/BetterGenshinImpact/Core/Recorder/KeyMouseRecorder.cs +++ b/BetterGenshinImpact/Core/Recorder/KeyMouseRecorder.cs @@ -39,64 +39,11 @@ public class KeyMouseRecorder public string ToJsonMacro() { var rect = TaskContext.Instance().SystemInfo.CaptureAreaRect; - // 合并鼠标移动事件 - // var mergedMacroEvents = new List(); - // MacroEvent? currentMerge = null; - // foreach (var macroEvent in MacroEvents) - // { - // if (currentMerge == null) - // { - // currentMerge = macroEvent; - // continue; - // } - // if (currentMerge.Type != macroEvent.Type) - // { - // mergedMacroEvents.Add(currentMerge); - // currentMerge = macroEvent; - // continue; - // } - // switch (macroEvent.Type) - // { - // case MacroEventType.MouseMoveTo: - // // 控制合并时间片段长度 - // if (macroEvent.Time - currentMerge.Time > MergedEventTimeMax) - // { - // mergedMacroEvents.Add(currentMerge); - // currentMerge = macroEvent; - // break; - // } - // // 合并为最后一个事件的位置,避免丢步 - // currentMerge.MouseX = macroEvent.MouseX; - // currentMerge.MouseY = macroEvent.MouseY; - // break; - // - // case MacroEventType.MouseMoveBy: - // if (macroEvent.Time - currentMerge.Time > MergedEventTimeMax) - // { - // mergedMacroEvents.Add(currentMerge); - // currentMerge = macroEvent; - // break; - // } - // // 相对位移量相加 - // currentMerge.MouseX += macroEvent.MouseX; - // currentMerge.MouseY += macroEvent.MouseY; - // if (macroEvent.CameraOrientation != null) - // { - // currentMerge.CameraOrientation = macroEvent.CameraOrientation; - // } - // break; - // - // default: - // mergedMacroEvents.Add(currentMerge); - // mergedMacroEvents.Add(macroEvent); - // currentMerge = null; - // break; - // } - // } KeyMouseScript keyMouseScript = new() { MacroEvents = MacroEvents, MouseMoveByMacroEvents = MouseMoveByMacroEvents, + MouseMoveToMacroEvents = MouseMoveToMacroEvents, Info = new KeyMouseScriptInfo { X = rect.X, diff --git a/BetterGenshinImpact/Core/Recorder/Model/KeyMouseScript.cs b/BetterGenshinImpact/Core/Recorder/Model/KeyMouseScript.cs index eff34b25..4a451473 100644 --- a/BetterGenshinImpact/Core/Recorder/Model/KeyMouseScript.cs +++ b/BetterGenshinImpact/Core/Recorder/Model/KeyMouseScript.cs @@ -10,6 +10,7 @@ public class KeyMouseScript { public List MacroEvents { get; set; } = []; public List MouseMoveByMacroEvents { get; set; } = []; + public List MouseMoveToMacroEvents { get; set; } = []; public KeyMouseScriptInfo? Info { get; set; } /// @@ -39,4 +40,70 @@ public class KeyMouseScript } } } -} + + public void Merge() + { + // 合并鼠标移动事件 + const int mergedEventTimeMax = 20; + var mergedMacroEvents = new List(); + MacroEvent? currentMerge = null; + foreach (var macroEvent in MacroEvents) + { + if (currentMerge == null) + { + currentMerge = macroEvent; + continue; + } + + if (currentMerge.Type != macroEvent.Type) + { + mergedMacroEvents.Add(currentMerge); + currentMerge = macroEvent; + continue; + } + + switch (macroEvent.Type) + { + case MacroEventType.MouseMoveTo: + // 控制合并时间片段长度 + if (macroEvent.Time - currentMerge.Time > mergedEventTimeMax) + { + mergedMacroEvents.Add(currentMerge); + currentMerge = macroEvent; + break; + } + + // 合并为最后一个事件的位置,避免丢步 + currentMerge.MouseX = macroEvent.MouseX; + currentMerge.MouseY = macroEvent.MouseY; + break; + + case MacroEventType.MouseMoveBy: + if (macroEvent.Time - currentMerge.Time > mergedEventTimeMax) + { + mergedMacroEvents.Add(currentMerge); + currentMerge = macroEvent; + break; + } + + // 相对位移量相加 + currentMerge.MouseX += macroEvent.MouseX; + currentMerge.MouseY += macroEvent.MouseY; + if (macroEvent.CameraOrientation != null) + { + currentMerge.CameraOrientation = macroEvent.CameraOrientation; + } + + break; + + default: + mergedMacroEvents.Add(currentMerge); + mergedMacroEvents.Add(macroEvent); + currentMerge = null; + break; + } + } + + MacroEvents = mergedMacroEvents; + } +} \ No newline at end of file