所以,我在做一个游戏,我有一个问题。我需要一些方法来有效地获取位于三维图形中的对象。
然而,问题是,它们都可以覆盖多个值来获取。例如,值'foo'可能覆盖x范围400-500,y范围10-20和z范围30-60。
我想知道是否有一种更有效的方法来存储和获取这些值,而不是仅仅将它们存储在一个数组中并搜索它们,这是我不愿意做的,因为这些值太多了。
这是为游戏选择生物群落。然而,我选择把这个放在这里与gamedev比较,因为这似乎更像是一个数据结构的问题。不过,我可能错了,如果我是的话,我很乐意把这个关上,把那个打开。
还有别的办法吗?
public static Tile getTile(int height, int moisture, int temperature) {
for(Tile tile : tileList){
boolean isTile = true;
if(!(tile.heightMax > height && tile.heightMin < height)){
isTile = false;
}
if(!(tile.temperatureMax > temperature && tile.temperatureMin < temperature)){
isTile = false;
}
if(!(tile.moistureMax > moisture && tile.moistureMin < moisture)){
isTile = false;
}
if(isTile){
return tile;
}
}
}
这是我的搜索方法。如您所见,我使用一个列表来存储所有的tile,并搜索符合条件的tile。有没有其他的方法来尽可能快地使用许多瓷砖呢?
2条答案
按热度按时间nnsrf1az1#
我不完全确定我是否理解你的问题所在,但它似乎非常类似于三维空间中的碰撞检测算法。如果是这样的话,八叉树可能就是你要找的:http://www.codeproject.com/articles/108761/octrees
f8rj6qna2#
我过去解决这个问题的方法是定义表示三维空间区域的区域,然后从对象空间重叠的所有区域存储到每个对象的Map。然后,当您要在某个位置查找对象时,首先使用Map查找与该位置区域重叠的所有对象,然后再遍历这些对象以在该位置查找对象。
让我给你一个代码视图。要构建区域Map,请执行以下操作:
添加项目时:
然后,当您在某个位置搜索项目时:
这里面肯定有开销,但是如果你的区域足够小的话,搜索速度会非常快。
这是为三维空间设计的,但它可以扩展到您想要的任意多个维度:这都是在实现的
Region
以及Location
班级。