在一个向量中找到坐标

Find coordinates in a vector c++

本文关键字:坐标 向量 一个      更新时间:2023-10-16

我正在用c++在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);
    }

但我知道我正在寻找最快的方法来检查我的球员位置是否在一个生命包位置。我需要搜索向量中的两个值x和y的位置。有人有什么建议吗?

你的"真正"问题:

我必须搜索向量中的两个值:x和y位置。任何一个建议怎么做?"

是一个经典的XY问题,所以我忽略它!

我正在寻找最快的方法来检查我的球员位置是否在健康包位置。

现在我们来谈谈。随着物品数量的增加,您现在使用的方法将无法很好地扩展,您需要为您感兴趣的每一对物品做类似的事情。不好。

值得庆幸的是,这个问题已经解决(并改进)了几十年,您需要使用一个特殊的分区方案,如BSP、BVH、四叉树/八叉树等。这些方案的美妙之处在于,一个单一的数据结构可以容纳整个世界,使任意项相交查询变得微不足道(而且快速)。

你可以实现一个回调系统。然后玩家移动一个贴图,触发一个回调到玩家所在的贴图。贴图应该知道它的状态,可以为玩家增加生命值,或者如果贴图上没有任何内容就什么都不做。使用这种技术,您根本不需要搜索。

如果all_leathpacks的元素少于50个,我就不会费心去改进了。简单的循环就足够快了。否则,你可以将矢量分割成扇区,只检查与玩家相同扇区中的元素(如果靠近边缘,可能会检查周围的几个元素)。

如果你需要一些更适合内存的东西,你可以使用KD-tree来索引健康包并快速搜索它们(O(logN)时间)。