所以我正在制作一个俄罗斯方块克隆,我的碰撞检测方法是存储一堆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;
}
...