From 311b5c8d2a67d4c07ae6d16b6e8570d98bcb1331 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 14 Nov 2022 17:20:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E5=8A=A0=E9=80=9F=E5=BA=A6=E5=8F=82=E6=95=B0=20acceleration=5F?= =?UTF-8?q?coef?= 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;