2016-04-13 4 views
0

Ich versuche, mich in box2d zurechtzufinden, und bin unsicher, wie ich mit Raycast-Callbacks die Sichtlinienerkennung durchführen kann.Mehrfaches Raycasting für die Sichtlinie

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; 
     } 

Oben ist meine Callback-Methode, die durch genannt wird:

 world.rayCast(callback, startp, endp); 

Die obige Zeile ist in der Update-Methode und kontinuierlich aufgerufen.

Jetzt ist das Problem, dass ich mehrere Objekte diesen Raycast zu tun, was passiert ist, dass Fixtures in eine Warteschlange bei Kontakt hinzugefügt werden und es gibt einige Code in Update-Methode, die überprüft, ob das erste Element in der Warteschlange Player ist. Wenn es ein Spieler ist, wird Projektil abgefeuert.

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

Alle diese scheinen ein bisschen chaotisch und nicht vollständig funktioniert entweder, weil ich mehrere Körper Strahlwerfprozessoren und die Callback-Methode.

Gibt es einen effizienteren Weg dies zu tun oder vielleicht die reportRayFixtue Methode irgendwie zu bearbeiten? Ich kann mir nicht eine Möglichkeit, die Parameter zu bearbeiten :( Vielen Dank für Ihre Zeit.

Antwort

0

Eine Sache, die Sie vielleicht prüfen wollen (man könnte bereits wissen) ist, dass die reportRayFixture ist nicht in beliebiger Reihenfolge aufgerufen

Um die richtige Reihenfolge zu erhalten, können Sie den Parameter fraction verwenden, um zu messen, welches das ist Je kleiner der Bruch ist, desto näher ist er am Startpunkt und umgekehrt.Um das erste Fixture zu erhalten, würden Sie den kleinsten Bruchteil des Callbacks im Auge behalten.Hoffentlich löst das Ihre Probleme.

+0

Vielen Dank .. Hat geholfen, das Problem zu lösen. Verwenden einer globalen Variablen in der RayCastCallback-Implementierung, um den Min-Bruch und die damit verbundene Fixture zu verfolgen. – Littleone

+0

Können Sie mir zeigen, wie Sie es gemacht haben? – ROSA

Verwandte Themen