Я пытаюсь реализовать игру, похожую на майнкрафт, используя opengl. Итак, я дошел до того, что хочу заменить глупое поколение sh на отбраковку.
Вид местности без выбраковки между кусками:
Просмотр внутри местность:
Это работало нормально, но когда я пытаюсь также отбирать эти блоки между кусками, вещи go странные.
Вид местности при добавлении отбраковки между кусками:
Вот код моего sh генерации:
void Chunk::CreateMesh()
{
for (int x = 0; x < CHUNK_SIZE; x++)
{
for (int y = 0; y < CHUNK_SIZE; y++)
{
for (int z = 0; z < CHUNK_SIZE; z++)
{
BlockType currentBlock = blocks[x][y][z];
BlockChunkPosition currentPos(x, y, z);
if (currentBlock != BlockType::AIR)
{
// Right face
if (GetBlock(x + 1, y, z) == BlockType::AIR || GetBlock(x + 1, y, z) == BlockType::LEAVES)
{
mesh.AddFace(RIGHT_FACE, currentBlock, currentPos);
}
// Left face
if (GetBlock(x - 1, y, z) == BlockType::AIR || GetBlock(x - 1, y, z) == BlockType::LEAVES)
{
mesh.AddFace(LEFT_FACE, currentBlock, currentPos);
}
// Top face
if (GetBlock(x, y + 1, z) == BlockType::AIR || GetBlock(x, y + 1, z) == BlockType::LEAVES)
{
mesh.AddFace(TOP_FACE, currentBlock, currentPos);
}
// Bottom face
if (GetBlock(x, y - 1, z) == BlockType::AIR || GetBlock(x, y - 1, z) == BlockType::LEAVES)
{
mesh.AddFace(BOTTOM_FACE, currentBlock, currentPos);
}
// Front face
if (GetBlock(x, y, z + 1) == BlockType::AIR || GetBlock(x, y, z + 1) == BlockType::LEAVES)
{
mesh.AddFace(FRONT_FACE, currentBlock, currentPos);
}
// Back face
if (GetBlock(x, y, z - 1) == BlockType::AIR || GetBlock(x, y, z - 1) == BlockType::LEAVES)
{
mesh.AddFace(BACK_FACE, currentBlock, currentPos);
}
}
}
}
}
}
BlockType Chunk::GetBlock(int x, int y, int z)
{
try
{
return blocks.at(x).at(y).at(z);
}
catch (std::out_of_range &)
{
BlockWorldPosition pos = ToWorldCoordinates(position, BlockChunkPosition(x, y, z));
return terrain->GetBlock(pos);
}
}
BlockType Terrain::GetBlock(BlockWorldPosition pos)
{
ChunkPosition chunkPos;
chunkPos = GetChunkPos(pos);
BlockChunkPosition blockPos;
blockPos = GetBlockLocalPos(pos);
ChunkTable::iterator currentChunk;
if(((currentChunk = chunks.find(chunkPos)) != chunks.end()))
{
return currentChunk->second->GetBlock(blockPos.x, blockPos.y, blockPos.z);
}
return BlockType::AIR;
}
Когда я использую отладчик, он странным образом работает в блоке try-catch. Что-то не так?
Что может вызвать такую проблему?