我非常喜欢c ++,所以我希望这个问题不太明显。
我目前正在创建一个体素引擎。现在我需要在指定的XYZ位置获得一个块。
块管理类有一个vector<Chunk*> loadedChunks
。
我无法使用向量的索引位置,因为一旦我移动了角色,它就会改变位置,因为旧的块将被移除并且将添加新的块。
在Java中我会使用HashMap<Point3D, Chunk>
所以我用谷歌搜索c ++是否有类似的内容我发现有一个名为map的类。
所以我尝试使用地图并使用一个名为Point3D的类,其中包含块的x,y,z位置,但这给了我一个错误,因为我使用了一个块*一个点3D没有&#39; ta指针。我无法将Point3D保存为指针,因为我仍然无法通过xyz获取该位置。
现在的问题是,有没有办法像这样使用地图,或者是否有更好的方法来获取x,y,z的块或者我是否必须坚持循环通过所有的最慢的循环chunk并返回具有相等x,y,z的块
以下是我使用的代码:
ChunkManager.h
...
map<Point3D, Chunk*> loadedChunks;
....
ChunkManager.cpp
void ChunkManager::addChunk(Chunk* chunk){
loadedChunks.insert(make_pair(Point3D(chunk->x, chunk->y, chunk->z), chunk));
Chunk* c = loadedChunks[Point3D(chunk->x, chunk->y, chunk->z)];
}
Chunk* ChunkManager::getChunkAt(int x, int y, int z){
return loadedChunks[Point3D(chunk->x, chunk->y, chunk->z)];
}
void ChunkManager::render(Renderer& renderer){
for(auto iterator = loadedChunks.begin(); iterator != loadedChunks.end(); iterator++){
iterator->second->render(renderer);
}
}
void ChunkManager::update(double delta){
for(auto iterator = loadedChunks.begin(); iterator != loadedChunks.end(); iterator++){
iterator->second->update(delta);
}
}
Point3D:
class Point3D
{
public:
Point3D(int x, int y, int z);
int x, y, z;
bool operator< (const Point3D &rhs) const;
};
bool Point3D::operator< (const Point3D &rhs) const {
return x < rhs.x || ( x == rhs.x && ( y < rhs.y || ( y == rhs.y && z < rhs.z)));
}
我刚刚添加了运算符&lt;现在它的工作。
return x < rhs.x || ( x == rhs.x && ( y < rhs.y || ( y == rhs.y && z < rhs.z)));
答案 0 :(得分:1)
您可以使用您想要的地图。没有与指针有关......那里有其他(可能是概念上的)问题。
但您创建了std::map<Point3d, Chunk*> loadedChunks;
使用loadedChunks.insert(std::make_pair(my_point3d, my_chunk_ptr));
使用find()或operator []读取它们 - 它们的行为略有不同(op []将返回对某事物的引用,如果它尚不存在则添加新条目,find将返回一对,bool说条目是否存在以及条目的迭代器。
你的Point3d类需要有一个运算符&lt;至少地图可以用来确定地图中放置Point3d的位置。
如果你认为这不会很好(地图是作为树结构实现的)那么你可以使用boost,它们有unordered_map class代替使用哈希表。
我可能建议的一件事是使用unique_ptr&lt;&gt;或shared_ptr&lt;&gt;虽然你的块指针。如果您没有正确管理指针,这些将有助于防止泄漏。