区块
I used to rule the world 我曾统治这世界
Chunks would load when I gave the word
区块会在我的命令下加载世界听我号令运转——CaptainSparklez《Fallen Kingdom》
区块(Chunk) 作为一个符号,不得不承认,虽然并不总是如此,但它的的确确成为了世界生成乃至世界的象征。无论是否与世界生成有关,在各种场合,区块这个概念总是被经常提及——好像世界就应该这么分一样。确实,世界生成确实也应该从它讲起。
区块生成器
区块生成器(ChunkGenerator),是之前已经提到的,两大非常重要的世界生成提供者之一。
区块生成器分为三种:噪声区块生成器(NoiseChunkGenerator)、平坦区块生成器(FlatChunkGenerator)、调试区块生成器(DebugChunkGenerator)。在这里,我们主要介绍噪声区块生成器。另外两个区块生成器参见第三章。
噪声区块生成器主要负责(不分先后):
- 要塞的选址
- 生物群系的选择
- 应用镂空器
- 特性(包括结构和花)的放置
- 地表和基岩的放置
- 生成原生生物(伴随世界生成产生的生物)
期间与生物群系来源的合作十分紧密。
区块状态
这些功能在区块生成的不同状态时被调用,前作已经有过介绍。1.16 中这些状态被细化成了下面 13 个状态:
状态 | 颜色 | 高度图类别 | 范围 | 等级 |
---|---|---|---|---|
empty | 5526612 | 甲类 | -1 | 44+ |
structure_starts | 10066329 | 甲类 | 0 | 36-43 |
structure_references | 6250897 | 甲类 | 8 | |
biomes | 8434258 | 甲类 | 0 | |
noise | 13750737 | 甲类 | 8 | |
surface | 7497737 | 甲类 | 0 | |
carvers | 7169628 | 甲类 | 0 | |
liquid_carvers | 3159410 | 乙类 | 0 | 35 |
features | 2213376 | 乙类 | 8 | 34 |
light | 13421772 | 乙类 | 1 | |
spawn | 15884384 | 乙类 | 0 | |
heightmaps | 15658734 | 乙类 | 0 | |
full | 16777215 | 乙类 | 0 | 33- |
区块状态仍然分为两类,只有最后一个状态是存档区级(Level Chunk) 用于正常的游戏逻辑,而前面的状态都是原型区块(Proto Chunk) 专用于世界生成。
高度图类型分为两种,决定了出于当前状态下需要更新的高度图有哪些。可以看出,甲类的均为世界生成专用的高度图,乙类均为正常游戏逻辑使用的高度图。
高度图类别 | 高度图 |
---|---|
甲类 | OCEAN_FLOOR_WG, WORLD_SURFACE_WG |
乙类 | OCEAN_FLOOR, WORLD_SURFACE, MOTION_BLOCKING, MOTION_BLOCKING_NO_LEAVES |
区块加载与世界生成
上表中的范围(Range)决定的是,某区块进入该状态时,需要加载的周围区块的曼哈顿半径 r
(该半径下构成的正方形区域边长是 2 * r + 1
)。-1 无意义。
那么所加载的区块至少需要到那个状态呢?这与区块的等级(Level)有关。我们可以从世界生成加载界面中的图案中得到一些启示。在世界生成加载界面中,每一个生物群系状态对应一种颜色。图片正中心像素的 level = 22,向外每延伸一格,level 加一。颜色和等级对应的区块状态见上表。
(图中的橙色青色为助于识别的辅助线、辅助点和长度标记,实际界面中并不存在)
这张图并非总是那么规整,实际上,当出现结构需要加载的时候,level 会被故意提高,保证结构的完整的加载。
触发区块 level 改变的不仅仅只有创建世界。实际上,Mojang 引入了票(Ticket) 的概念来管理区块加载。欲知更多相关内容,可以转阅海螺的文章(链接见附录)
Configuration 设计模式
无论是特性、放置器,还是镂空器、地表构造器(X = Feature, Placement, Carver, SurfaceBuilder
),都存在 X ~ XConfig
的设计模式,即 X
提供逻辑,XConfig
(译作 X 的配置)提供逻辑需要的参数。把 X ~ XConfig
绑定在一起的类被称为 ConfiguredX
(译作 已配置的 X)。其结构如下图所示。
接下来不分先后的介绍这四个在区块和生物群系生成中的特点和作用。
镂空器
镂空器(Carver),又译作雕刻器,是用来为世界打洞的。这也是为什么我把它译作镂空器的原因。以打洞结束之后填充物的不同,可以分为空气镂空和液体镂空两类。主世界的普通和水下洞穴和峡谷,下界的洞穴,都是它完成的。