问题描述
在一些帮助下,我设法了解了两个矩形如何相交,从那里可以很容易地使我刚才在标题中说的那样,但是...
所以,下面是我刚刚做的简短故事: 创建了一个从1到Number_of_Obstacles的for循环 在这种情况下,将创建一个随机障碍物(矩形/正方形),并检查该障碍物是否与从0到循环扭曲的所有其他障碍物(或向量中存储的每个障碍物)重叠。
同样,doOverLap函数起作用。用一个正方形测试了它,我制作了一个控制器,并在屏幕上创建了其他随机矩形。当我重叠并信任我时,它会在聊天中输出,我从各个角度都重叠了它。
以下是重叠的问题:https://imgur.com/a/ZzorOcD
bool doOverlap(A a,B b)
{
if (a.x1 > b.x2 || b.x1 > a.x2)
return false;
if (a.y1 > b.y2 || b.y1 > a.y2)
return false;
return true;
}
struct Obstacles {
int X,Y;
void Create_Random_Obstacles(Obstacles Obj[],int Numar_Obstacole)
{
srand(time(NULL));
A Rectangle_1;
B Rectangle_2;
/* To avoid rendering outside of the screen */
int X_Axis = X_RESOLUTION - 40;
int Y_Axis = Y_RESOLUTION - 40;
int obstacolX = rand() % X_Axis + 1;
int obstacolY = rand() % Y_Axis + 1;
Obj[0].X = obstacolX;
Obj[0].Y = obstacolY;
for (int i = 1; i < Numar_Obstacole; i++)
{
obstacolX = rand() % X_Axis + 1;
obstacolY = rand() % Y_Axis + 1;
Rectangle_1.x1 = obstacolX;
Rectangle_1.x2 = obstacolX + 40;
Rectangle_1.y1 = obstacolY;
Rectangle_1.y2 = obstacolY + 40;
for (int j = 0; j < i; j++) {
Rectangle_2.x1 = Obj[j].X;
Rectangle_2.x2 = Obj[j].X + 40;
Rectangle_2.y1 = Obj[j].Y;
Rectangle_2.y2 = Obj[j].Y + 40;
if (doOverlap(Rectangle_1,Rectangle_2))
{
std::cout << "Overlap\n";
}
else
{
Obj[i].X = obstacolX;
Obj[i].Y = obstacolY;
}
}
}
}
void Render(SDL_Renderer* renderer,Obstacles Obj[],int Numar_Obstacole) {
for (int i = 0; i < Numar_Obstacole; i++)
{
SDL_Rect r{ Obj[i].X,Obj[i].Y,40,40 };
SDL_SetRenderDrawColor(renderer,255,160,15,255);
SDL_RenderFillRect(renderer,&r);
}
}
};
解决方法
发生碰撞时重新启动选择,例如:
bool Has_Overlap(const Obstacles& obj,const Obstacles* Objs,int Size)
{
B Rectangle_2;
Rectangle_2.x1 = obs.X;
Rectangle_2.x2 = obs.X + 40;
Rectangle_2.y1 = obs.Y;
Rectangle_2.y2 = obs.Y + 40;
for (int i = 0; i != Size; ++i) {
A Rectangle_1;
Rectangle_1.x1 = Obs[i].X;
Rectangle_1.x2 = Obs[i].X + 40;
Rectangle_1.y1 = Obs[i].Y;
Rectangle_1.y2 = Obs[i].Y + 40;
if (doOverlap(Rectangle_1,Rectangle_2)) {
return true;
}
}
return false;
}
void Create_Random_Obstacles(Obstacles* Objs,int Size)
{
/* To avoid rendering outside of the screen */
const int X_Axis = X_RESOLUTION - 40;
const int Y_Axis = Y_RESOLUTION - 40;
for (int i = 0; i < Size; i++)
{
do {
Objs[i].X = rand() % X_Axis + 1;
Objs[i].Y = rand() % Y_Axis + 1;
} while (Has_Overlap(Objs[i],Objs,i));
}
}