2016-10-13 5 views
0

Je travaille avec libGDX. Quand je suis en train de Box2D pour créer un appareil ayant une forme de polygone i .: rencontrer l'erreur suivanteBox2D renvoie une erreur lors de la création du projecteur avec Polygonshape

java: ./Box2D/Collision/b2Distance.h:103: const b2Vec2& b2DistanceProxy::GetVertex(int32) const: Assertion `0 <= index && index < m_count' failed. 

Quand je ne fais pas de world.step() Box2D, je ne suis pas cette erreur plus.

J'ai donc tout mis en commentaire dans mon WorldContactListener et j'ai de nouveau ajouté world.step().

Je reçois toujours la même erreur. Lorsque je remplace la forme polygonale par une forme circulaire, tout fonctionne correctement. Voici donc comment je crée mon polygone forme:

PolygonShape shape = new PolygonShape(); 

float ppm = Game.PixelsPerMeter; 

Vector2[] vertices = new Vector2[3]; 

vertices[0] = new Vector2(0f/ppm , 0f ); 
vertices[1] = new Vector2(1/ppm , 1f/ppm ); 
vertices[2] = new Vector2(0f/ppm ,1f/ppm); 

shape.set(vertices); 

Et voici comment je suis d'ajouter tout ce monde Box2D:

float ppm = Game.PixelsPerMeter 

    BodyDef bdef = new BodyDef(); 
    bdef.position.set(100/ ppm, 200/ ppm); 
    bdef.type = BodyDef.BodyType.DynamicBody; 

    b2dbody = world.createBody(bdef); 

    FixtureDef mainFdef = new FixtureDef(); 


    mainFdef.shape = Shape; //this is the shape from above of course 
    b2dbody.createFixture(mainFdef).setUserData(this); 

Je serais vraiment heureux si vous pouviez me dire Qu'est-ce qui ne va pas!

Merci

+0

Quelle est la valeur de ppm? – IronMonkey

+0

@IronMonkey c'est 75 – strammermax

+0

Essayez shape.set (vertices, vertices.length); – IronMonkey

Répondre

1

Plus d'une conjecture sauvage, mais avez-vous votre conversion ppm aller dans le bon sens? 1/ppm (que vous indiquez 75) donne une valeur assez petite. Je n'ai pas creusé dans les entrailles du code box2d, mais comme cela fonctionne mieux quand les objets sont définis en mètres, la création d'un polygone avec les sommets 0,0 et 0,0,0133 (1cm) pourrait le "confondre" (ce qui signifie une sorte de erreur d'arrondi ou quelque chose quelque part dans le code, donc il ne peut pas distinguer les vertices et pense qu'il n'y en a pas au moins 3). Par exemple, une application bare bones avec 3 versions de votre code vertices donne des exceptions d'exécution sur le 2 premières versions (petites valeurs) mais aucune exception d'exécution avec des valeurs plus élevées:

/* Version 1 (your code) - Runtime error 
vertices[0] = new Vector2(0f/ppm , 0f ); 
vertices[1] = new Vector2(1f/ppm , 1f/ppm ); 
vertices[2] = new Vector2(0f/ppm ,1f/ppm); 
*/ 

/* Version 2 (your actual values) - Runtime error 
vertices[0] = new Vector2(0f , 0f ); 
vertices[1] = new Vector2(0.0133f , .0133f ); 
vertices[2] = new Vector2(0f , 0.0133f); 
*/ 

/* Version 3 (larger values) - No error 
vertices[0] = new Vector2(0f , 0f ); 
vertices[1] = new Vector2(1f , 1f ); 
vertices[2] = new Vector2(0f ,1f); 
*/ 
+0

merci, mais cela n'a pas résolu le problème – strammermax