我最近开始更多地使用C ++并且为了更好地使用它我创建了一个基本的体素游戏,它是我在学习Java时所做的事情的克隆。 (想想基本的我的世界)
主游戏循环调用draw()
类中的World
方法,然后循环遍历所有块并在块上调用draw方法。为了既节省内存使用量又具有非方形形状的世界,块被存储在地图中,其中键是在chunk space
中存储块位置的类。 (块空间基本上是chunkx = floor(worldx/chunksize)
)
我相信我目前在.draw()
chunks
上调用map
函数的方式不正确,因为构建块网格的代码只能被调用一次被一遍又一遍地召唤。
世界的平局功能:
void World::draw () {
std::map<ChunkPosition, Chunk>::iterator it = chunks.begin();
while (it != chunks.end()) {
ChunkPosition pos = it->first;
Chunk chunk = it->second; // I think I may need to use a pointer here somehow
chunk->draw();
it++;
}
}
The Chunk的绘图功能:
void Chunk::draw () {
if(build){ // should only "build" the mesh once, is initialized to true
build = false;
... mesh building code that is not relevant ...
std::cout << verticeSize << std::endl; // this is called every loop cycle instead of once
mesh.build (vertices, verticeSize, indices, indiceSize);
}
mesh.draw(); // draw the mesh every cycle
}
这是Chunk类的结构
class Chunk {
private:
static const int size = 25;
std::map<Location, Block> blocks;
Mesh mesh;
bool build = true;
public:
void setBlock (Location, Block&);
void setBlock (int, int, int, Block&);
Block *getBlock (Location);
Block *getBlock (int, int, int);
bool hasBlock (Location);
bool hasBlock (int, int, int);
void draw ();
};
我在位置chunks
的{{1}}地图中只有一个块。关于它的其他一切与这个问题无关。
答案 0 :(得分:2)
一个问题是你在这里制作了存储在地图中的块的副本:
Chunk chunk = it->second;
您应该访问引用。这可以这样做:
Chunk& chunk = it->second;
但是使用基于范围的for循环而不是复杂的while循环可能更容易:
for (auto& chunk : chunks) chunk.second.draw();