2012-04-11 8 views
1

Ich mache ein Spiel in cocos2d mit box2d und ich laufe in einige Probleme.Box2d dynamischer Kugelkörper, der in statische Körper sinkt

Ich habe das Programm durchlaufen durch eine TileMaps (.TMX) Zeilen und Spalten, Suche nach Kacheln mit einer "kollidierbaren" Eigenschaft auf "True" gesetzt. Wenn einer gefunden wird, wird ein quadratischer statischer box2d-Körper (mit Fixtures und allen) an der Position dieses Tiles gesetzt. Im Wesentlichen sollte ich mit einer Reihe von quadratischen Körpern enden, die ich nach der Iteration (abhängig von der Kachelkarte) brauche. Ich habe auch einen quadratischen dynamischen Körper, der durch eine Geste gesteuert wird (Aufwärtsbewegung, Aufwärtsbewegung, Abwärtsbewegung usw.), und es sollte sich nur in eine von vier Richtungen bewegen: oben, unten, links, rechts. Die Restitution des Körpers ist 0.0f, so dass es beim Aufprall ohne Rückprall stoppt, und die Reibung ist ebenfalls 0.0f, weil es nicht benötigt wird (die Schwerkraft der Welt ist ebenfalls 0.0f, 0.0f). Da die Iteration durch die Tellemap nur Karos platzieren kann, die quadratisch sind, bestehen die "Wände" im Spiel aus mehreren dieser Quadrate, die aneinandergereiht sind, Ende an Ende, was eine bündige Kante schafft, damit der dynamische Körper kollidiert mit.

Das Problem entsteht, wenn der dynamische Körper mit der Wand der Quadrate kollidiert. Ich kontrolliere die Bewegung des Körpers, indem ich die Geschwindigkeit des Körpers entsprechend der Geste festlege. Ein Beispiel für eine Bewegung nach rechts wäre:

#define bodyVel 100 
... 
if (gestureRight) 
{ 
body->SetLinearVelocity(b2Vec2(bodyVel/PTM_RATIO, 0)); 
} 

ich den Körper als eine Kugel so eingestellt, dass, wenn es mit der Wand kollidiert wird es nicht eingebettet werden, aber ich habe einige seltsamen Ergebnisse gestoßen. Ein Beispiel wäre das:

Ich bewege den Körper nach rechts in eine Wand und es stoppt. Gut. Als nächstes möchte ich es nach oben bewegen, also zeige ich nach oben. Gut. Aber manchmal, wenn es die Wand hinaufgleitet, scheint der Körper sich an etwas "zu verfangen" und er dreht sich außer Kontrolle und in mehrere Richtungen. Schlecht. Die einzige Erklärung, die ich finden kann, ist, dass der dynamische Körper tatsächlich in der Wand beim ersten Kontakt mit dem Kopf eingebettet wird, und wenn er bei der nächsten gegebenen Bewegungsgeste die Wand hochgleitet, wird er gefangen auf der einen der Kanten der Quadrate, die die Wand bilden und wird von einem geraden Weg erschüttert. Ich bestätigte diese seltsame Aktivität, indem ich den Körper so einstellte, dass er eine feste Rotation hatte (überhaupt nicht rotierte), und folglich würde der Körper einfach aufhören, statt außer Kontrolle zu geraten. Dies wurde angesichts meiner Hypothese erwartet. Also wird der dynamische Körper eingebettet, was ich versuche zu sagen.

Ich verstehe nicht, warum das passiert, weil ich den Körper eingestellt habe, wie eine Kugel zu verhalten, um Probleme genau so zu vermeiden. Alles, was ich möchte, ist, dass ich mich auf einem geraden Weg bewegen kann - entweder nach oben, nach unten, nach links oder nach rechts -, bei Kontakt mit einer Wand anhalten und mich ohne Störung durch die Körper bewegen, die die Wand bilden .

Ich fühle mich wie, wenn ich ein Missverständnis habe, wie Kugelkörper arbeiten, sollte die Einbettung, die auftritt, kein Problem sein.

Ich habe auch DebugDraw verwendet, um zu sehen, ob die quadratischen statischen Körper eine bündige Wand erstellt haben und sie taten.

Antwort

1

Leider ist dies ein bekanntes Problem in Box2D ... from the FAQ:

Tile basierte Umgebung

verwenden viele Boxen für Ihr Gelände, weil schachtelartigen Zeichen können nicht gut funktionieren an inneren Ecken hängen bleiben. Ein zukünftiges Update auf Box2D sollte eine reibungslose Bewegung über die Kantenketten ermöglichen.Im Allgemeinen sollten Sie vermeiden, ein rechteckiges Zeichen zu verwenden, weil Kollision Toleranzen noch zu unerwünschtem Hängenbleiben führt.

Weitere Informationen finden Sie in diesem Beitrag: http://box2d.org/forum/viewtopic.php?f=3&t=3048