2016-04-13 2 views
0

Я пытаюсь найти свой путь вокруг box2d, и я не уверен в своем подходе к обнаружению прямой видимости с использованием обратных вызовов raycast.Несколько Raycasting для линии видимости

private RayCastCallback callback = new RayCastCallback() { 
     @Override 
     public float reportRayFixture(Fixture fixture, Vector2 point, Vector2 Normal, float fraction) { 
      collision.set(point); 

      lineOfSight.addLast(fixture); 

      if (fixture.getFilterData().categoryBits != BIT_PLAYER) { 
       System.out.println("ray hit wall"); 
       return fraction;} 
      else if (fixture.getFilterData().categoryBits == BIT_PLAYER) { 
       System.out.println("player found"); 

       return fraction; 
      } 

      return 0; 
     } 

Выше мой метод обратного вызова, который вызывается через:

 world.rayCast(callback, startp, endp); 

выше строка в методе обновления и называется непрерывно.

Теперь проблема в том, что у меня есть несколько объектов, выполняющих этот raycast, поэтому происходит то, что светильники добавляются в очередь при контакте, и есть некоторый код в методе обновления, который проверяет, является ли первый элемент в очереди игроком. Если это игрок, выстреливается снаряд.

if (lineOfSight.first().getFilterData().categoryBits == BIT_PLAYER) { 
        lineOfSight = new Queue<Fixture>(); 
        createBullet(); 
       } else { 
        lineOfSight.clear(); 
       } 

Все это, кажется, немного грязный и не полностью функционален, либо потому, что у меня есть несколько тел лучей литье и с помощью метода обратного вызова.

Есть ли более эффективный способ сделать это или, возможно, каким-то образом изменить метод reportRayFixtue? Я не могу придумать способ для редактирования параметров :( Благодарим Вас за ваше время.

ответ

0

Одна вещь, которую вы могли бы хотеть рассмотреть (возможно, уже знаете это), что reportRayFixture является не вызывается в любом порядке Таким образом, даже если игрок был первым на линии видимости, это может быть не первое приспособление, вызываемое этим методом.

Для правильного заказа вы можете использовать параметр fraction для измерения того, какой из них является первый раз. Чем меньше доля, тем ближе к начальной точке и наоборот. Чтобы получить первое устройство, вы будете отслеживать наименьшую долю, вызванную обратным вызовом. Надеемся, это решит ваши проблемы.

+0

Спасибо большое .. Помогло решить проблему. Использование глобальной переменной в реализации RayCastCallback для отслеживания минимальной доли и связанного с ней инструментария. – Littleone

+0

Можете ли вы показать мне, как вы это сделали? – ROSA

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