我正在用Q ++在Qt中创建一个游戏,我将每个特定大小的坐标存储到一个矢量中:
std::vector<std::unique_ptr<Tile>> all_tiles = createWorld(bgTile);
for(auto & tile : all_tiles) {
tiles.push_back(std::move(tile));
}
每个级别还有一些健康包,它们也存储在载体中。
std::vector<std::unique_ptr<Enemy>> all_enemies = getEnemies(nrOfEnemies);
for(auto &healthPackUniquePtr : all_healthpacks) {
std::shared_ptr<Tile> healthPackPtr{std::move(healthPackUniquePtr)};
int x = healthPackPtr->getXPos();
int y = healthPackPtr->getYPos();
int newYpos=checkOverlapPos(healthPackPtr->getXPos(),healthPackPtr->getYPos());
newYpos = checkOverlapEnemy(healthPackPtr->getXPos(),newYpos);
auto healthPack = std::make_shared<HealthPack>(healthPackPtr->getXPos(), newYpos, healthPackPtr->getValue());
healthPacks.push_back(healthPack);
}
但是我知道我正在寻找最快的方法来检查我的球员位置是否处于健康状态。所以我必须在向量中搜索2个值:x和y位置。有人建议怎么做?
答案 0 :(得分:2)
你的'真实'问题:
我必须在向量中搜索2个值:x和y位置。任何人 建议怎么做?“
是一个经典的XY问题,所以我忽略了它!
我正在寻找检查我的球员位置是否最快的最快方法 保健包的位置。
现在我们正在谈论。您现在使用的方法随着项目数量的增加而无法很好地扩展,您需要为您感兴趣的每对对象执行类似的操作。不太好。
值得庆幸的是,这个问题已经解决了(并经过改进)数十年,您需要使用空间分区方案,例如BSP,BVH,quadtree / octree这些方案的优点在于,单个数据结构可以将整个世界包含在其中,使得任意项目交集查询变得微不足道(并且快速)。
答案 1 :(得分:1)
您可以实施回调系统。然后玩家移动一个牌,向该玩家所在的那个牌发出回调。瓷砖应该知道它的状态,并且可以为玩家增加健康,或者如果该瓷砖上没有任何东西则不做任何事情。使用这种技术,您根本不需要搜索。
答案 2 :(得分:1)
如果$('.header').on('click', '.dropdown-menu li a', function(e){
e.stopPropagation();
var number = $(this).text(),
$(this).parents(".btn-group").find('.btn').html(number + " <span class=\"caret\"></span>");
$(this).dropdown("toggle"); // Use for close dropdown on click
});
少于~50个元素,我就不会费心去改进。简单循环将足够快。
否则,您可以将矢量拆分为扇区,并仅检查与您的播放器位于同一扇区中的元素(如果它靠近边缘,则可以检查一些元素。)
如果您需要更好的内存,并使用KD树索引healtpack并快速搜索它们(O(logN)时间)。