В 2D-игре моя функция определяет, находится ли спрайт в пределах кругов. Но это не удается.
Приведенный ниже код просто перебирает все точки, составляющие контур круга (каждая точка имеет координаты x и y). Затем он разбивает круг на 4 квадранта одинакового размера (как декартова плоскость) и проверяет, находится ли спрайт в этом квадранте (координаты x/y начинаются с (0,0) в верхнем левом углу окна и увеличиваются по мере увеличения). вы идете вниз для y и вправо для x):
bool IsColliding()
{
for (int i = 0; i < TotalPointsThatMakeUpTheCircleOutline; i++)
{
// Points lining the top left quadrant of circle
if (Circle.Point[i].xCoordinate <= Circle.getCenterCoordinate().x &&
Circle.Point[i].yCoordinate <= Circle.getCenterCoordinate().y)
{
// Checks if sprite is in-between circle outline point and center point
if (sprite.xCoordinate >= Circle.Point[i].xCoordinate &&
sprite.xCoordinate <= Circle.getCenterCoordinate().x &&
sprite.yCoordinate >= Circle.Point[i].yCoordinate &&
sprite.yCoordinate <= Circle.getCenterCoordinate().y)
{
return true;
}
}
// Points lining the top right quadrant of circle
........
// Points lining the bottom left quadrant of circle
........
// Points lining the bottom right quadrant of circle
........
return false;
}
}
Остальные 3 оператора if одинаковы, просто меняются местами соответствующие знаки сравнения ("‹" и ">"). Может ли кто-нибудь увидеть, что мне не хватает?
dx*dx + dy*dy <= r_squared
. Похоже, ваше столкновение пытается сделать это с каждым углом спрайта. Кроме того, вы можете захотеть проверить, сталкивается ли край, даже если все углы могут быть за пределами круга. Вы можете решить это, проверив расстояние точки (центр круга) от вектора (одного края) и проверив, что перпендикуляр находится между двумя вершинами края (т.е. скалярное произведение, которое уже является частью вычисления, находится между 0 и 1). - person paddy   schedule 10.09.2015