用户:MashKJo/1.12.2模组开发笔记/实现新维度:修订间差异

 
然后,便是声明了一大堆噪声算法相关的变量。读者可能会被他们镇住。NoiseGeneratorOctaves使用的是八度噪声算法,NoiseGeneratorPerlin使用的是柏林噪声算法,这两种算法到底是怎么回事,读者可以自行查阅,笔者在这里就不讲了——因为讲了也没用,因为Minecraft早就用NoiseGeneratorOctaves和NoiseGeneratorPerlin这两个类把这两个算法的计算过程封装好了。这两种算法都具有伪随机特性,可以看到:我们都传入了this.rand,而this.rand的seed是当前的世界种子,那也就保证了相同的世界种子生成的两个世界中,该维度的地形生成是一样的。这些噪声变量用于生成高度分布图。
 
那为什么笔者在声明这些噪声变量的时候用了很多“...”呢?那是因为生成维度并不是千篇一律的,到底怎么定义噪声变量完全看你的需求。比如原版的ChunkGeneratorOverworld类中,就有一个<code>forestNoise</code>变量,这个在很多模组的维度区块生成类中一般都没有。不过如果你真想直接抄代码,其实噪声变量应该是这么定义的:
 
...
private NoiseGeneratorOctaves minLimitPerlinNoise;
private NoiseGeneratorOctaves maxLimitPerlinNoise;
private NoiseGeneratorOctaves mainPerlinNoise;
private NoiseGeneratorPerlin surfaceNoise;
private NoiseGeneratorOctaves scaleNoise;
private NoiseGeneratorOctaves depthNoise;
...
public MyDimChunkGenerator(World world)
{
...
this.minLimitPerlinNoise = new NoiseGeneratorOctaves(this.rand, 16);
this.maxLimitPerlinNoise = new NoiseGeneratorOctaves(this.rand, 16);
this.mainPerlinNoise = new NoiseGeneratorOctaves(this.rand, 8);
this.surfaceNoise = new NoiseGeneratorPerlin(this.rand, 4);
this.scaleNoise = new NoiseGeneratorOctaves(this.rand, 10);
this.depthNoise = new NoiseGeneratorOctaves(this.rand, 16);
}
 
读者可能会感到奇怪:不是说维度的区块生成没有通用程式吗?当然没有,只不过这些代码在许多模组的新维度区块生成类中都能找到,甚至连参数值都不改的,它们应该都是借鉴于原版主世界生成的相关代码。这里我们可以注意到,只有地表噪音的类型是NoiseGeneratorPerlin。
 
然后是一个World类型的变量,这也显得理所应当——这个类中当然要有一个World实例了。
 
然后是一个Biome数组,它用于存储该维度中所有的生物群系种类,并在generateChunk阶段以此为依据替换表层方块。如果你的维度中只有一个生物群系,那么这个Biome数组完全没必要声明,你直接在generateChunk里面向结果编程就好了。
 
最后说一句,区块生成类的构造器并没有对形参列表的强制要求(不像TileEntity和Entity,前者要求有一个零参构造器,后者要求有一个形参只有一个World类型参数的构造器),因此这里传入什么参数就完全看你个人的需求了。
 
==== 实现generateChunk方法 ====
===== generateHeightMap =====
行政员、​优秀编辑者、​界面管理员、​监督员、​管理员、​小部件编辑者
3,258

个编辑