存储在地图

时间:2017-06-26 22:44:21

标签: c++ class hashmap

我最近开始更多地使用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}}地图中只有一个块。关于它的其他一切与这个问题无关。

1 个答案:

答案 0 :(得分:2)

一个问题是你在这里制作了存储在地图中的块的副本:

Chunk chunk = it->second;

您应该访问引用。这可以这样做:

Chunk& chunk = it->second;

但是使用基于范围的for循环而不是复杂的while循环可能更容易:

for (auto& chunk : chunks) chunk.second.draw();