10-22 1,535 views
作者:nenn(百度id:正正正正正好)
注1:本文中提到的所有Minecraft版本均为15w43a。
注2:禁庄转。
1.9将对命令方块(Command Block,下简称CB)进行彻头彻尾的改变。CB不再依赖红石进行驱动,而是可以自驱动或是通过其他CB驱动,这促成了CB系统的独立。独立的CB系统同时带来了许许多多的问题。我们不禁要问,CB系统的驱动方式和使用红石的驱动方式在效果上是否完全相同?两者之间的优势是否可以互补?独立的CB系统能够为我们展现什么以前看不见的图景呢?而这些图景又如何启示红石以及黑石的研究呢?
独立的CB系统
1.9快照15w34a对CB系统进行了大改动,CB可以有3种不同的模式以及6种不同的朝向。此外,还能够设置其是否需要红石激活以及是否需要条件制约,
CB的新特征
3种模式
3种模式表示了CB被激活后呈现出的三种不同的工作状态,不同模式的CB会呈现不同颜色:
1)【卡其色】单次模式(Impulse_Command_Block,下简称ICB):CB被激活时执行一次其中的命令。id:137
2)【孔雀绿】连锁模式(Chain_Command_Block,下简称CCB):CB被激活后,指向它的其他CB执行命令后其才会执行命令。id:210
3)【基佬紫】重复模式(Repeat_Command_Block,下简称RCB):CB被激活后,每游戏刻(gametick,下简称gt)都会执行命令。id:211
6种朝向
6种朝向则类似活塞、发射器、投掷器等方块的朝向,其决定了CB感应其他条件制约的CB。
红石控制(默认)/保持开启
红石控制(Need Redstone):只有当CB如其他红石机械般被驱动时才会执行命令
保持开启(Always Active):ICB会在设置命令后执行一次命令,之后将不能再被激活;CCB会在感应后直接执行命令;RCB每gt都会执行命令
不受制约(默认)/条件制约
不受制约(Unconditional):忽略后方的CB
条件制约(Conditional):只有后方的CB成功执行命令后才会执行命令。
CB的获得和设置
获得默认CB,然后右键进行设置
可以输入:
/give @p minecraft:command_block
得到CB后将其放置在所需的位置,然后右键CB进行设置。
直接获得所需CB
可以输入:
/give @p minecraft:command_block
/give @p chain_command_block
/give @p repeating_command_block
20Hz时钟信号发生器
仅仅看到20Hz的时钟信号,一般的玩家可能没有概念,那么这里我就提供一个参考。常见的比较器高频时钟信号大概是多少Hz呢?5Hz。
在1.7中,使用如下代码可以实现20Hz的高频时钟信号发生器。详见《[教程] MC1.7:指令方块做极速脉冲教程》
/summon FallingSand ~ ~1 ~ {Tile:152}
但是1.8后,该方案不再能产生20Hz的时钟信号。取而代之信号的则是:
可以看到,虽然信号依旧为周期性脉冲信号,但其不再是时钟信号。
chyx(MCBBS账号:chyx 百度id:让他该人士说)和gp(百度id:Gamepiaynmo)指出在1.8中可以将FallingSand设置在非整数高度,因此在1.8及以后的版本中可以使用如下代码:
/summon FallingSand ~ ~0.5 ~ {Tile:152}
基于CB系统的20Hz时钟信号发生器
在15w43a中,为了能够使得cb产生20Hz的高频时钟信号,我们可以使用下面的方法。
RCB(蓝色羊毛下方的CB)是时钟信号的源泉。其代码为:
/setblock ~2 ~ ~ redstone_block
CCB(绿色羊毛下方的CB)则是为了帮助RCB实现红石线方式的输出。其代码为:
/setblock ~1 ~ ~ air
ICB(橙色羊毛下方的CB)是为了检测其时钟信号的频率。其代码为:
/time query gametime
根据显示的游戏刻数,我们很容易判断RCB和CCB组成的带有红石线输出的时钟信号发生器能够产生20Hz的时钟信号。值得注意的是,ICB仅仅是为了验证产生的信号是否为20Hz时钟信号,而非信号发生器本身。
基于红石系统的20Hz时钟信号发生器
使用红石来实现同样的效果,对一般红石玩家来说是非常困难的。这是因为实现20Hz的时钟信号必须保证一条红石线在每个游戏刻都能够有一个单脉冲。而使用红石系统在一个游戏刻内刻画上升沿和下降沿固定的顺序是一个技术活。此外,引入单个游戏刻的时间差对于红石系统来说也是比较有技巧的。但是即使如此,20Hz的时钟信号依旧可以通过红石系统来得到。
我们首先需要了解两个常规的黑石知识:0刻脉冲和红石系统中0.5t延时的引入
0刻脉冲
关于0刻脉冲,我们可以参考Wikia关于0刻脉冲的讲解。鉴于原文为英语,为了方便大家更好地理解这个机制,本人对其进行了翻译。详见:《【Wikia解说】0刻脉冲》。这里我们就强调一下0刻脉冲在20Hz时钟信号发生器中的重要性:完全是为了避免红石信号锁住机械元件。Minecraft中所有机械元件的激活都默认了一种逻辑运算:或逻辑。只要激活条件中任意一个得到满足,那么机械将被激活。此时,0t技术对于实现这样的时钟信号发生器就显得尤为重要。
红石系统中0.5t延时的引入
不得不提的就是关于红石系统中各种事件发生的延时。实际上目前由于世界各地玩家使用了多种不同的研究方法以及使用版本等问题,关于延时的相关理论就RMC已知并探讨的有三套。但是对于大多数情况,这些理论都能进行合理的解释,因此这里我们不在深究这些理论是否完备。这里讲仅仅阐述事实:活塞可以给红石系统引入0.5t延时。引入的秘密在于活塞特殊的激活方式。
红色ICB和黄色ICB中的代码都是一样的:
/time query gametime
绿色ICB中的代码分别为:
/say 1gt !
蓝色ICB中的代码分别为:
/say 0gt !
当我们分别拉动绿色ICB和蓝色ICB上面的拉杆时,理应我们会得到两个相同的游戏刻数,但是事实并不是这样。
当拉动绿色ICB上的拉杆时,红色ICB会比黄色ICB晚激活一个游戏刻。而当拉动蓝色ICB上的拉杆时,红色ICB和黄色ICB会在同一个游戏刻激活。正是基于这个事实,我们可以很方便地通过活塞将1游戏刻,也就是0.5红石刻的延时引入红石系统。该机制的发现也使得射速1200/min的纯红石系统的tnt大炮成为可能,而最早将之实现的就是德芙(Defanive),详见:《【视频】【原版】最终版 高速TNT大炮,1200发/分钟》。
20Hz时钟信号发生器的实现
下图中的A即基于0刻脉冲和粘性活塞特性而实现的经典的双边沿无延时中继器,最早由德芙(Defanive)发明。该方案曾出现在德芙的生存直播中,用于无延时弱加载末地门周围5×5的区块以实现末地门所在区块的强加载,最后达到从主世界任意位置瞬间进入末地的效果。我们对这个经典的方案进行改进,使其能够产生一个稳定的长0t脉冲,能够驱动任何机械元件而不会造成元件无法响应的尴尬。这样的改造恰如B所指示的方案,而其可堆叠性也有助于其搭建。
为了更好地进行之后的检测和说明,我们同样会使用ICB进行检测。而根据机械元件的普遍特点和定义,CB被认为是机械元件的一种,而这种认可也被wiki所认可(详见Minecraft Wiki “红石电路”词条)。
如果我们将这样的0刻脉冲发生器用中继器串接起来,那么每过2个游戏刻我们就可以得到1个0刻脉冲。
类似的,我们可以再复制一份一样的0刻脉冲发生器串,然后将它们的起始游戏刻与另一路的起始游戏刻设置相差1游戏刻。那么我们理应能够看到一秒内同一条红石线激活同一个ICB共20次。
试想一下,如果每秒都去拉动那个拉杆,那么ICB是不是就会在每个游戏刻执行一次指令呢?所以我们在拉杆处安装上一个1Hz的时钟信号发生器即可。
用ICB替代RCB
将20Hz时钟信号发生器的输出端与一个ICB相连,那么这整个系统将拥有RCB的效果。
所以问题来了。RCB与使用20Hz时钟信号的ICB,这两者的性能真的是完全相等的吗?
RCB vs ICB(20Hz clock)
RCB的“红石控制(默认)/保持开启”和“不受制约(默认)/条件制约”都能够通过红石和其他CB的配合来实现。这里我们不详细讨论。
但是这两种看似等效的时钟信号发射器并非完全相同。实际上使用纯CB系统无法使得活塞对红石线中的20Hz时钟信号进行响应。只有经过中继器以后,时钟信号才会体现出其周期性振荡的本性。
三种门(门、栅栏门、活板门)的行为也不同。红石系统20Hz时钟信号下,门会处于一直打开的状态;CB系统20Hz时钟信号下,门则会一直处于关闭状态。但是不管是哪种20Hz时钟驱动了它们,它们都嗡嗡作响。充能铁轨、激活铁轨和红石火把的情况也类似门。
那么究竟是什么原因造成了这种区别呢?答案在于输出元件。
红石系统20Hz时钟信号发生器的输出元件是活塞。这是因为0刻脉冲本身是靠活塞的行为形成的。而CB系统20Hz时钟信号发生器的输出元件就是CB本身。输出元件在更新优先级上的差异,在同一个游戏刻内更新时就体现地淋漓尽致。
于是我们就要问了,如果使用CB放置其他红石元件,比如powered_repeater,那么是否能够改变输出元件的优先级,从而达到红石系统20Hz时钟信号发生器的效果呢?
我们分别在下图中的RCB和CCB中输入下面的代码:
RCB中:
/setblock ~3 ~ ~ powered_repeater 1
CCB中:
/setblock ~2 ~ ~ air
结果是,活塞依然没有响应这样的20Hz时钟信号。而将powered_repeater替代成其他红石元件后,结果依然如此。
CB系统的脉冲长度检测器
红石系统的脉冲长度检测器
准确测量单脉冲的脉冲长度(或称脉冲宽度)一直是一个难题。使用红石系统本身的元件对脉冲长度进行测量并非那么简单。首先需要基于某个响应可靠的元件,其次要能够精确识别边沿。上升沿的识别在本人较早的一篇帖子中得到解决:《【元件库】精密时序比较器——关于时序精密描述的实现》(贴吧链接:http://tieba.baidu.com/p/3419179382),其精度达到了1游戏刻。下降沿的识别则异常困难,这主要是由于红石系统难以搭建冷却时间足够短的无延时非门。下降沿的识别最后由Dim_White实现:《【元件库】精密脉冲边沿比较器》,其意义非凡,标志着可以使用红石系统本身来测量脉冲长度,精度达到1游戏刻。
1.8以后,在CB中键入time query gametime并激活CB就可以得到激活CB的游戏刻是该存档建立至今的第几个游戏刻。该命令随后被广泛用于一些黑石技术的验证上。但是使用CB的检测依然存在一些问题。比如,如何保证CB提供的参考就是正确的呢?
实际上至今没有人从源代码的角度去证实CB是一个可靠的标记时间的工具。我们不清楚CB会不会受到更新顺序的影响造成某些时刻的显示错误,也不知道CB会不会也存在1游戏刻的启动延时。所以关于这些问题我就在这里呼吁源码触们解决了。
而我们今天的话题则避开这些不确定的内容,只从事实和现象出发。
CB系统的脉冲长度检测器
CB同样可以帮助测量脉冲长度,这得益于RCB的强大功能。RCB本身相当于一个20Hz的时钟信号发生器。按照RCB的激活方法,若其处于需要红石激活的状态,那么当我给它输入一个n游戏刻长的正脉冲后,其就会执行n次指令。使用该方法可以对一些脉冲的长度进行测量。
但是依照这种方法,某些方案的结论将令我们大吃一惊。例如:
不明来源的0.5t延时。
中继器使得1.5t脉冲整形为1t脉冲而非2t脉冲。
投掷器和漏斗组成的常用脉冲发生器产生的是3.5t脉冲。
1.5t脉冲同样可以使粘性活塞伸长后不拉回方块。
这些结论加深了对RCB测量脉冲长度这种方法的怀疑。但是目前并没有办法证明RCB给出的结论是否可靠。但或许RCB展现的才是真实情况呢?这注定给传统的黑石理论带来不小的冲击。
特别感谢:
好时(百度id:Hershey4)为搭建官网做出的巨大贡献。
Dim White(百度id:滚大幕)提供的redstone_player皮肤。
PM(MCBBS账号:PotatoMaster101)提供的关于CB的教程。
chyx(MCBBS账号:chyx 百度id:让他该人士说)提供的关于1.8中基于CB的20Hz时钟信号发生器。
gp(百度id:Gamepiaynmo)提供的关于1.8中基于CB的20Hz时钟信号发生器。
RMC与CBL平台上参与讨论的各位。
另,关于15w43c的源代码解读以及针对本文提出的相关问题,可详细参阅gp的作品《【1.9】关于快照新版CB系统的源码解读》。
版权属于: Redstone Machinery Communication 红石机械交流促进会
原文地址: http://www.rmcteam.org/cb-system.html
转载时必须以链接形式注明原始出处及本声明。