Я делаю простую игру для Android в libgdx.Я хочу предотвратить наложение треугольника (основной персонаж) и прямоугольника (стена).Я использую эти функции для предотвращения перекрытия:
public boolean overlaps(MyActor other)
{
Polygon poly1 = this.getBoundaryPolygon();
Polygon poly2 = other.getBoundaryPolygon();
if(!poly1.getBoundingRectangle().overlaps(poly2.getBoundingRectangle()))
return false;
return Intersector.overlapConvexPolygons(poly1,poly2);
}
public Vector2 preventOverlap(MyActor other)
{
Polygon poly1 = this.getBoundaryPolygon();
Polygon poly2 = other.getBoundaryPolygon();
if(!poly1.getBoundingRectangle().overlaps(poly2.getBoundingRectangle()))
return null;
Intersector.MinimumTranslationVector mtv = new Intersector.MinimumTranslationVector();
boolean polygonOverlap = Intersector.overlapConvexPolygons(poly1,poly2,mtv);
if(!polygonOverlap)
return null;
this.moveBy(mtv.depth * mtv.normal.x,mtv.depth * mtv.normal.y);
return mtv.normal;
}
Вот так я создаю ограничивающий многоугольник для треугольника:
public void setBoundaryTriangle()
{
float[] vertices = new float[6];
vertices[0] = 0;
vertices[1] = 0;
vertices[2] = getWidth();
vertices[3] = 0;
vertices[4] = getWidth() / 2;
vertices[5] = getHeight();
boundaryPolygon = new Polygon(vertices);
}
и для прямоугольника:
public void setBoundaryRectangle()
{
float w = getWidth();
float h = getHeight();
float[] vertices = {0,0,w,0,w,h,0,h};
boundaryPolygon = new Polygon(vertices);
}
Это метод getBoundryPolygon:
public Polygon getBoundaryPolygon()
{
boundaryPolygon.setPosition(getX(),getY());
boundaryPolygon.setOrigin(getOriginX(),getOriginY());
boundaryPolygon.setRotation(getRotation());
boundaryPolygon.setScale(getScaleX(),getScaleY());
return boundaryPolygon;
}
Итак, у меня есть два прямоугольника - один на левой стороне экрана и один справа.Треугольник начинается в центре экрана, и я перемещаю его влево или вправо.Я также вращаю треугольник, чтобы проверить, работает ли обнаружение столкновения на всех его сторонах и краях.Когда я перемещаю треугольник вправо и он соприкасается с правым прямоугольником, метод protectOverlap работает нормально.Но когда я перемещаю треугольник влево и он соприкасается с левым прямоугольником, метод warnOverlap работает, только если треугольник касается стены одним из его краев, если он касается стены одной из его сторон (когда я вращаю треугольник истороны параллельны) он быстро проходит сквозь стену.
Это происходит потому, что mtv.normal.x == -1.0 (направление разделения) и треугольник перемещается на другую сторону стены.Но я не могу понять, почему Intersector.overlapConvexPolygons (poly1, poly2, mtv) устанавливает mtv.normal.x равным -1,0, что неверно.
Это класс Intersector: https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/math/Intersector.html