总管理器 Timer

总述

阅读以下代码:

import os

from autowsgr.fight.event.event_2024_0930 import EventFightPlan20240930
from autowsgr.scripts.main import start_script

timer = start_script(f"{os.path.dirname(os.path.abspath(__file__))}/user_settings.yaml") # 注册一个 timer 来管理模拟器和游戏
plan = EventFightPlan20240930(
    timer, plan_path=r"C:\\Users\\huany\\Desktop\\Projects\\Auto-WSGR-dev\\Auto-WSGR\\tests\\plans\\event\\20240930\\E10ADF.yaml", fleet_id=4
) # 注册一个 plan, 功能是在 10 周年活动图 E10 的 ADF 三连夜战点练级
plan.run_for_times(500) # 执行 500 次

通过 start_script 函数,用户获取了一个 Timer 对象,这个对象用于操作模拟器,每次运行程序时只能注册一个 Timer 对象。

所有的 FightPlan 对象在注册(实例化)时均需要将唯一的全局 Timer 对象作为参数传入。(例子省略)

所有的游戏操作函数都需要唯一的全局 Timer 对象作为参数传入:

def SetAutoSupply(timer: Timer, type=1):
		"""
		设置自动补给
		"""
    timer.update_screen()
    NowType = int(timer.check_pixel((48, 508), (224, 135, 35)))
    if NowType != type:
        timer.click(44, 503, delay=0.33)

Timer 对象提供了操作游戏所必须的所有底层接口,下面将逐步介绍。

UI 树游走

现已加入的游戏 UI 页面(不带后缀名和后缀数字的文件名就是 target 的参数)。

这是一个偏上层的功能,主要有以下几个方法:

    def wait_pages(self, names, timeout=10, gap=0.1, after_wait=0.1):
	    # 等待指示的界面中的任何一个出现。
	    # names 是一个列表, 指示哪些界面是在被等待的界面。
	    # 没有返回值。
    
    def goto_game_page(self, target="main", extra_check=False):
	    # 前往 target 指示的游戏页面。
	    # target 是一个字符串。
	    
	  def ConfirmOperation(self, must_confirm=False, delay=0.5, confidence=0.9, timeout=0):
		  # 点击弹出的确定按钮
		  
		def go_main_page(self, QuitOperationTime=0, List=[], ExList=[]):
      # 从任意界面(包括未加入的游戏 UI 页面)返回主页面。

图像处理

建立在原子操作上的进一步处理图像的函数,主要有以下几个方法:

与模拟器交互(原子操作)

继承自 AndroidController 类,主要有以下几个方法:

    def relative_click(self, x, y, times=1, delay=0.5, enable_subprocess=False):
        # 点击模拟器相对坐标 (x, y) ([0, 1], [0, 1])
    
    def text(self, t):
        """输入文本
        需要焦点在输入框时才能输入
        """
        
    def relative_swipe(self, x1, y1, x2, y2, duration=0.5, delay=0.5, *args, **kwargs):
        """匀速滑动模拟器相对坐标 (x1, y1) 到 (x2, y2).
        Args:
            x1, y1, x2, y2: 相对坐标
            duration: 滑动总时间
            delay: 滑动后延时(单位为秒)
        """
        
    def relative_long_tap(self, x, y, duration=1, delay=0.5, *args, **kwargs):
        """长按相对坐标 (x, y)
        Args:
            x, y: 相对坐标
            duration (int, optional): 长按时间(秒). Defaults to 1.
            delay (float, optional): 操作后等待时间(秒). Defaults to 0.5.
        """
    
    def get_screen(self, resolution=(1280, 720), need_screen_shot=True):
        """获取屏幕图片
        return (numpy.ndarray): 宽x长 array[720][1280]
        """
        if need_screen_shot:
            self.update_screen()
        return cv2.resize(self.screen, resolution)