1 4.2. UI control
yanyihui edited this page 2021-12-23 11:51:48 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

4.2. UI control

这里介绍操作游戏 UI 的类和方法。

Switch

操作游戏内的开关。使用场景:三种阵型的切换,周回模式开关等。

以切换普通图困难图为例:

# 创建开关
MODE_SWITCH_1 = Switch('Mode_switch_1')
# 定义状态
MODE_SWITCH_1.add_status('normal', SWITCH_1_NORMAL, sleep=STAGE_SHOWN_WAIT)
MODE_SWITCH_1.add_status('hard', SWITCH_1_HARD, sleep=STAGE_SHOWN_WAIT)

class Test(ModuleBase):
    def test(self):
        # 判断开关是否出现在画面上
        MODE_SWITCH_1.appear(main=self)
        # 获取当前状态
        status = MODE_SWITCH_1.get(main=self)
        # 切换至某个状态
        MODE_SWITCH_1.set('normal', main=self)

Scroll

操作游戏内的滚动条。

以委托列表滚动条为例:

# 创建滚动条
COMMISSION_SCROLL = Scroll(COMMISSION_SCROLL_AREA, color=(247, 211, 66), name='COMMISSION_SCROLL')

class Test(ModuleBase):
    def test(self):
        # 判断是否有滚动条
        COMMISSION_SCROLL.appear(main=self)
        # 获取当前位置
        posi = COMMISSION_SCROLL.cal_position(main=self)
        # 判断是否在顶端或底端
        COMMISSION_SCROLL.at_top(main=self)
        COMMISSION_SCROLL.at_bottom(main=self)
        # 拖拽至指定位置
        COMMISSION_SCROLL.set(0.5, main=self)
        # 拖拽至顶端或底端
        # 与直接拖拽至指定位置的区别是,这两个会拖出头,以保证滚动条到达端部
        COMMISSION_SCROLL.set_top(main=self)
        COMMISSION_SCROLL.set_bottom(main=self)
        # 翻页往下翻0.5页,翻页只是大致准确
        COMMISSION_SCROLL.drag_page(0.5, main=self)
        # 往上或往下翻一页由于翻页只是大致准确默认翻的是0.8页,以防止漏掉一些内容
        COMMISSION_SCROLL.prev_page(main=self)
        COMMISSION_SCROLL.next_page(main=self)

NavBar

操作游戏内的标签页。

以建造页面的左侧边栏为例:

# 每个标签的 Button 阵列
gacha_side_navbar = ButtonGrid(
    origin=(21, 126), delta=(0, 98),
    button_shape=(60, 80), grid_shape=(1, 5),
    name='GACHA_SIDE_NAVBAR')
# 创建标签页
GACHA = Navbar(grids=gacha_side_navbar,
    active_color=(247, 255, 173),
    inactive_color=(140, 162, 181))

class Test(ModuleBase):
    def test(self):
        # 获取标签页的序号
        current = GACHA.get_active(main=self)
        # 获取标签实际出现的个数
        total = GACHA.get_total(main=self)
        # 切换至指定的标签页,上下左右设置一个即可
        GACHA.set(main=self, left=None, right=None, upper=None, bottom=None)
        # 切换至从下往上数的第二个标签
        GACHA.set(main=self, bottom=2)

Page

游戏界面类。

以收获界面为例:

# 创建 Page 对象,使用的 check_button 需要是唯一的
# 如果画面中出现了REWARD_CHECKAlas就认为现在在page_reward界面中
page_reward = Page(REWARD_CHECK)
# 定义界面切换
# 点击什么按钮,会到达什么界面
page_reward.link(button=REWARD_GOTO_MAIN, destination=page_main)
page_main.link(button=MAIN_GOTO_REWARD, destination=page_reward)

界面切换

Alas 的游戏界面切换是自动的带有寻路的。Alas 可以在绝大多数的游戏界面下启动,并沿着最短路径切换到它需要的游戏界面,与许多脚本都需要在主界面中启动不同。

所有操作游戏界面的方法都包含重试。

ui_click()

点击 UI 上的按钮,切换至下一界面。相当于是封装了:

while 1:
    self.device.screenshot()
    if self.appear(appear_button):
        self.device.click(click_button)
    if self.appear(check_button):
        break
  • appear_button 如果出现了这个按钮,就点击 click_button
  • click_button 需要点击的按钮,为设置时,等于 appear_button
  • check_button 如果出现了这个按钮,认为界面切换完成
  • additional 点击可能会出现的按钮,例如弹窗确认

ui_get_current_page()

获取当前界面。self.ui_current 即是当前界面。

Alas 启动时会调用这个方法,如果游戏未启动,抛出 GameNotRunningError,被顶层捕获后,启动游戏并继续。

ui_goto()

沿最短路径切换到指定界面,即便歪去别的界面也能自动纠正。

ui_ensure()

相当于 ui_get_current_page() + ui_goto()

ui_ensure_index()

地图章节翻页,包含重试以防止没翻到或者翻过头。使用场景:设置地图章节,选择队伍,设置猫箱购买数量等。

  • index 目标数字
  • letter 当前数字,可以是获取当前数字的方法,也可以是 OCR 类
  • prev_button 往前的按钮
  • next_button 往后的按钮
  • fast True则一次性点完不对再重试。False则点一下识别一下。False用在队伍选择上因为如果少了一队数字就不连续了。

ui_goto_main()

前往主界面

ui_back()

点返回箭头

ui_additional()

处理各种可能在界面切换期间出现的弹窗。