2016-10-11 14 views
0

Я использую интерфейс RayCastCallback ıf LibGDX. Я не мог найти способ получить ближайшую точку от начала луча. Он возвращает случайные светильники, попадающие на луч. Как я могу получить ближайшую точку столкновения между лучом и светильником?libgdx box2d raycast ближайший светильник

ответ

0

Похоже, что у вас есть большая часть кода, так как вы получаете светильники с вашего рабаста. Вам просто нужно будет пройти через все светильники, пораженные raycast, и вспомнить ближайший. Что-то вроде:

public class SomeClass { 

    private World world; 
    private Vector2 fromPoint; 
    private Vector2 toPoint; 
    private Vector2 collisionPoint = new Vector2(); 
    float closestFraction = 1.0f; 

    // ... rest of code ... 

    private void calculateCollisionPoint() { 
     RayCastCallback callback = new RayCastCallback() { 

      @Override 
      public float reportRayFixture(Fixture fixture, Vector2 point, Vector2 normal, float fraction) { 
       if (fraction < SomeClass.this.closestFraction) { 
        SomeClass.this.closestFraction = fraction; 
        SomeClass.this.collisionPoint.set(point); 
       } 

       return 1; 
      } 
     }; 

     world.rayCast(callback, fromPoint, toPoint); 
    } 
} 
+0

Спасибо, что ответили. Я действительно нашел ответ. Если вы возвращаете фракцию вместо 1, она зажимает расстояние, если вы вызываете world.rayCast настойчиво. Я думаю, что что-то не так с вашим кодом. I f – Thracian

+0

Я новичок в stackoverflow, я не могу изменить свой предыдущий комментарий. Ваш ответ правильный и более точный, чем возврат фракции. Если порядок светильников имеет значение, код выше может дать вам то, что нужно. Еще раз спасибо. – Thracian

+0

Таким образом, у iv'e было самое низкое число (самая близкая фракция), но как я могу что-то сделать с приспособлением сейчас? Как я могу напечатать ближайший класс прибора? 'if (fixture.getFilterData(). CategoryBits == FilterCollisionManager.ENEMY_BIT) { ((ObjectManager) fixture.getUserData()). DoSomeThing();' – ROSA