第一章:更新与事件
1 更新理论
(更新理论部分可能有点抽象,建议对游戏有部分理解后再来看。当然,如果你尝试通过本文初学红石,建议认真看完本章,我也尽量将本章写的通俗易懂些)
「广义的方块更新(Block Update)是指方块发生一些变化时工作的一游戏机制。游戏受计算机的计算能力限制,不能随时处理所有方块,因此需要方块更新这样的机制。当一个方块因实体或区块刻等原因发生变化,它通知附近的方块它们应检查它们需不需要响应。 ----Minecraft WIKI」
更新是世界运行的基本,是 MC 的本质。搞懂更新对于红石研究是必要的。更新理论核心为两个部分:更新引起了事件,事件带来新的更新。在接下来的文本中,将会讲述前面提到的两个名词“更新”和“事件”的含义,以及二者的关系。
1.1 方块更新理论的世界观
试想一下,假如MC 要时刻检查所有的方块,MC的世界中有这么多方块,运行效率会非常低。那怎么办呢?
聪( 每)明(亩)的 Mojang 想到了一个办法:引入更新和事件。事件即改变,只有需要“改变的”才会被计算。引起事件的是更新,是改变的最初动力。
举一个简单的例子进行解释:当我们挖下草方块时,草爆炸了。
草怎么知道它该炸了?我们做出如下假设A:
MC 计算了所有方块,计算到草的时候草检查了一下自己有没有附着方块,发现没有,于是爆炸。
如果MC每时每刻都要计算所有的方块,那实在是太慢了,也太卡了,于是我们否定这个假设,并做出以下的假设B:
被挖掉的草方块告诉了草:你该炸了
这种情况下,MC 只要运算被挖掉的泥土,以及被泥土“更新”的草。此处,泥土的破坏,以及草的破坏,都是事件,而草的破坏事件由泥土的破坏事件引起,即:
泥土破坏事件>>产生的更新更新了草>>草的破坏事件
改变即事件,只有需要“改变的”才会被计算。引起事件的是更新,是改变的最初动力。
1.2更新引起了事件
承接上文的例子,让我们思考这样一个问题:
草方块到底告诉了草多少信息?或者说,更新的内容是什么?
我们最直观的理解是:泥土告诉草:你应该爆炸,于是草爆炸了。
来看新的例子:玩家破坏木头后,按钮会掉落。
根据草的例子类推,是木头告诉按钮:你该掉了,于是按钮掉了。
但我们必须思考这样一个问题:如果是木头告诉按钮,按钮应当掉落,那么木头怎么知道这边有个按钮?草必定位于方块上方,但按钮可以附着在木头的任意一面。
相比于开拓新的空间记录这个关联关系,不如在木头被破坏的时候把六个面都更新一下,这样更方便
对于 MC 世界中的更新,除了玩家直接交互的,基本不会是点对点的关系,都是有一定范围的。这个范围内的方块会按照更新种类,按照一定顺序或随机的被更新。
更新种类?更新还有不同的种类吗?我们已经知道能让草和按钮爆炸的更新,若是世界按照此规律运行,应当还有让门打开的更新、让树叶掉落的更新、让耕地湿润的更新,很多很多种更新!
这么多种更新,如果每一个情况都是一种不同的更新的话,匹配起来也太繁琐了吧!
所以,何不让更新仅仅作为一个更新呢?
相比于泥土告诉草应当爆炸,木头告诉按钮应当爆炸。何不是泥土仅仅通知了一下草,草自己检查了一下发现自己没有附着方块了,于是爆炸。按钮同理。
所以我们现在可以回答本节提出的第一个问题,更新的内容是什么?
更新仅仅作为事件的引起者,被 Mojang 使用着。泥土被破坏了之后,按照顺序遍历了周围的六个方块,给每个方块都丢了一个更新。草接收到了更新,引起了接收到该更新应当执行的事件,对于草而言仅有自检事件,在该事件之中,按预先设定好的程序进行检查。检查发现附着方块没了,于是爆炸。
泥土告诉草的仅有一句话:你知道你该干嘛
___________________________________________________________________________________________________________________
当然,mc中不只有一种更新,虽然其内容都是一样的,区别在于什么时候发出,和接收后用于干什么上。
MC 存在两种更新:NC 更新(NeighborChange) 和 PP 更新(PostPlacement) 。
对于 PP 更新,在官方反混淆表的命名是这样的:updateShape,形状更新,个人认为PostPlacement 更易理解,但在下文中依旧保持 PP 更新指代形状更新。
我们讨论几种会产生 NC 更新的情况,和几种接受 NC 更新后的可能情况,NC 更新也有一个别称,对应形状更新被称作方块更新 blockupdate
方块的破坏与放置、按钮按下等,都会产生 NC 更新,在 MC 之中,产生 NC 更新的情况数不胜数。
而门在按钮按下后打开、草在附着方块破坏后也随之破坏,是对 NC 更新的响应而执行的事件。
接下来讨论 PP,注意 PP 更新与 NC 更新独立产生,并非对立关系,但游戏顺序上先进行 NC更新的产生,相应的也是先执行响应 NC 更新的方块所产生的事件。随后产生PP更新,执行响应PP更新的事件...
常见的产生 PP 更新的有墙和玻璃板的附着、活版门和门的开关
而玻璃板附着到开启的活版门上就是对 PP 更新的响应而执行的事件。
如果想搞清楚产生的到底是 NC 还是 PP 更新,查表是很不现实的,一般采取实验方式,比如下图中的BUD装置(Block Update Detector)
它只会相应NC更新而不会相应PP更新,我们暂时不知道它的原理,但这不影响我们用它区分NC和PP更新。希望读者也能进行一些尝试,什么样的变化会让活塞伸出?当你试多了就逐渐能理解 NC和 PP 的不同之处了。
更新引起事件,换言之,没有更新就没有事件
1.3事件产生了新的更新
在 BUD 装置的红石块上附着按钮,随后放置方块使他伸出。显然,按钮掉落了。
这就是事件产生了新的更新,在这里,原木放置产生更新,引出粘性活塞伸出事件,随后这一事件又产生了新的更新让按钮掉落。
这个链条将会穷尽所有应当随之而变的事物。既然是要穷尽,就会有顺序和范围。更新的顺序,事件执行的顺序以及更新的范围,我们慢慢讨论。
1.3.1更新顺序
首先,对于已创建的相同类型的事件,自然是先创建先执行的。比如一个原木六面都附着了按钮,那么当原木破坏的事件执行,先被更新到的按钮就先爆炸。
可以发现,在此情况下,事件执行的顺序取决于更新的顺序,那么更新的顺序如何呢?
对于 NC 更新,其顺序为-x +x -y +y -z +z,或西东下上北南。
所以根据更新顺序,西边的按钮最先掉落。然后南边的按钮最后。
对于 PP 更新,其顺序有一点不同,其为-x +x -z +z -y +y,或西东北南下上。
1.3.2 更新范围
前文中讨论的产生 NC 更新的物品基本都只对其相邻的六个方块发出了更新,这种范围我们称为"一阶毗邻"。毗邻,即邻居,与该方块相连,一阶毗邻就是直接相连的六个方块。相应的也有二阶毗邻,即一阶毗邻的一阶毗邻。
图示为二维化的示意图,实际上应有六个方向,请读者自行补全。图中橙色方块的一阶毗邻方块
为蓝色,二阶毗邻方块为红色。
对于常见方块的破坏与放置等等,其产生的更新范围为一阶毗邻。也有产生二阶毗邻或部分二阶
毗邻的更新,比如红石粉产生的是二阶毗邻更新,而红石火把产生的是自身的一阶毗邻更新和上方及下方一个方块的一阶毗邻更新。更有产生更新不以自身为中心的,比如中继器、比较器、侦测器对所指方块以及其一阶毗邻发出 NC 更新。
有些更新引起的事件会被立即处理,被称为瞬时事件,此时更新后立刻进入事件的执行。比如上文中的草被破坏,是泥土更新草后立即执行的,是瞬时事件。对于六个面都附着了按钮的原木也是一样,按钮的破坏事件也是瞬时执行的,实际上的顺序是:原木破坏->原木向西(-x)发出NC更新->西边的按钮检查,发现自己应当爆炸->西边的按钮爆炸->原木向东(+x)发出NC更新->东边的按钮检查,发现自己应当爆炸->东边的按钮爆炸->原木向下(-y)......->原木向六个面都发完了NC更新,随后发PP更新->什么都没有发生->
有些不是瞬时事件,会在特定时间后的特定阶段执行。
比如上文中的按钮的熄灭。当按下按钮后,将会计划一个一定时间后熄灭的事件,这个事件并不是瞬时执行的。这部分仅粗略讲述了更新顺序和更新范围,其中关于瞬时/非瞬时事件将在游戏运行顺序之后进
行讲解,若想更多了解请参考 Fallen 所著 https://www.bilibili.com/read/cv4565671
第二章:红石元件基础
1充能
MC中的大部分原件仅有两种状态:激活/未激活。比如对于门而言,按下按钮后,门打开了(被激活),按钮时间过了之后,门又关上(未被激活)。
来看以下例子:
插上红石火把,你观察到了什么?红石火把连接着的红石粉变亮了,同时红石粉连接的红石中继器和红石比较器也亮了。此时,他们的状态就是被激活的状态。
将亮起的比较器连接到门上,你观察到了什么?门打开了。让比较器灭掉呢?门又关闭了。在这里,比较器让门变成了激活状态,我们说是比较器充能了门,使门激活了。
当然,为了保证不留下一个具有误导性的初印象,希望大家记住一点:存在充能但充能对象并没
有在充能的同时激活的情况。还记得更新理论中提到的一句话吗?没有更新就没有事件。如果我们能够使得其被充能却没有被更新,就可以让充能和激活异步。当然听不懂没关系,只是希望大家有这么一个初印象:
充能和激活可以是异步的,充能仅仅只是必要条件
还有什么原件可以对亮起的红石粉产生响应?
还有什么原件可以让红石粉亮起?
请读者自行探索一下。
最后,你发现红石块也可以点亮红石粉了吗?你能够说出那些原件可以点亮红石粉了吗?试着使用压力板将家门做成自动开关的吧!
1.1可充能方块与不可充能方块
MC中的所有方块分为可充能方块和不可充能方块(常被称为实体方块与透明方块)。对于方块而言,其实并没有“是否被充能”这一状态,实际上方块是否充能是由信号的使用者,比如被点亮的灯或打开的门,收到更新后自行检查是否有红石信号充能了自己,自然,也包括那些通过充能方块的充能。
但,对于一般的赤石设计或研究并不需要如此深究,一般可将是否被充能当作方块的状态。
有一种通俗的区分可充能方块和不可充能方块的方法。能切断线路即为可充能。当一种方块被放置在高度不同的两格红石粉之间时(如下图) ,若两条线路不再相连,即线路被切断了。当我们使用可充能方块切断红石粉的连接时,称两个红石粉被压线。
注:此处的透明并不是物理意义上的透明,而是红石信号方面的透明——传导不了也阻挡不了信号。例如平滑石头台阶在物理意义上不透明,但是传导不了红石信号,且不会切断线路(如下图)
另一种辨别是否可充能方块的思路是:用已充能的红石中继器或红石比较器(后文会提到)对准这个方块,再在另一边引出线路观察是否有信号。如果成功引出信号(红石粉被点亮)则为可充能方块(实体方块)。没有信号则是不可充能方块(透明方块)。
1.2强充能与弱充能
当可充能方块被红石元件充能时,有强充能和弱充能两种情况。一种简单区分强充能和弱充能的方法: 在该方块周围放上红石粉,若红石粉能被直接点亮,则称该方块被强充能。若红石粉无法被直接点亮,但可以激活中继器或者使火把熄灭,则称该方块被弱充能。若都无法引出信号,则该方块没有被充能。需要注意的是,无论强充能还是弱充能,都可以直接充能活塞和中继器,比较器等元件。
常见的强充能方式:侦测器,中继器,比较器对着方块输出以及红石火把顶部对着方块
常见的弱充能方式:指向该方块的红石粉或是被红石粉覆盖。
不可充能方块也有一些特殊性质。若其上表面可以被放置红石粉(以玻璃为例)上一级的红石粉被点亮时,下一级的红石粉不会被点亮(不论是否被压线)。反过来,下一级的红石粉被点亮,在没有被压线的情况下上一级的红石粉仍然能被点亮。(迫真二极管)
2. 红石粉
当你在创造模式打开背包,选中红石类物品时,第一个便是红石。我们一般称其为红石粉(Redstone Dust)
观察上一节的图中的红石粉,其上有0-15的数字,它们标识了这一格红石粉的能量等级红石粉具有十六等级的能量等级,当其能量大于1的时候称为激活状态。被红石中继器、红石火把、红石块或拉杆、按钮等直接充能激活的红石粉具有15的信号强度。
红石粉将会传递其能量给与之相连的红石粉,每传递一格,能量将降低一格。
2.1红石粉的更新
前文中我们提到,部分方块状态改变时,会产生NC更新,且一般更新范围为一阶毗邻。但读者
若有观看红石装置的经验,再随我一同思考一个情况:如图所示,拉下拉杆后,方块后的门会打
开吗?
如果红石粉是一阶毗邻更新,门将收不到红石粉发出的更新,也就不会被MC所运算,也就不会
打开了。但实际上门是会打开的,因此红石粉的更新范围并非一阶毗邻,而是比一阶毗邻大一圈
的二阶毗邻,这是为了能够更新到充能方块之后的东西。
你也许会疑惑,为什么诸多玩家执着于无粉。(然而这可能是内卷现状)不可否认,使用红石粉
布线会使线路直观明了,非常容易对齐时序。
上图中,当红石粉亮起,会发出42次更新,但熄灭时,会发出足足630次更新*。这是一个相当庞大的计算量,因此闪烁的红石粉也是MC中最大的卡顿来源之一。如图为一个庞大的红石粉矩阵,多堆
叠几层就会产生强大的卡服效果(注意,当只有单个红石粉或者红石粉在爬透明方块时不会如此
反复更新)
*递归更新及DFS导致的,熄灭更新次数根据位置和布线不同也会不同(见第三章)
2.1红石粉对更新的相应(事件)
红石粉几乎仅对 NC 更新进行响应,即使是判断自身位置是否合法也是通过 NC 更新进行的。对于 PP 更新,红石粉接受上方和四周的 PP 更新用来更新与相邻红石粉的被实体方块压线/连接状态当红石粉受到 NC 更新时,它会计算不考虑自己时它能达到的信号强度,如果不同,则进行更新。红石粉将会在其位置发出 NC 更新,并在于其毗邻的 6 个方块的位置上发出 NC 更新,总共有 7 个位置将会发出 NC 更新。这七个位置的更新顺序并不是固定的,游戏会将这 7 个位置存入一个哈希表并导出成列表,随后逐个读取列表里的位置进行发出 NC 更新。(因此红石粉的更新顺序是无序的)
( 本 段 内 容 全 部 来 自 Fallen_Breath 专 栏 深 度 剖 析 Minecraft #2 方 块 更 新
https://b23.tv/nLvishI))
2.1红石粉主要性质
当一格红石粉单独被放在其他方块上,且周围没有其他引导红石粉方向的元件或方块时,我们观察到这种红石粉默认为十字(此特性在1.16加入,本文若无特殊交代,默认基于JAVAEdition1.18.2)。当我们不按住shift右键红石时,观察到红石粉由十字型变为了点状。在1.16快照更新前,点状红石可以弱充能除上方以外周围的方块。1.16快照后只能弱充能底部的方块。(注:若没有特别标注,方块均指代可充能方块)同时,十字型红石替代了原有的点状红石,可以弱充能除上方以外的周围方块。
·红石粉总共有16种能量状态,除能量强度=0时无法充能其他元件,其余均可。红石粉每距离“能量源”多一格,能量便会降低一个等级。
·红石粉的指向非常重要(如下图)
·当红石粉的指向方向转变时,会发出PP更新,且有时具有方向性。转向粉能提供3gt脉冲,在0t中非常重要,将在后期讲解。
·按钮,侦测器,红石块,绊线钩,讲台,标靶,避雷针等方块均可以引导红石粉的方向。
·20w18a之前,放在压线位上可响应红石信号的透明方块不会响应。该版本后,以这种方
式“指向”的也会被激活了(图示为1.20.1版本)
拓展部分:
如果您已经有一些基础,不妨看看以下内容。
· 红石粉激活周围红石元件时,周围红石元件也有一定的激活顺序,这个遍历顺序与PP/NC更
新顺序一致。
·MC在计算更新时使用的遍历算法非常繁琐且艰深,可以粗略理解为DFS(深度优先搜索)
· 当红石粉从15-0熄灭时,会以15,13,11…这样的顺序逐步降低强度(这个更新将在一个
gt内完成以至于察觉不到),每次降低均会发出更新(注意,当只有单个红石粉或者红石粉
在爬透明方块时不会如此反复更新)。可以用一大层树叶来模拟红石粉,当仅有的一个原木
被移除后,树叶所记录的距离树的距离将按同样的逻辑逐渐增加,且其并不是“瞬间”完成
的,因此可以使用tick freeze进行观察。
第三章:计划刻与计划刻元件
1. 游戏刻
「由于游戏不能时刻都在计算而消耗资源,所以游戏刻执行一次后线程会进行休眠,等待下一次执行,从而维持一秒内游戏刻的执行次数相等且均匀。通常情况下,每秒最多运行20次游戏刻,即从这一游戏刻开始执行到下一游戏刻执行的时间间隔为0.05秒。如果这次游戏刻计算时间小于两个游戏刻的时间间隔,则会进行休眠直到下一游戏刻的执行。
-----节选自Minecraft Wiki」
Minecraft的绝大多数计算逻辑都在一个游戏循环内执行,执行一次这个循环就被称为执行了一次游戏刻(Game Tick),作为单位时缩写为gt。GameTick是MC的时基,其地位相当于现实世界中的秒。在TPS等于20(正常情况下的TPS都是20)时,游戏刻执行周期为0.05s,此情况下将Gametick用作计时,可以认为1gt=0.05s。但对于红石系统的设计上,一般不考虑换算为现实时间,因为意义不大。
2. 计划刻元件
我们在这里不严谨的定义红石中继器(Redstone Repeater),红石比较器(RedstoneComparator),侦测器(Observer)和红石火把(Redstone Torch)四种元件的集合为计划刻元件,稍后会依次解释这4种元件的作用。
这四种元件的输出端都可以改变红石线指向,比较器,中继器的输入端也可以改变红石线指向。
3. 红石中继器
3.1中继器的作用
输入任意大于0的信号,延迟2-8gt输出15,取决于中继器档位。熄灭同理。
3.2中继器的固有属性和特性
中继器的爆炸抗性为0,硬度为0(即可以空手秒破)。中继器不能被粘液块或蜂蜜块粘动,同时它也是附着型方块。中继器可以放在上表面完整的方块上,如堆肥桶,漏斗等。当中继器的附着方块被移动或破坏,或者有水流流过,或有活塞/粘性活塞试图破坏它,中继器都会被破坏并掉落其本身。中继器的碰撞箱为1*0.125*1(即1/8方块高度,即2个像素)。
·中继器产生的更新范围为指向的一阶毗邻及指向方块本身和本体一格的pp一阶毗邻更新。
·中继器接受NC更新时,会检查自身工作状态是否正确,若不正确则改变自身状态。
·中继器接受PP更新无响应(不接受PP更新)。
·当中继器的侧面有其他中继器/比较器的输入时,中继器会被锁住:此时无论其输入如何变化,都不会改变其输出,直到其侧面的输入被取消。
4. 红石比较器
4.1红石比较器的作用
输入:比较器接受长度为2gt以上的信号,当输入信号低于2gt时比较器不做出反应。比较器总是有2gt延迟。
保持信号强度:若侧面无任何输入,输出的强度为输入端输入的信号强度, 例如输入5输出5,输入14输出14,与中继器的永远输出15不同。
检测方块及实体:比较器检测方块时优先检测方块状态或方块内部物品,而且作为输入信号进行输出。与被检测方块相隔一个实体方块仍可进行检测。但如果此实体方块被充能至强度15时比较器会输出15强度的信号而不是检测信号。(以上两句话详情可以看稍后“容器屏蔽”部分)如果箱子被实体方块或猫覆盖处于无法打开状态则输出强度0的信号。如图,从下到上分别表示空容器、未装满的容器、已装满的容器。
再如图,即使容器里有东西但是容器被遮挡,依然无法输出信号。
「检测输出强度算法为:
信号强度=向下取整[1 + (所有槽位的满度之和 / 槽位总数) × 14]
一个槽位的满度 = 该槽位的物品数 / 此类物品最大堆叠数
例:发射器(共9个槽位)中有300个物品,这种物品最大堆叠至64,产生信号强度为8:
1 + ((300物品 / 64最大堆叠数) / 9个槽位) × 14 = 8.292,向下取整得8。
不可堆叠的物品总被认为充满一个槽位(1物品,1最大堆叠数:1 / 1 = 1.0),最多堆叠到16的物品(例如末影珍珠、雪球或鸡蛋)也类似地看作16,即为充满。
此段摘抄自Minecraft WIKI 」
同时,比较器所对的方块会被强充能。
此外,比较器检测容器时还有7种情况:
·检测堆肥桶:输出堆肥等级(ps:蛋糕堆肥100%堆一层,其他食物可能堆肥失败)。
·检测炼药锅:输出炼药锅内水瓶数量。
·检测末地传送门框架:有眼15 无眼0。
·检测蛋糕:输出还能吃的蛋糕口数*2。
·检测唱片机:输出唱片在创造模式物品栏中的顺序
·检测可储物的矿车:需用探测铁轨检测,输出同普通容器。
·检测物品展示框:输出与展示框内物品旋转角度有关。
比较器有两种模式:比较模式和减法模式
比较模式:当输出端杆子为灭时,比较器当前状态为比较模式。比较模式的信号输出受侧面影响。
当侧面输入信号大于正面输入信号时不输出信号
当侧面输入信号小于或等于正面输入信号时输出正面输入信号
例如:正面输入3,侧面输入4 (侧面输入大于正面输入) 输出0 ; 正面输入7侧面输入2(正面输入
大于侧面输入)输出正面输入即7。
当两个侧面都有输入时选择信号更强的进行比较。
作差模式(减法模式): 当输出端杆子为亮时,比较器当前状态为作差模式,作差模式的信号输出
受侧面影响。
输出的信号为正面输入减去侧面输入,最小输出信号为0。
例如:正面输入15侧面输入7 (15-7=8)输出为8;正面输入 7侧面输入9(7-9=-2,最小输出为0)
输出为0。
当两个侧面都有输入时选择 信号更强 的作差。
CUD(Comparator Update Detector)比较器更新感应器(又称TEUD等),与BUD类似。实际上可以粗略理解为处于BUD态的比较器,制出CUD的方式很多,以压箱为例,上面说过当箱子上方存在实体方块或猫时输出为0,在比较器检测有物品箱子时在箱子上方放实体方块,会发现比较器仍然输出信号。此时的比较器处于BUD态,可以称为CUD。CUD可以检测BUD无法检测的变化。CUD的检测范围是一阶毗邻范围+如果侧面有实体方块则再向外延伸一格。上下两格的范围仅可检测NC更新(方块更新)除了这两格的其他范围可检测方块更新、数据值更新和实体附加值更新。例如在CUD侧面放个箱子,在里面放入或取出物品会触发CUD。可检测的东西很多,例如探测铁轨上出现实体,向唱片机放入唱片等。
容器屏蔽:比较器间隔一个充能等级为n(0<n<16)的可充能方块比较一个输出等级为m的容器,
则它输出m {0≤n<15} 或 15 {n=15}。如图,箱子内已经装了三分之二的容量。
CUD和容器屏蔽在储电中应用很广,前者检测容器内物品流动,后者用于满检或15信号过滤。
4.2红石比较器的固有属性和特性
比较器的爆炸抗性为0,硬度为0(即可以空手秒破)。比较器不能被粘液块或蜂蜜块粘动,为附着型方块。比较器可以放在上表面完整的方块上,如堆肥桶,漏斗等。当比较器的附着方块被移动或破坏,或者有水流流过,或有活塞/粘性活塞试图破坏它,比较器都会被破坏并掉落其本身。比较器的碰撞箱为1*0.125*1(即1/8方块高度,即2个像素)。
比较器产生的更新范围为指向及指向的一阶毗邻范围的NC更新和本体一格的PP一阶毗邻更新。
比较器不接受PP更新,接受NC更新时,会检查自身工作状态是否正确,若不正确则改变自身状态。
当比较器模式被调整时,只会发出NC更新。
5. 红石火把
5.1红石火把的作用
输出:红石火把可以充能其除其附着方块外一阶毗邻的可接受红石输入的方块(如红石粉,活塞,红石灯,投掷器,比较器,中继器,栅栏门,活版门,动力铁轨,激活铁轨,门,音符盒等),但不能充能其除上方外一阶毗邻的方块(无论以弱充能或强充能)
输入:当红石火把的附着方块被充能时,红石火把会在2gt后熄灭。(实际操作中大概率是3gt,详情见第二章)也就是说,红石火把是一种可以反相的红石元件,逻辑电路中常用作非门。在熄灭状态下,红石火把不会输出红石信号。当红石火把被放置/破坏/状态改变时,会发出除附着方块外所有方向的二阶毗邻NC更新,和一阶毗邻的PP更新。
红石火把接受PP更新时,会检查自身附着状态,若附着状态不合法,则被破坏并掉落。接受NC更新时,会检查自身工作状态是否正确,若不正确则改变自身状态(熄灭/亮起)。
PS:红石火把亮度7,熄灭和亮起时会产生光照变化,可以在其周围放置光源以减少光照卡顿,不过1.20更新了光照算法,这点卡顿忽略不计即可。
红石火把附着方块被8gt周期的信号充能时可能常灭,十分不稳定。
5.2红石火把的固有属性和特性
红石火把是非固体,附着性方块,爆炸抗性为0,硬度为0(即可以空手秒破)。不能被粘液块或蜂蜜块粘动,红石火把可以放在上表面中心完整的方块上方(如栅栏,玻璃板)或侧面完整的方块侧面(如玻璃)。当红石火把的附着方块被移动或破坏,或者有水流流过,或有活塞/粘性活塞试图破坏它,红石火把都会被破坏并掉落其本身。
6. 侦测器
6.1侦测器的作用
本章只讨论侦测器在宏观时序下的行为。
侦测器的侦测面接受PP更新,当接受PP更新时延迟2gt发出2gt脉冲红石信号,侦测器会强充能指向实体方块。侦测器在亮起时由B36(被推动的方块)转化为侦测器无更新。(会在第四章提及原因)
侦测器在输出红石信号时,会发出在指向及指向一阶毗邻位置的NC更新,和自身和自身一阶毗邻的PP更新。
侦测器接受NC更新,当接受NC更新时,会检查自身工作状态是否正确。
6.2侦测器的固有属性和特性
侦测器是固体方块,碰撞箱完整,硬度为3,爆炸抗性为3,透明方块,可被活塞推动,
可以被粘液块或蜂蜜快拉动。侦测器无需附着于任何方块,可悬空放置。
7. 微时序初步
在JAVA版,每个游戏刻中不同类型的游戏个体运算都有固定的次序,而这个固定的次序被称为
微时序。
在本章中,我们仅讨论经过简化的微时序,包括四个阶段:
计划刻(Tile Tick,又称Next Tick Entry),简称TT(NTE)。前文提到的计划刻元件会在此阶段改变状态
方块事件(Block Event),简称BE。活塞在该阶段改变自身状态
方块实体(Tile Event),简称TE。此时b36,漏斗等方块实体在此处进行运算
玩家操作(Network Update),简称NU。
执行顺序为:TT-BE-TE-NU
8. 难点:NTE(计划刻阶段)
计划刻元件将会在NTE阶段添加和执行计划刻事件。如:
玩家在第0gt时拉下拉杆
0gt NU 玩家拉下拉杆
0gt NTE 中继器添加2gt后亮起的计划刻事件
2gt NTE 中继器执行亮起的计划刻事件,比较器添加2gt后亮起的计划刻事件
4gt NTE 比较器检查信号输入时长并执行亮起的计划刻事件,同时瞬时元件红石灯亮
由此可见,计划刻元件会在被激活后,会计划接下来要做的事(计划刻事件),并在NTE阶段执行计划刻事件。
计划刻元件添加计划事件时,会将其写入一个队列(具体是什么你不需要知道),同一gt内计划刻元件讲计划刻事件写入队列的规则如下:
·不同优先级的计划刻元件添加事件时,按优先级的大小低的先写入队列
·相同优先级的计划刻元件添加事件时,按添加事件的先后写入队列
优先级如下:
·红石火把和侦测器任何时候优先级都是0
·比较器优先级0,当比较器指向一个中继器时优先级变为-1
·中继器添加亮起的计划刻事件时优先级-1,添加熄灭的计划课事件时优先级-2,当其指向另外一个中继器时优先级-3
游戏在执行计划刻事件的时候会按进入队列的先后顺序执行,先进的先执行,后进的后执行。执行不同元件的NTE事件时,会将一种元件的事件先执行完,再执行下一种元件。
尝试自己解释下图:
这些都是不同优先级导致的,关于比较器还有以下情况:
0gt NU 玩家右键音符盒 音符盒产生PP更新
0gt NU 优先级0 侦测器检测到PP更新 添加2gt后亮起的计划刻事件
2gt NTE 优先级0 侦测器亮起,并NC更新比较器
2gt NTE 优先级0 比较器检测到信号输入,添加2gt后亮起的事件
4gt NTE 优先级0 侦测器执行熄灭的事件
4gt NTE 优先级0 比较器将要执行亮起的事件,先检测信号输入时长,此时信号已经没了,因为比较器不接受2gt内的信号,所以取消了亮起的事件,此事件不会被执行
侦测器和比较器优先级相同,但是侦测器先添加了熄灭的事件,比较器后添加了亮起的事件,在同一gt内执行时,侦测器先熄灭,比较器后准备亮起。比较器不接受2gt内的信号,此时信号已经没了,说明信号不够2gt,所以取消了亮起的事件。
同时我们也知道了:比较器在输入信号不够2gt时会取消亮起的事件。
再看以下例子:
0gt NTE 优先级0 比较器检测到PP更新,添加2gt后亮起的事件
2gt NTE 优先级-1 比较器添加2gt后亮起的事件
2gt NTE 优先级0 侦测器执行亮起的事件
4gt NTE 优先级-1 比较器将要执行亮起的事件,检测输入时长,此时侦测器还没熄灭,信号还在,它就认为信号达到了2gt,所以执行了亮起的事件。
4gt NTE 优先级-1 中继器添加2gt后亮起的事件
4gt NTE 优先级0 侦测器执行熄灭的事件,并NC更新比较器
4gt NTE 优先级-1 比较器添加2gt后熄灭的事件
6gt NTE 优先级-1 中继器添加2gt后熄灭的事件
6gt NTE 优先级-1 比较器熄灭,并NC更新中继器
6gt NTE 优先级-1 中继器添加2gt后熄灭的事件
8gt NTE 优先级-2 中继器执行熄灭的事件
比较器接了中继器后优先级>侦测器,所以侦测器熄灭在比较器执行事件和检查输入时长之后,所以比较器亮起了。
继续分析下一个例子:
此例请自己分析时序(提示:红石火把也不接受2gt内的信号)
再来!
本节课完
部分内容参考自《某种红石教科书吧》已征得作者同意
配图/码字/排版:Lirrum
最终解释权归Lirrum及教材编写组所有
未经允许不得复制粘贴,侵权必究