如何使用矢量快速检测碰撞?

时间:2014-09-23 14:59:15

标签: c++ collision detection sfml

所以我正在制作一个俄罗斯方块克隆,我的碰撞检测方法是存储一堆sf :: FloatRects(使用SFML进行碰撞检测的最简单方法),它将板上的每个sprite组成一个全局向量,然后检查移动部件的sf :: FloatRects是否与板上已有的任何sf :: FloatRects相交。如果它们相交,那么这件作品就不会移动。唯一需要注意的是,我不想在我的游戏循环的每次迭代中迭代一个数百个大小的向量。有没有更有效的方法来做到这一点?这是我到目前为止的一些工作代码:

//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对象只是试图找到一个与精灵相交的对象是不好的做法。

编辑:这是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;
        }

        ...

0 个答案:

没有答案