From c0efe8891a17575574073dba8563a39e6e54055b Mon Sep 17 00:00:00 2001 From: uye <99072975+ABA2396@users.noreply.github.com> Date: Mon, 9 Jun 2025 15:44:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=AB=98=E5=88=86=E8=BE=A8=E7=8E=87?= =?UTF-8?q?=E4=B8=8B=E6=97=A0=E6=B3=95=E8=BF=9B=E5=85=A5=E7=89=B9=E5=AE=9A?= =?UTF-8?q?=E5=85=B3=E5=8D=A1=EF=BC=88=E8=99=BD=E7=84=B6=E4=BF=AE=E4=BA=86?= =?UTF-8?q?=E4=BD=86=E8=BF=98=E6=98=AF=E4=B8=8D=E5=BB=BA=E8=AE=AE=E7=94=A8?= =?UTF-8?q?=202k=204k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks/tasks.json | 6 +++-- src/MaaCore/Common/AsstTypes.h | 1 + src/MaaCore/Config/TaskData.cpp | 10 +++++---- src/MaaCore/Controller/ControlScaleProxy.cpp | 23 +++++++++++++++----- src/MaaCore/Controller/ControlScaleProxy.h | 6 +++-- src/MaaCore/Controller/Controller.cpp | 5 +++-- src/MaaCore/Controller/Controller.h | 3 ++- src/MaaCore/Task/ProcessTask.cpp | 8 ++++--- src/MaaCore/Task/ProcessTask.h | 3 ++- 9 files changed, 45 insertions(+), 20 deletions(-) diff --git a/resource/tasks/tasks.json b/resource/tasks/tasks.json index de722e1fb8..b4e88403fe 100644 --- a/resource/tasks/tasks.json +++ b/resource/tasks/tasks.json @@ -504,12 +504,14 @@ "Doc": "在上面一点滑避免点到关卡划不动", "baseTask": "SlowlySwipeToTheLeft", "specificRect": [300, 100, 20, 20], - "rectMove": [900, 100, 20, 20] + "rectMove": [900, 100, 20, 20], + "highResolutionSwipeFix": true }, "ChapterSlowlySwipeToTheRight": { "baseTask": "SlowlySwipeToTheRight", "specificRect": [900, 100, 20, 20], - "rectMove": [300, 100, 20, 20] + "rectMove": [300, 100, 20, 20], + "highResolutionSwipeFix": true }, "ChapterSwipeToTheLeft": { "Doc": "滑动到最左", diff --git a/src/MaaCore/Common/AsstTypes.h b/src/MaaCore/Common/AsstTypes.h index b44f90322b..9e0f74aba5 100644 --- a/src/MaaCore/Common/AsstTypes.h +++ b/src/MaaCore/Common/AsstTypes.h @@ -575,6 +575,7 @@ struct TaskInfo : public TaskPipelineInfo bool sub_error_ignored = false; // 子任务如果失败了,是否继续执行剩下的任务 int max_times = INT_MAX; // 任务最多执行多少次 Rect specific_rect; // 指定区域,目前仅针对ClickRect任务有用,会点这个区域 + bool high_resolution_swipe_fix = false; // 是否启用高分辨率滑动修正,仅对 ProcessTask 生效(其实只有关卡的滑动用上了 int pre_delay = 0; // 执行该任务前的延时 int post_delay = 0; // 执行该任务后的延时 int retry_times = INT_MAX; // 未找到图像时的重试次数 diff --git a/src/MaaCore/Config/TaskData.cpp b/src/MaaCore/Config/TaskData.cpp index d7519fdfc8..08d8515c95 100644 --- a/src/MaaCore/Config/TaskData.cpp +++ b/src/MaaCore/Config/TaskData.cpp @@ -516,6 +516,7 @@ asst::TaskPtr asst::TaskData::generate_task_info(std::string_view name) ASST_TASKDATA_GET_VALUE_OR("subErrorIgnored", sub_error_ignored); ASST_TASKDATA_GET_VALUE_OR("rectMove", rect_move); ASST_TASKDATA_GET_VALUE_OR("specificRect", specific_rect); + ASST_TASKDATA_GET_VALUE_OR("highResolutionSwipeFix", high_resolution_swipe_fix); ASST_TASKDATA_GET_VALUE_OR("specialParams", special_params); ASST_TASKDATA_GET_VALUE_OR("inputText", input_text); @@ -1023,6 +1024,7 @@ asst::TaskConstPtr asst::TaskData::_default_task_info() task_info_ptr->sub_error_ignored = false; task_info_ptr->rect_move = Rect(); task_info_ptr->specific_rect = Rect(); + task_info_ptr->high_resolution_swipe_fix = false; return task_info_ptr; } @@ -1041,7 +1043,7 @@ bool asst::TaskData::syntax_check(std::string_view task_name, const json::value& // common "action", "algorithm", "baseTask", "exceededNext", "maxTimes", "next", "onErrorNext", "postDelay", "preDelay", "reduceOtherTimes", - "specialParams", "sub", "subErrorIgnored", + "specialParams", "sub", "subErrorIgnored", "highResolutionSwipeFix", // specific "cache", "colorScales", "colorWithClose", "maskRange", "method", @@ -1052,7 +1054,7 @@ bool asst::TaskData::syntax_check(std::string_view task_name, const json::value& // common "action", "algorithm", "baseTask", "exceededNext", "maxTimes", "next", "onErrorNext", "postDelay", "preDelay", "reduceOtherTimes", - "specialParams", "sub", "subErrorIgnored", + "specialParams", "sub", "subErrorIgnored", "highResolutionSwipeFix", // specific "cache", "fullMatch", "isAscii", "ocrReplace", "rectMove", @@ -1063,7 +1065,7 @@ bool asst::TaskData::syntax_check(std::string_view task_name, const json::value& // common "action", "algorithm", "baseTask", "exceededNext", "maxTimes", "next", "onErrorNext", "postDelay", "preDelay", "reduceOtherTimes", - "specialParams", "sub", "subErrorIgnored", + "specialParams", "sub", "subErrorIgnored", "highResolutionSwipeFix", // specific "template", "roi", "count", "ratio", "detector", } }, @@ -1072,7 +1074,7 @@ bool asst::TaskData::syntax_check(std::string_view task_name, const json::value& // common "action", "algorithm", "baseTask", "exceededNext", "maxTimes", "next", "onErrorNext", "postDelay", "preDelay", "reduceOtherTimes", - "specialParams", "sub", "subErrorIgnored", + "specialParams", "sub", "subErrorIgnored", "highResolutionSwipeFix", // specific "inputText" diff --git a/src/MaaCore/Controller/ControlScaleProxy.cpp b/src/MaaCore/Controller/ControlScaleProxy.cpp index 8bbd957e59..dc247075d3 100644 --- a/src/MaaCore/Controller/ControlScaleProxy.cpp +++ b/src/MaaCore/Controller/ControlScaleProxy.cpp @@ -80,12 +80,24 @@ bool asst::ControlScaleProxy::swipe( bool extra_swipe, double slope_in, double slope_out, - bool with_pause) + bool with_pause, + bool high_resolution_swipe_fix) { int x1 = static_cast(p1.x * m_control_scale); int y1 = static_cast(p1.y * m_control_scale); - int x2 = static_cast(p2.x * m_control_scale); - int y2 = static_cast(p2.y * m_control_scale); + int x2, y2; + if (high_resolution_swipe_fix) { + // 保持滑动距离一致:先计算原始的相对偏移,再加到缩放后的起点上 + int dx = p2.x - p1.x; // 不缩放 + int dy = p2.y - p1.y; + x2 = x1 + dx; + y2 = y1 + dy; + Log.trace("High-resolution swipe fix, offset", Point(dx, dy)); + } + else { + x2 = static_cast(p2.x * m_control_scale); + y2 = static_cast(p2.y * m_control_scale); + } Log.trace("Swipe with scaled coordinates", p1, p2, m_control_scale); @@ -99,7 +111,8 @@ bool asst::ControlScaleProxy::swipe( bool extra_swipe, double slope_in, double slope_out, - bool with_pause) + bool with_pause, + bool high_resolution_swipe_fix) { auto rand_p1 = rand_point_in_rect(r1); auto rand_p2 = rand_point_in_rect(r2); @@ -113,7 +126,7 @@ bool asst::ControlScaleProxy::swipe( rand_p2.x = rand_p1.x - static_cast(x_dist * opt.adb_swipe_x_distance_multiplier); } - return swipe(rand_p1, rand_p2, duration, extra_swipe, slope_in, slope_out, with_pause); + return swipe(rand_p1, rand_p2, duration, extra_swipe, slope_in, slope_out, with_pause, high_resolution_swipe_fix); } bool asst::ControlScaleProxy::inject_input_event(InputEvent event) diff --git a/src/MaaCore/Controller/ControlScaleProxy.h b/src/MaaCore/Controller/ControlScaleProxy.h index 5cf2c90d5d..219963e1f6 100644 --- a/src/MaaCore/Controller/ControlScaleProxy.h +++ b/src/MaaCore/Controller/ControlScaleProxy.h @@ -36,7 +36,8 @@ public: bool extra_swipe = false, double slope_in = 1, double slope_out = 1, - bool with_pause = false); + bool with_pause = false, + bool high_resolution_swipe_fix = false); bool swipe( const Rect& r1, const Rect& r2, @@ -44,7 +45,8 @@ public: bool extra_swipe = false, double slope_in = 1, double slope_out = 1, - bool with_pause = false); + bool with_pause = false, + bool high_resolution_swipe_fix = false); bool inject_input_event(InputEvent event); diff --git a/src/MaaCore/Controller/Controller.cpp b/src/MaaCore/Controller/Controller.cpp index 6f15aa7061..a89685c75a 100644 --- a/src/MaaCore/Controller/Controller.cpp +++ b/src/MaaCore/Controller/Controller.cpp @@ -199,10 +199,11 @@ bool asst::Controller::swipe( bool extra_swipe, double slope_in, double slope_out, - bool with_pause) + bool with_pause, + bool high_resolution_swipe_fix) { CHECK_EXIST(m_controller, false); - return m_scale_proxy->swipe(r1, r2, duration, extra_swipe, slope_in, slope_out, with_pause); + return m_scale_proxy->swipe(r1, r2, duration, extra_swipe, slope_in, slope_out, with_pause, high_resolution_swipe_fix); } bool asst::Controller::inject_input_event(InputEvent& event) diff --git a/src/MaaCore/Controller/Controller.h b/src/MaaCore/Controller/Controller.h index a32c20ddaa..ffa8ea4e86 100644 --- a/src/MaaCore/Controller/Controller.h +++ b/src/MaaCore/Controller/Controller.h @@ -85,7 +85,8 @@ public: bool extra_swipe = false, double slope_in = 1, double slope_out = 1, - bool with_pause = false); + bool with_pause = false, + bool high_resolution_swipe_fix = false); bool inject_input_event(InputEvent& event); diff --git a/src/MaaCore/Task/ProcessTask.cpp b/src/MaaCore/Task/ProcessTask.cpp index 606d5b92fa..f9c7df79a7 100644 --- a/src/MaaCore/Task/ProcessTask.cpp +++ b/src/MaaCore/Task/ProcessTask.cpp @@ -215,7 +215,8 @@ ProcessTask::NodeStatus ProcessTask::run_action(const HitDetail& hits) const (param_size > 0) ? task->special_params.at(0) : 0, (param_size > 1) ? task->special_params.at(1) : false, (param_size > 2) ? task->special_params.at(2) : 1, - (param_size > 3) ? task->special_params.at(3) : 1); + (param_size > 3) ? task->special_params.at(3) : 1, + task->high_resolution_swipe_fix); return NodeStatus::Success; } case ProcessTaskAction::DoNothing: @@ -426,7 +427,8 @@ void ProcessTask::exec_swipe_task( int duration, bool extra_swipe, double slope_in, - double slope_out) const + double slope_out, + bool high_resolution_swipe_fix) const { - ctrler()->swipe(r1, r2, duration, extra_swipe, slope_in, slope_out); + ctrler()->swipe(r1, r2, duration, extra_swipe, slope_in, slope_out, false, high_resolution_swipe_fix); } diff --git a/src/MaaCore/Task/ProcessTask.h b/src/MaaCore/Task/ProcessTask.h index 351cf1fe7c..4695701052 100644 --- a/src/MaaCore/Task/ProcessTask.h +++ b/src/MaaCore/Task/ProcessTask.h @@ -75,7 +75,8 @@ protected: int duration, bool extra_swipe, double slope_in, - double slope_out) const; + double slope_out, + bool high_resolution_swipe_fix) const; TaskList m_begin_task_list; std::string m_pre_task_name;