Я делаю 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;
}
И он всегда возвращает истину
Решил мою собственную глупую ошибку: каждый чек имел гарантированный возврат, а не возвращался только при необходимости