Java 块不';t载荷
我试图创建一个像minecraft这样的游戏,但我在区块加载方面遇到了问题。。 现在,我只检查播放器是否在未加载的区块中,如果这是真的,我将加载此区块:Java 块不';t载荷,java,lwjgl,Java,Lwjgl,我试图创建一个像minecraft这样的游戏,但我在区块加载方面遇到了问题。。 现在,我只检查播放器是否在未加载的区块中,如果这是真的,我将加载此区块: Vector2f cameraPos = new Vector2f(camera.getTransform().getPos().getX(), camera.getTransform().getPos().getZ()); Vector3f currentChunkPos = new Vector3f((float) Math.floor(c
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(块:loadedChunks){
Vector3f cpos=chunk.getTransform().getPos();
if(pos.getX()==cpos.getX()&&pos.getY()==cpos.getY()&&pos.getZ()==cpos.getZ()){
返回块;
}
if((pos.getX()cpos.getX()+Chunk.WIDTH)|(pos.getZ()>cpos.getZ()+Chunk.WIDTH)){
继续;
}
返回块;
}
返回null;
}
但问题是,当你进去时,你所输入的块会直接加载,有时块被加载,如果你在中间,块的一半没有加载…
有人知道我做错了什么吗?由于您只存储块的单个
X
、Y
和Z
位置加上大小,然后比较用户在世界上的位置,只有当用户以正确的X
向前移动时,才会在用户面前加载块,Y
和Z
位置,否则您的if条件将无法满足,因为用户的X
将高于区块X
您需要做的是让每个区块为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
区域中的一切,不管它有多高
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