C++ 如何使用向量快速检测碰撞?

C++ 如何使用向量快速检测碰撞?,c++,collision,detection,sfml,C++,Collision,Detection,Sfml,因此,我正在制作一个俄罗斯方块克隆,我的碰撞检测方法是存储一组sf::FloatRect(使用SFML进行碰撞检测的最简单方法),将板上的每个精灵组成一个全局向量,然后检查移动块的sf::FloatRect是否与板上已有的任何sf::FloatRect相交。如果它们相交,那么这一块就不会移动。唯一需要注意的是,我不希望每次迭代gameloop时都遍历数百个大小的向量。有没有更有效的方法?以下是我到目前为止的一些工作代码: //the walls should have a float rect

因此,我正在制作一个俄罗斯方块克隆,我的碰撞检测方法是存储一组sf::FloatRect(使用SFML进行碰撞检测的最简单方法),将板上的每个精灵组成一个全局向量,然后检查移动块的sf::FloatRect是否与板上已有的任何sf::FloatRect相交。如果它们相交,那么这一块就不会移动。唯一需要注意的是,我不希望每次迭代gameloop时都遍历数百个大小的向量。有没有更有效的方法?以下是我到目前为止的一些工作代码:

//the walls should have a float rect on top of sprites for coll. checking
if(wallsAdded == false){
    sf::FloatRect fr = level.GetWallTile().getGlobalBounds();
    level.GetCollisionObjects().push_back(fr);
    wallsAdded == true;
}
例如,这段代码获取了构成侧面和地板墙壁的所有精灵,并将它们的碰撞检测器(sf:FloatRect)存储到一个全局向量中,我可以检查这个片段是否与任何元素相交。我还是新手,所以我不知道迭代数百个SFML对象只是试图找到一个与sprite相交的对象是否是错误的做法

编辑:下面是我非常担心的for循环:

if(event.type == (sf::Event::KeyPressed)){
    switch(event.key.code){
        case sf::Keyboard::Left:{
            //std::vector<sf::FloatRect> pieceFRs_;
            for(int i = 0; i < 4; i++){
                sf::FloatRect fr = level.GetGamePieces().at(temp - 1).GetPieceRectangles()[i].getGlobalBounds();
                //pieceFRs_.push_back(fr);
                for(int i = 0; i < level.GetCollisionObjects().size(); i++){
                    //get left-bound fr's, if their pos - 10 intersetcs wall, don't do anything
                    if(!fr.intersects(level.GetCollisionObjects()[i])){
                        level.GetGamePieces().at(temp - 1).MovePiece(-10, 0);
                        std::cout << "left";
                    }
                }
            }
            break;
        }

        ...
if(event.type==(sf::event::KeyPressed)){
开关(事件、键、代码){
案例sf::键盘::左:{
//std::向量片段frs;
对于(int i=0;i<4;i++){
sf::FloatRect fr=level.GetGamePieces().at(temp-1).GetPieceRectangles()[i].getGlobalBounds();
//工件前推后推(fr);
对于(int i=0;istd::俄罗斯方块中是否还有其他碰撞检测方法。看看这一种,其中棋盘和碎片被视为矩阵:@E_net4我喜欢该教程的实现,使用“潜在的”形状来检查实际形状是否适合它尝试去的地方,但我不喜欢处理2D矩阵的概念。对我来说太多硬编码。你写的循环的运行时间是什么?我会保留蛮力实现,直到你有一个完整的原型,看看它是否会导致问题。当前的实现是直截了当,如果你需要的话很容易改变,所以我会一直保留它,直到你有一个比简单的理解更有力的理由。@jburn7我无法理解你在这里的不喜欢。你总是可以对矩阵进行某种抽象。这里很酷的一点是,已经就位的碎片都合并成一个碰撞形状。我会合作n将墙划分为包含边界和其他瓷砖作为排除边界。例如,当输入显示按下左键时,移动您的碎片。在输入阶段后,自行进行碰撞检测。在该碰撞阶段,您可以将x方向移回隔离区域,然后移到可能发生碰撞的任何碎片上方它位于底部。如果您一次按两个方向键,这将对您有所帮助。您仍将在所有对象中循环,但仅在计算您想要的位置后循环一次。然后确定您实际所在的位置。