我尝试创建一个类似我的世界的游戏,但我有块装载的问题.. 现在,我只检查玩家是否在一个卸载的块中,如果这是真的,我加载这个块:
Vector2f cameraPos = new Vector2f(camera.getTransform().getPos().getX(), camera.getTransform().getPos().getZ());
Vector3f currentChunkPos = new Vector3f((float) Math.floor(cameraPos.getX() / Chunk.WIDTH - 0.499f) * Chunk.WIDTH, 0, (float) Math.floor(cameraPos.getY() / Chunk.LENGTH - 0.499f) * Chunk.LENGTH);
System.out.println(currentChunkPos);
if(findChunk(currentChunkPos) == null) {
loadedChunks.add(new Chunk(currentChunkPos, noise));
}
findChunk():
public Chunk findChunk(Vector3f pos) {
for(Chunk chunk : loadedChunks) {
Vector3f cpos = chunk.getTransform().getPos();
if(pos.getX() == cpos.getX() && pos.getY() == cpos.getY() && pos.getZ() == cpos.getZ()) {
return chunk;
}
if((pos.getX() < cpos.getX()) || (pos.getZ() < cpos.getZ()) || (pos.getX() > cpos.getX() + Chunk.WIDTH) || (pos.getZ() > cpos.getZ() + Chunk.WIDTH)) {
continue;
}
return chunk;
}
return null;
}
但问题是,当你进去的时候,有时你所在的块会被直接加载,如果你在中间并且有一半的块没有加载,有时会加载块。 有人知道我做错了吗?
答案 0 :(得分:1)
由于您只为该块存储单个X
,Y
和Z
位置以及大小,然后比较世界中的用户位置,因此块只会是如果用户正在移动,则在用户面前加载&#39;在正确的X
,Y
和Z
位置,否则您的if条件将无法满足,因为用户的X
将高于chunk X
。
您需要做的是让每个块存储一个&#39; Chunk number&#39;适用于X
和Y
。让我们说你的块是50x50,然后你可能会这样编号:
然后从您使用的世界位置计算出大块:
final int chunkSize = 50;
final int[] worldPositions = {241, 186, 30};
final int chunkX = worldPositions[0] / chunkSize;
final int chunkY = worldPositions[1] / chunkSize;
System.out.println("X: " + chunkX + ", Y: " + chunkY); //Output: X: 4, Y: 3
因此,您可以通过在每个值中添加和减去1来加载该块以及围绕它的每个块。您也不应该需要一个块Z
,因为块是X
和Y
区域中的所有内容,无论它有多高。