2016-04-20 15 views
0

ich Category_bits bin mit Kollision in Libgdx zu erfassen. Ich habe alle Werte von 0 bis 16384 verwendet. Da wir beim Initialisieren der Werte die Potenz von 2 verwenden müssen, habe ich das Limit überschritten und kann keine Bits mehr initialisieren. Der Bereich für short_ bit liegt zwischen 0 und 16384. Wenn ich das nächste Vielfache dieser Zahl verwende, erkennt Category_bits nach der Umwandlung in einen kurzen Wert keine Kollision zwischen Objekten. Es passiert nichts, wenn das Objekt kollidiert, wenn ich der Wert größer als 16384 gesetztKollision Bit seinen Maximalwert erreicht, während der Initialisierung in Libgdx

Hier ist, wie ich die Werte zu initialisieren,

public static final short x = 0; 
    public static final short y = 1; 
    public static final short z = 2; 
    public static final short a = 4; 
    public static final short b = 8; 
    public static final short c = 16; 
      ..... 
    public static final short d = 16384; 
    public static final short e = (short) 32768; // exceeded the limit so type casted the number to short 

Wenn ich Typ umwandeln und verwenden Sie es, nichts Kollisionserkennung geschieht. Ich muss Kollision in vielen Dingen in meinem Spiel feststellen, also brauche ich die Lösung, um dieses Problem loszuwerden. Bitte helfen Sie. Danke im Voraus.

Antwort

1

Ich würde dringend empfehlen, überprüfen Sie erneut über Ihren Code und entscheiden, ob Sie eigentlich so viele verschiedene Kategorien benötigen. Selbst wenn Sie so viele verschiedene Arten von Objekten haben, dass Sie die gleichen Kollisionsfilter in nur einem Bit zusammen gruppieren könnten, können Sie andere Methoden verwenden, um festzustellen, welcher "Typ" der Entität in eine Kollision involviert ist.

Wenn Sie wirklich so viele verschiedene Objekte verwenden müssen, dann hat die Klasse Box2d World eine Methode setContactFilter(ContactFilter filter), mit der Sie eine benutzerdefinierte ContactFilter angeben können. Dies enthält eine shouldCollide(Fixture a, Fixture b), die wahr zurückgibt, wenn a und b kollidieren sollten und umgekehrt.

+0

Könnten Sie bitte geben Sie mir ein Beispiel h hilft Verwenden Sie Gruppierung in Box 2d Kollision? Weil es dafür nicht viele Tutorials gibt !! Ich folgte diesem Blog http://www.aurelienribon.com/blog/2011/07/box2d-tutorial-collision-filtering/ und ich war verwirrt von, warum wir einen negativen Wert zum Kollisionsbit zuordnen müssen? @ Basim Khajwal – Anusha

-1

Kurz funktionierte auch für mich mit Minuszahlen, weil es von -32768 bis 32767 reicht, also können Sie auch -32678, -16384 und so weiter verwenden.

Ich weiß nicht, wie den Kontakt Filter verwenden, aber ich arbeite mit Userdata, die auch für mich ziemlich gut funktioniert.

, wenn Sie Ihren Körper schaffen, schrieb ich etwas wie folgt aus:

b2body.createFixture(fdef).setUserData("something"); 

und in meiner Kollisionserkennung verwendet ich so etwas wie dieses:

public class WorldContactListener implements ContactListener{ 

    @Override 
    public void beginContact(Contact contact) { 
     Fixture fixA = contact.getFixtureA(); 
     Fixture fixB = contact.getFixtureB(); 

     int cdef = fixA.getFilterData().categoryBits | fixB.getFilterData().categoryBits; 

switch(cdef) { 

case BreedingSeason.HERO_BIT | BreedingSeason.TRAMPOLIN_BIT: 
      if(fixA.getUserData() == "somethingElse" && fixB.getUserData() == "something") { 
       ... 
      } else if(fixB.getUserData() == "somethingElse" && fixA.getUserData() == "something") { 
       ... 
      } 
      break; 
} 

und vergessen Sie nicht, die Pause nach jedem Fall im Schalter;)

ich hoffe, das Sie

+0

aber nicht 32767, ich kann nicht erklären, warum, aber es hat nicht für mich gearbeitet – SomeoneWithSomething