2015-02-15 2 views
4

Я новичок в libGDX, и из того, что я могу сказать, класс Intersector имеет методы перекрытия для Rectangle/Rectangle, Circle/Circle, Circle/Rectangle и Polygon/Polygon, но по какой-то причине он, похоже, не имеет методов проверки Polygon/Rectangle или Polygon/Circle.Java/libGDX - как проверить столкновение многоугольника с прямоугольником или кругом

Есть ли рекомендуемый способ проверки столкновения между полигоном и прямоугольником/кругом?

Кроме того, есть ли причина, почему это было исключено из класса Intersector? (т. е. следует ли это избегать? Если да, то в чем рекомендуемая альтернатива?)

ответ

3

Лучший способ справиться с этими столкновениями - использовать физический движок, такой как Box2D, который уже поставляется с Libgdx. Когда в Box2D возникает столкновение, событие запускается, и вы можете легко справиться с этим событием. Так что вам стоит взглянуть на here.

Конечно, есть другие способы борьбы с обнаружением столкновений. С небольшим количеством математики вы могли бы точно выяснить, что вам нужно по своему усмотрению, также Box2D поставляется с множеством других функций, которые вам принесут пользу.

+0

Хе-хе спасибо, я на самом деле натолкнулся на эту точную ссылку через некоторое время после публикации этого вопроса. У меня есть закладка для изучения, хотя из того, что я могу сказать, потребуется начать этот проект с самого начала, чтобы реализовать Box2D, тем временем я только что реализовал проверенную проверку Poly/Rect и проверку Poly/Circle Я нашел еще одну нить. Конечно, я планирую начать с рамки Box2D с помощью моего следующего проекта! – 1337ingDisorder

+0

Отправил бы ответ, но SO требует, чтобы у меня было больше очков репутации, прежде чем я могу сказать, что вы ответили на мой вопрос. – 1337ingDisorder

+0

@ 1337ingDisorder Хорошо, что реализация Box2D действительно, действительно не проблема, даже если у вас уже есть большая игра. Вы просто создаете тело и экипируете его с помощью приспособлений и фигур, а затем просто нарисуйте Sprite на этих телах. Если вы скорее визуальный ученик, есть много видеороликов, которые охватывают эту тему на YouTube. Не беспокойтесь о повышении, я здесь, чтобы помочь ... не получить upvotes :) – dHoja

9

Решение Я использовал для осуществления этих проверок без Box2D выглядит следующим образом ..

Проверка столкновений между Polygon и Rectangle:

// Check if Polygon intersects Rectangle 
private boolean isCollision(Polygon p, Rectangle r) { 
    Polygon rPoly = new Polygon(new float[] { 0, 0, r.width, 0, r.width, 
      r.height, 0, r.height }); 
    rPoly.setPosition(r.x, r.y); 
    if (Intersector.overlapConvexPolygons(rPoly, p)) 
     return true; 
    return false; 
} 

Проверьте столкновений между Polygon и кругом:

// Check if Polygon intersects Circle 
private boolean isCollision(Polygon p, Circle c) { 
    float[] vertices = p.getTransformedVertices(); 
    Vector2 center = new Vector2(c.x, c.y); 
    float squareRadius = c.radius * c.radius; 
    for (int i = 0; i < vertices.length; i += 2) { 
     if (i == 0) { 
      if (Intersector.intersectSegmentCircle(new Vector2(
        vertices[vertices.length - 2], 
        vertices[vertices.length - 1]), new Vector2(
        vertices[i], vertices[i + 1]), center, squareRadius)) 
       return true; 
     } else { 
      if (Intersector.intersectSegmentCircle(new Vector2(
        vertices[i - 2], vertices[i - 1]), new Vector2(
        vertices[i], vertices[i + 1]), center, squareRadius)) 
       return true; 
     } 
    } 
    return false; 
} 

Проверка на поли/круг, иллюстрированная здесь, была написана Криштиану Сантосом в this thread, а проверка Poly/Rect - это быстрое решение доморощенного I придумал.

Смежные вопросы