From 311b5c8d2a67d4c07ae6d16b6e8570d98bcb1331 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 14 Nov 2022 17:20:15 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E5=8A=A0=E9=80=9F=E5=BA=A6=E5=8F=82=E6=95=B0=20accele?= =?UTF-8?q?ration=5Fcoef?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit acceleration_coef∈(-1,1),=0表示匀速,>0表示加速,<0表示减速 超出范围会往反方向滑动一段 --- src/MeoAssistant/Controller.cpp | 40 +++++++++++++---------- src/MeoAssistant/Controller.h | 12 ++++--- src/MeoAssistant/Task/Sub/ProcessTask.cpp | 7 ++-- src/MeoAssistant/Task/Sub/ProcessTask.h | 2 +- 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index aca69abe34..7ba5b5ef61 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -1063,9 +1063,11 @@ bool asst::Controller::click_without_scale(const Point& p) if (m_minitouch_enabled && m_minitouch_avaiable) { int x = static_cast(p.x * m_minitouch_props.x_scaling); int y = static_cast(p.y * m_minitouch_props.y_scaling); - constexpr int WaitMs = 50; - std::string minitouch_cmd = MinitouchCmd::down(x, y, true, WaitMs) + MinitouchCmd::up(); - return input_to_minitouch(minitouch_cmd, WaitMs); + constexpr int duration = 50; // 点击从按下到抬起之间的持续时间,以毫秒计 + constexpr int wait_ms = 50; // 触点抬起后等待的时间,以毫秒计 + std::string minitouch_cmd = + MinitouchCmd::down(x, y, true, duration) + MinitouchCmd::up() + MinitouchCmd::wait(wait_ms); + return input_to_minitouch(minitouch_cmd, duration); } else { std::string cur_cmd = @@ -1079,7 +1081,8 @@ bool asst::Controller::click_without_scale(const Rect& rect) return click_without_scale(rand_point_in_rect(rect)); } -bool asst::Controller::swipe(const Point& p1, const Point& p2, int duration, bool extra_swipe) +bool asst::Controller::swipe(const Point& p1, const Point& p2, int duration, bool extra_swipe, + double acceleration_coef) { int x1 = static_cast(p1.x * m_control_scale); int y1 = static_cast(p1.y * m_control_scale); @@ -1087,15 +1090,17 @@ bool asst::Controller::swipe(const Point& p1, const Point& p2, int duration, boo int y2 = static_cast(p2.y * m_control_scale); // log.trace("Swipe, raw:", p1.x, p1.y, p2.x, p2.y, "corr:", x1, y1, x2, y2); - return swipe_without_scale(Point(x1, y1), Point(x2, y2), duration, extra_swipe); + return swipe_without_scale(Point(x1, y1), Point(x2, y2), duration, extra_swipe, acceleration_coef); } -bool asst::Controller::swipe(const Rect& r1, const Rect& r2, int duration, bool extra_swipe) +bool asst::Controller::swipe(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, + double acceleration_coef) { - return swipe(rand_point_in_rect(r1), rand_point_in_rect(r2), duration, extra_swipe); + return swipe(rand_point_in_rect(r1), rand_point_in_rect(r2), duration, extra_swipe, acceleration_coef); } -bool asst::Controller::swipe_without_scale(const Point& p1, const Point& p2, int duration, bool extra_swipe) +bool asst::Controller::swipe_without_scale(const Point& p1, const Point& p2, int duration, bool extra_swipe, + double acceleration_coef) { int x1 = p1.x, y1 = p1.y; int x2 = p2.x, y2 = p2.y; @@ -1121,13 +1126,13 @@ bool asst::Controller::swipe_without_scale(const Point& p1, const Point& p2, int _x2 = static_cast(_x2 * m_minitouch_props.x_scaling); _y2 = static_cast(_y2 * m_minitouch_props.y_scaling); - double move_times = static_cast(_duration) / MoveInterval; - double x_step = (_x2 - _x1) / move_times; - double y_step = (_y2 - _y1) / move_times; - // TODO: 加点随机因子,或者改成中间快两头慢 - for (int times = 1; times < move_times; ++times) { - int cur_x = _x1 + static_cast(x_step * times); - int cur_y = _y1 + static_cast(y_step * times); + double acceleration = acceleration_coef * static_cast(_x2 - _x1) / (_duration * _duration); + double v0x = static_cast(_x2 - _x1) / _duration - acceleration * _duration; + double v0y = static_cast(_y2 - _y1) / _duration - acceleration * _duration; + + for (int cur_time = MoveInterval; cur_time < _duration; cur_time += MoveInterval) { + int cur_x = _x1 + static_cast(v0x * cur_time + acceleration * cur_time * cur_time); + int cur_y = _y1 + static_cast(v0y * cur_time + acceleration * cur_time * cur_time); if (cur_x < 0 || cur_x > m_minitouch_props.max_x || cur_y < 0 || cur_y > m_minitouch_props.max_y) { continue; } @@ -1174,9 +1179,10 @@ bool asst::Controller::swipe_without_scale(const Point& p1, const Point& p2, int } } -bool asst::Controller::swipe_without_scale(const Rect& r1, const Rect& r2, int duration, bool extra_swipe) +bool asst::Controller::swipe_without_scale(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, + double acceleration_coef) { - return swipe_without_scale(rand_point_in_rect(r1), rand_point_in_rect(r2), duration, extra_swipe); + return swipe_without_scale(rand_point_in_rect(r1), rand_point_in_rect(r2), duration, extra_swipe, acceleration_coef); } bool asst::Controller::connect(const std::string& adb_path, const std::string& address, const std::string& config) diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index 1737ca8300..a5741ea176 100644 --- a/src/MeoAssistant/Controller.h +++ b/src/MeoAssistant/Controller.h @@ -57,10 +57,14 @@ namespace asst bool click_without_scale(const Point& p); bool click_without_scale(const Rect& rect); - bool swipe(const Point& p1, const Point& p2, int duration = 0, bool extra_swipe = false); - bool swipe(const Rect& r1, const Rect& r2, int duration = 0, bool extra_swipe = false); - bool swipe_without_scale(const Point& p1, const Point& p2, int duration = 0, bool extra_swipe = false); - bool swipe_without_scale(const Rect& r1, const Rect& r2, int duration = 0, bool extra_swipe = false); + bool swipe(const Point& p1, const Point& p2, int duration = 0, bool extra_swipe = false, + double acceleration_coef = 0); + bool swipe(const Rect& r1, const Rect& r2, int duration = 0, bool extra_swipe = false, + double acceleration_coef = 0); + bool swipe_without_scale(const Point& p1, const Point& p2, int duration = 0, bool extra_swipe = false, + double acceleration_coef = 0); + bool swipe_without_scale(const Rect& r1, const Rect& r2, int duration = 0, bool extra_swipe = false, + double acceleration_coef = 0); std::pair get_scale_size() const noexcept; diff --git a/src/MeoAssistant/Task/Sub/ProcessTask.cpp b/src/MeoAssistant/Task/Sub/ProcessTask.cpp index 1eb4e62170..f72f2b9dde 100644 --- a/src/MeoAssistant/Task/Sub/ProcessTask.cpp +++ b/src/MeoAssistant/Task/Sub/ProcessTask.cpp @@ -186,7 +186,8 @@ bool ProcessTask::_run() case ProcessTaskAction::Swipe: exec_swipe_task(m_cur_task_ptr->specific_rect, m_cur_task_ptr->rect_move, m_cur_task_ptr->special_params.empty() ? 0 : m_cur_task_ptr->special_params.at(0), - (m_cur_task_ptr->special_params.size() < 2) ? false : m_cur_task_ptr->special_params.at(1)); + (m_cur_task_ptr->special_params.size() < 2) ? false : m_cur_task_ptr->special_params.at(1), + (m_cur_task_ptr->special_params.size() < 3) ? 0 : m_cur_task_ptr->special_params.at(2)); break; case ProcessTaskAction::DoNothing: break; @@ -305,8 +306,8 @@ void ProcessTask::exec_click_task(const Rect& matched_rect) m_ctrler->click(matched_rect); } -void asst::ProcessTask::exec_swipe_task(const Rect& r1, const Rect& r2, int duration, bool extra_swipe) +void asst::ProcessTask::exec_swipe_task(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, double acceleration_coef) { MinitouchTempSwitcher switcher(m_ctrler); - m_ctrler->swipe(r1, r2, duration, extra_swipe); + m_ctrler->swipe(r1, r2, duration, extra_swipe, acceleration_coef); } diff --git a/src/MeoAssistant/Task/Sub/ProcessTask.h b/src/MeoAssistant/Task/Sub/ProcessTask.h index 6d1d877a9e..40a141103a 100644 --- a/src/MeoAssistant/Task/Sub/ProcessTask.h +++ b/src/MeoAssistant/Task/Sub/ProcessTask.h @@ -42,7 +42,7 @@ namespace asst std::pair calc_time_limit() const; void exec_click_task(const Rect& matched_rect); - void exec_swipe_task(const Rect& r1, const Rect& r2, int duration, bool extra_swipe); + void exec_swipe_task(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, double acceleration_coef); std::shared_ptr m_cur_task_ptr = nullptr; std::vector m_raw_tasks_name; From b448cef456dd827999ca831bf70fa3a8dd3e537b Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 14 Nov 2022 19:07:13 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20swipe=20=E7=9A=84=20up=20=E4=B9=9F?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=2050ms=20=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 否则可能 maa 等的时间 minitouch 没等,白等了.jpg --- src/MeoAssistant/Controller.cpp | 16 +++++++++------- .../Task/Plugin/RoguelikeBattleTaskPlugin.cpp | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 7ba5b5ef61..2450dfb4db 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -53,8 +53,8 @@ struct MinitouchCmd sprintf(buff, "d %d %d %d %d\n", contact, x, y, pressure); std::string str = buff; - if (with_commit) str += commit(); if (wait_ms) str += wait(wait_ms); + if (with_commit) str += commit(); return str; } inline static std::string move(int x, int y, bool with_commit = true, int wait_ms = 0, int contact = 0, @@ -64,16 +64,17 @@ struct MinitouchCmd sprintf(buff, "m %d %d %d %d\n", contact, x, y, pressure); std::string str = buff; - if (with_commit) str += commit(); if (wait_ms) str += wait(wait_ms); + if (with_commit) str += commit(); return str; } - inline static std::string up(bool with_commit = true, int contact = 0) + inline static std::string up(bool with_commit = true, int wait_ms = 0, int contact = 0) { char buff[16] = { 0 }; sprintf(buff, "u %d\n", contact); std::string str = buff; + if (wait_ms) str += wait(wait_ms); if (with_commit) str += commit(); return str; } @@ -1066,8 +1067,8 @@ bool asst::Controller::click_without_scale(const Point& p) constexpr int duration = 50; // 点击从按下到抬起之间的持续时间,以毫秒计 constexpr int wait_ms = 50; // 触点抬起后等待的时间,以毫秒计 std::string minitouch_cmd = - MinitouchCmd::down(x, y, true, duration) + MinitouchCmd::up() + MinitouchCmd::wait(wait_ms); - return input_to_minitouch(minitouch_cmd, duration); + MinitouchCmd::down(x, y, true, duration) + MinitouchCmd::up(wait_ms); + return input_to_minitouch(minitouch_cmd, duration + wait_ms); } else { std::string cur_cmd = @@ -1149,8 +1150,9 @@ bool asst::Controller::swipe_without_scale(const Point& p1, const Point& p2, int duration += opt.minitouch_extra_swipe_duration; } constexpr int ExtraWait = 50; - duration += ExtraWait; - return input_to_minitouch(MinitouchCmd::wait(ExtraWait) + MinitouchCmd::up(), duration); + duration += 2 * ExtraWait; + return input_to_minitouch( + MinitouchCmd::wait(ExtraWait /* 停留终点 */) + MinitouchCmd::up(ExtraWait /* 抬起后等待 */), duration); } else { std::string cur_cmd = diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp index ae2c5005e6..d184b03298 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp @@ -726,11 +726,11 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() // 将方向转换为实际的 swipe end 坐标点 if (direction != Point::zero()) { - static const int coeff = Task.get("BattleSwipeOper")->special_params.at(0); + static const int coeff = swipe_oper_task_ptr->special_params.at(0); Point end_point = placed_point + (direction * coeff); m_ctrler->swipe(placed_point, end_point, swipe_oper_task_ptr->post_delay); + sleep(use_oper_task_ptr->post_delay); } - sleep(Task.get("BattleUseOper")->post_delay); if (opt_oper.role == BattleRole::Drone) { cancel_oper_selection(); From dea7ad8330a53c38a25211c203a949def48d1382 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 14 Nov 2022 17:17:27 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=20interval=EF=BC=8C=E5=A2=9E=E5=8A=A0=20SlowlySwipe?= =?UTF-8?q?=20postDelay=EF=BC=8C=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=BB=91=E5=8A=A8=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 22 ++++++++++++++++++---- src/MeoAssistant/Controller.cpp | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/resource/tasks.json b/resource/tasks.json index 3850a8cee7..1ab79df102 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -2,6 +2,7 @@ "SlowlySwipeToTheLeft": { "algorithm": "JustReturn", "action": "Swipe", + "postDelay": 200, "specificRect": [ 300, 310, @@ -18,7 +19,8 @@ "rectMove_Doc": "滑动终点", "specialParams": [ 200, - 1 + 1, + -1 ], "specialParams_Doc": [ "滑动 duration", @@ -32,6 +34,7 @@ "SlowlySwipeToTheRight": { "algorithm": "JustReturn", "action": "Swipe", + "postDelay": 200, "specificRect": [ 880, 310, @@ -46,7 +49,8 @@ ], "specialParams": [ 200, - 1 + 1, + -1 ], "next": [ "#next" @@ -69,6 +73,11 @@ 100, 100 ], + "specialParams": [ + 150, + 0, + 0.5 + ], "next": [ "#next" ], @@ -90,6 +99,11 @@ 200, 100 ], + "specialParams": [ + 150, + 0, + 0.5 + ], "next": [ "#next" ], @@ -6132,13 +6146,13 @@ "algorithm": "JustReturn", "preDelay": 200, "postDelay": 100, - "Doc": "pre 是从点击干员,到干员信息弹出来等待的时间;rear 是干员上场,到设置朝向之间等待的时间" + "Doc": "pre 是从点击干员,到干员信息弹出来等待的时间;post 是干员上场,到设置朝向之间等待的时间" }, "BattleSwipeOper": { "algorithm": "JustReturn", "preDelay": 200, "postDelay": 50, - "Doc": "pre 是将干员滑动到场上的 duration 系数;rear 是设置干员朝向滑动的 duration", + "Doc": "pre 是将干员滑动到场上的 duration 系数;post 是设置干员朝向滑动的 duration", "specialParams": [ 200 ], diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 2450dfb4db..caaeaaf40c 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -1115,7 +1115,7 @@ bool asst::Controller::swipe_without_scale(const Point& p1, const Point& p2, int const auto& opt = Configer.get_options(); if (m_minitouch_enabled && m_minitouch_avaiable) { - constexpr int MoveInterval = 1; + constexpr int MoveInterval = 5; input_to_minitouch(MinitouchCmd::down(static_cast(x1 * m_minitouch_props.x_scaling), static_cast(m_minitouch_props.y_scaling * y1), true, MoveInterval)); if (duration == 0) { From 4d4b76aa7c54d430d9ce0f816aa4994ab8ab37c6 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 14 Nov 2022 17:23:02 +0800 Subject: [PATCH 4/4] style: format --- src/MeoAssistant/Controller.cpp | 9 ++++----- src/MeoAssistant/Task/Sub/ProcessTask.cpp | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index caaeaaf40c..7fa47d96f5 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -1082,8 +1082,7 @@ bool asst::Controller::click_without_scale(const Rect& rect) return click_without_scale(rand_point_in_rect(rect)); } -bool asst::Controller::swipe(const Point& p1, const Point& p2, int duration, bool extra_swipe, - double acceleration_coef) +bool asst::Controller::swipe(const Point& p1, const Point& p2, int duration, bool extra_swipe, double acceleration_coef) { int x1 = static_cast(p1.x * m_control_scale); int y1 = static_cast(p1.y * m_control_scale); @@ -1094,8 +1093,7 @@ bool asst::Controller::swipe(const Point& p1, const Point& p2, int duration, boo return swipe_without_scale(Point(x1, y1), Point(x2, y2), duration, extra_swipe, acceleration_coef); } -bool asst::Controller::swipe(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, - double acceleration_coef) +bool asst::Controller::swipe(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, double acceleration_coef) { return swipe(rand_point_in_rect(r1), rand_point_in_rect(r2), duration, extra_swipe, acceleration_coef); } @@ -1184,7 +1182,8 @@ bool asst::Controller::swipe_without_scale(const Point& p1, const Point& p2, int bool asst::Controller::swipe_without_scale(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, double acceleration_coef) { - return swipe_without_scale(rand_point_in_rect(r1), rand_point_in_rect(r2), duration, extra_swipe, acceleration_coef); + return swipe_without_scale(rand_point_in_rect(r1), rand_point_in_rect(r2), duration, extra_swipe, + acceleration_coef); } bool asst::Controller::connect(const std::string& adb_path, const std::string& address, const std::string& config) diff --git a/src/MeoAssistant/Task/Sub/ProcessTask.cpp b/src/MeoAssistant/Task/Sub/ProcessTask.cpp index f72f2b9dde..7565e3fff0 100644 --- a/src/MeoAssistant/Task/Sub/ProcessTask.cpp +++ b/src/MeoAssistant/Task/Sub/ProcessTask.cpp @@ -306,7 +306,8 @@ void ProcessTask::exec_click_task(const Rect& matched_rect) m_ctrler->click(matched_rect); } -void asst::ProcessTask::exec_swipe_task(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, double acceleration_coef) +void asst::ProcessTask::exec_swipe_task(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, + double acceleration_coef) { MinitouchTempSwitcher switcher(m_ctrler); m_ctrler->swipe(r1, r2, duration, extra_swipe, acceleration_coef);