Java - libGdx - Столкновение между треугольником и прямоугольником не работает должным образом - PullRequest
0 голосов
/ 26 ноября 2018

Я делаю простую игру для 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

...