3,417
个编辑
MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针。
如果在编辑的过程中遇到了什么问题,可以去讨论板提问。
为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证。
MCBBS Wiki GitHub群组已上线!
您可以在回声洞中发表吐槽!
服务器状态监控。点击进入
本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>
| 第202行: | 第202行: | ||
然后,便是声明了一大堆噪声算法相关的变量。读者可能会被他们镇住。NoiseGeneratorOctaves使用的是八度噪声算法,NoiseGeneratorPerlin使用的是柏林噪声算法,这两种算法到底是怎么回事,读者可以自行查阅,笔者在这里就不讲了——因为讲了也没用,因为Minecraft早就用NoiseGeneratorOctaves和NoiseGeneratorPerlin这两个类把这两个算法的计算过程封装好了。这两种算法都具有伪随机特性,可以看到:我们都传入了this.rand,而this.rand的seed是当前的世界种子,那也就保证了相同的世界种子生成的两个世界中,该维度的地形生成是一样的。这些噪声变量用于生成高度分布图。 | 然后,便是声明了一大堆噪声算法相关的变量。读者可能会被他们镇住。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实例了。 | 然后是一个World类型的变量,这也显得理所应当——这个类中当然要有一个World实例了。 | ||
| 第210行: | 第234行: | ||
然后是一个Biome数组,它用于存储该维度中所有的生物群系种类,并在generateChunk阶段以此为依据替换表层方块。如果你的维度中只有一个生物群系,那么这个Biome数组完全没必要声明,你直接在generateChunk里面向结果编程就好了。 | 然后是一个Biome数组,它用于存储该维度中所有的生物群系种类,并在generateChunk阶段以此为依据替换表层方块。如果你的维度中只有一个生物群系,那么这个Biome数组完全没必要声明,你直接在generateChunk里面向结果编程就好了。 | ||
最后说一句,区块生成类的构造器并没有对形参列表的强制要求(不像TileEntity和Entity,前者要求有一个零参构造器,后者要求有一个形参只有一个World类型参数的构造器),因此这里传入什么参数就完全看你个人的需求了。 | |||
==== 实现generateChunk方法 ==== | ==== 实现generateChunk方法 ==== | ||
===== generateHeightMap ===== | ===== generateHeightMap ===== | ||