操作队列

在时间设定那篇文章中,我们就曾提到过操作队列是 AvZ 这个框架的键控逻辑核心,理解操作队列是如何工作的将十分重要,那么现在是时候介绍操作队列是如何实现的了。

AvZ 实现的核心在于 操作、排序、队列、执行 这四个方面,下面对这四个概念进行逐一介绍。

操作

操作是我们最熟悉不过的了,就是指用炮、用卡之类的,实际上,在我们编写脚本的过程中,操作是这四个过程中我们唯一能够直观感触到的,其他三个过程是 AvZ 键控逻辑内部实现的,我们无法直观的感受到他们的存在,即其他三个过程被封装了。

排序

排序这一过程对于实现时间点书写人性化非常重要, AvZ 会根据操作时间点的先后顺序对操作进行排序,时间点靠前的排在前面,时间点靠后的放在后面,这样例如下面的代码

SetTime(-400, 1);
pao_operator.pao(1, 1);
SetTime(-599, 1);
Card(WG_17, 1, 1);

在经过排序这一步骤后, AvZ 内部将会把这些代码处理成下面的代码

SetTime(-599, 1);
Card(WG_17, 1, 1);
SetTime(-400, 1);
pao_operator.pao(1, 1);

但是在这里大家可能会有疑问,例如下面的代码 AvZ 是怎样对其进行排序的呢?

SetTime(100, 1);
Card(WG_17, 1, 1);
SetTime(-400, 2);
pao_operator.pao(1, 1);

第一波的刷新后1000cs的时刻点到底是在第二波刷新前400cs之前还是之后,这似乎不太容易判断,这与僵尸刷新时间点有很大的关系。因此,为了解决这一问题,AvZ 引入了[本局游戏总波数]条队列并行执行。

队列

首先, 队列是一个容器,是储存排序结果的容器。AvZ 将同一波操作的排序结果储存在对应的队列里。 例如第一波的操作排序结果将储存在第一个队列里,第三波的操作将储存在第三个队列里,那么经过上面的描述,我们可以由下面的代码得到经过 AvZ 内部处理后形成的队列。

SetTime(1000, 1);
Card(WG_17, 1, 1);
SetTime(-100, 2);
pao_operator.pao(1, 1);
SetTime(-200, 1);
pao_operator.pao(1, 1);
SetTime(30, 4);
Shovel(1, 1);

上述代码形成的队列是这样的:

队列名队列内容
队列1 第1波(-200 pao) (1000 card)
队列2 第2波(-100 pao)
队列3 第3波
队列4 第4波(30 shovel)

在经过上述三个步骤后,我们得到了一个脚本对应的队列, 这里需要说明的一点是,队列的形成是在注入完成之后进入选卡界面的一瞬间完成的,即没有其他框架"阻塞"这一过程,在得到这些队列后,就可以进行"执行"这个步骤了 ,下面对这个步骤进行详细的说明。

执行(假设游戏总波数为 20)

首先,队列里面的操作执行是有条件的,条件就是对应波数的僵尸刷新时间点被记录了下来。AvZ 将每帧对这 20 条队列逐一扫描,如果对应波数的僵尸刷新时间点未知,队列里面的操作将不会执行,当 AvZ 读取到相应波数的刷新时间点之后,队列里面的操作将会有机会执行,那队列里面的操作到底在什么时候执行呢?答案是时间点到达时执行。例如上面的队列,在游戏一开始时,我们都知道游戏时间为 (-599,1),当然这个时候 AvZ 也必然读取到了第一波的刷新时间点,这个时候 AvZ 将会读取第一个队列的队头,看时间点是否到了,如果到了将会执行对应的操作,如果没到,将不会执行操作,并且会进入下一个队列里,这个时候,AvZ 判断第二个队列对应波数的僵尸刷新时间点是否被读取了,很明显在 (-599,1) 这个时间点第二波的刷新时间点必然读不到,所以第二个队列中的操作 AvZ 连看都不会看一眼直接略过,然后进入第三条队列,显然第二条队列的刷新时间点都未知,所以第三个队列也必然直接会略过,AvZ 重复 20 遍这个过程,完成一帧的所有工作。注意,这里说明的是只要对应波数的刷新时间点读取到了,AvZ 将会对队列的队头进行时间点是否到达的判断,即使现在波数已经刷到第十波了,AvZ 依然会判断第一个队列的队头时间点是否到达,如果时间点到达,就会执行第一波的操作。

继续说明上述队列的执行过程,当(-200,1)这个时间点到达之后,AvZ 将会执行 pao 这个操作,并且在执行完这个操作后,队列将会变成下面的内容

队列名队列内容
队列1 第1波(1000 card)
队列2 第2波(-100 pao)
队列3 第3波
队列4 第4波(30 shovel)

由于每一波的操作储存在不同的队列里,因此跨波的操作将不会互相产生影响,每一波之间的操作是并行独立的,即使第一波有一个操作的时间点是刷新后 10000cs 后,也完全不会影响其他波操作的执行。

上一篇 出怪设置与女仆秘籍

目录

下一篇 阻塞函数