Проблема столкновения с Libgdx - PullRequest
1 голос
/ 07 июля 2019

Я делаю RPG сверху вниз. Я почти закончил систему движений, но я не могу понять, как определить, должен ли игрок блокировать игрока. В моем файле tmx есть два слоя объектов, с которыми игрок должен взаимодействовать на любой карте: слой NPC и слой столкновений. Я пробовал, чтобы NPC были объектами плиток (выходят как RectangleMapObjects) и обычно имеют высоту 1,5 плитки, а объекты столкновения являются полигонами, также у меня есть несколько плиток, к которым я хочу получить доступ только с одной стороны, поэтому мне нужно знать, если три отдельные точки, которые зависят от направления, находятся внутри столкновения. Через несколько часов вот что у меня есть:

public boolean canWalk(float xc, float yc, String dir)
{
    int i = 0;
    while (true)
    {
        try
        {
            RectangleMapObject temp = (RectangleMapObject) ents.get(i);
            if (!temp.equals(player))
            {
                if (dir.equals("s"))
                {
                    float cy = ((y) * 16) - 2;
                    float cx = ((x) * 16) + 2;
                    return !(temp.getRectangle().contains(cx + 6, cy + 8));
                }
                else if (dir.equals("n"))
                {
                    float cy = ((y + 1) * 16) + 2;
                    float cx = ((x) * 16) + 2;
                    return !(temp.getRectangle().contains(cx, cy) && temp.getRectangle().contains(cx + 6, cy) && temp.getRectangle().contains(cx + 12, cy));
                }
                else if (dir.equals("e"))
                {
                    float cy = ((y) * 16) + 2;
                    float cx = ((x + 1) * 16) + 2;
                    return !(temp.getRectangle().contains(cx, cy) && temp.getRectangle().contains(cx, cy + 6) && temp.getRectangle().contains(cx, cy + 12));
                }
                else if (dir.equals("w"))
                {
                    float cy = ((y) * 16) + 2;
                    float cx = ((x) * 16) - 2;
                    return !(temp.getRectangle().contains(cx, cy) && temp.getRectangle().contains(cx, cy + 6) && temp.getRectangle().contains(cx, cy + 12));
                }
            }
        }
        catch (IndexOutOfBoundsException e)
        {
            break;
        }
        i++;
    }
    versionid = "" + i + ",";
    i = 0;
    while (true)
    {
        try
        {
            PolygonMapObject temp = (PolygonMapObject) cols.get(i);
            if (dir.equals("s"))
            {
                float cy = ((y) * 16) - 2;
                float cx = ((x) * 16) + 2;
                return !(temp.getPolygon().contains(cx, cy) && temp.getPolygon().contains(cx + 6, cy) && temp.getPolygon().contains(cx + 12, cy));
            }
            else if (dir.equals("n"))
            {
                float cy = ((y + 1) * 16) + 2;
                float cx = ((x) * 16) + 2;
                return !(temp.getPolygon().contains(cx, cy) && temp.getPolygon().contains(cx + 6, cy) && temp.getPolygon().contains(cx + 12, cy));
            }
            else if (dir.equals("e"))
            {
                float cy = ((y) * 16) + 2;
                float cx = ((x + 1) * 16) + 2;
                return !(temp.getPolygon().contains(cx, cy) && temp.getPolygon().contains(cx, cy + 6) && temp.getPolygon().contains(cx, cy + 12));
            }
            else if (dir.equals("w"))
            {
                float cy = ((y) * 16) + 2;
                float cx = ((x) * 16) - 2;
                return !(temp.getPolygon().contains(cx, cy) && temp.getPolygon().contains(cx, cy + 6) && temp.getPolygon().contains(cx, cy + 12));
            }
        }
        catch (IndexOutOfBoundsException e)
        {
            break;
        }
        i++;
    }
    versionid = versionid + i;
    return true;
}

И он всегда возвращает истину

Решил мою собственную глупую ошибку: каждый чек имел гарантированный возврат, а не возвращался только при необходимости

1 Ответ

0 голосов
/ 07 июля 2019

Я понял, что это функциональный код для тех, кто хочет его

public boolean canWalk(String dir)
{
    int i = 0;
    while (true)
    {
        try
        {
            RectangleMapObject temp = (RectangleMapObject) ents.get(i);
            if (!temp.equals(player))
            {
                if (dir.equals("s"))
                {
                    float cy = ((y) * 16) - 2;
                    float cx = ((x) * 16) + 2;
                    if (temp.getRectangle().contains(cx + 6, cy + 8))
                    {
                        return false;
                    }
                }
                else if (dir.equals("n"))
                {
                    float cy = ((y + 1) * 16) + 2;
                    float cx = ((x) * 16) + 2;
                    if (temp.getRectangle().contains(cx, cy) && temp.getRectangle().contains(cx + 6, cy) && temp.getRectangle().contains(cx + 12, cy))
                    {
                        return false;
                    }
                }
                else if (dir.equals("e"))
                {
                    float cy = ((y) * 16) + 2;
                    float cx = ((x + 1) * 16) + 2;
                    if (temp.getRectangle().contains(cx, cy) && temp.getRectangle().contains(cx, cy + 6) && temp.getRectangle().contains(cx, cy + 12))
                    {
                        return false;
                    }
                }
                else if (dir.equals("w"))
                {
                    float cy = ((y) * 16) + 2;
                    float cx = ((x) * 16) - 2;
                    if (temp.getRectangle().contains(cx, cy) && temp.getRectangle().contains(cx, cy + 6) && temp.getRectangle().contains(cx, cy + 12))
                    {
                        return false;
                    }
                }
            }
        }
        catch (IndexOutOfBoundsException e)
        {
            break;
        }
        i++;
    }
    i = 0;
    while (true)
    {
        try
        {
            PolygonMapObject temp = (PolygonMapObject) cols.get(i);
            if (dir.equals("s"))
            {
                float cy = ((y) * 16) - 2;
                float cx = ((x) * 16) + 2;
                if (temp.getPolygon().contains(cx, cy) && temp.getPolygon().contains(cx + 6, cy) && temp.getPolygon().contains(cx + 12, cy))
                {
                    return false;
                }
            }
            else if (dir.equals("n"))
            {
                float cy = ((y + 1) * 16) + 2;
                float cx = ((x) * 16) + 2;
                if (temp.getPolygon().contains(cx, cy) && temp.getPolygon().contains(cx + 6, cy) && temp.getPolygon().contains(cx + 12, cy))
                {
                    return false;
                }
            }
            else if (dir.equals("e"))
            {
                float cy = ((y) * 16) + 2;
                float cx = ((x + 1) * 16) + 2;
                if (temp.getPolygon().contains(cx, cy) && temp.getPolygon().contains(cx, cy + 6) && temp.getPolygon().contains(cx, cy + 12))
                {
                    return false;
                }
            }
            else if (dir.equals("w"))
            {
                float cy = ((y) * 16) + 2;
                float cx = ((x) * 16) - 2;
                if (temp.getPolygon().contains(cx, cy) && temp.getPolygon().contains(cx, cy + 6) && temp.getPolygon().contains(cx, cy + 12))
                {
                    return false;
                }
            }
        }
        catch (IndexOutOfBoundsException e)
        {
            break;
        }
        i++;
    }
    return true;
}

Просто записка, на которую я ответил, чтобы закрыть ее

...