2009-03-25 7 views
1

Flash-Box2D Frage (Aber ich denke, der „Flash“ Teil spielt keine Rolle)Box2D: Wie erkennt man, dass ein Objekt nicht mehr mit einem anderen Objekt kollidiert?

es Angenommen, ein Objekt A, das das Zeichen und ein Objekt B, die den Boden

die Angenommen ist Charakter kann nur gehen, wenn er den Boden berührt.

Es gibt eine Box 2d Kontakt Listener, die ich erkennen kann, wenn ein Objekt andere Objekte berührt, so kann ich es verwenden, um zu hören, wenn das Zeichen den Boden berührt. Aber woher weiß ich, ob der Charakter den Boden verlassen hat?

Danke fürs Lesen.

Antwort

4

Angenommen, es ist ein Objekt A, das ist das Zeichen, und ein Objekt B, die den Boden

Angenommen, der Charakter nur ist gehen kann, wenn er den Boden berührt.

Ihr Objekt A Unter der Annahme b2Body Objecta genannt und ObjectB ist ein weiterer b2Body genannt ObjectB und Sie Welt m_world genannt. Wenn objectB die Masse ist, denke ich, dass es eine Dichte von 0 hat, die es statisch macht. Wenn Sie überprüfen möchten, ob objektA über objectB ist, haben Sie zwei Optionen, entweder durch die Körper selbst, dh durch die Verwendung von Box2d-Maßeinheiten (1 Meter = 30 Pixel), , die den Verweis auf Ihre benutzerdefinierten Clips über die userData-Eigenschaft verwenden.

Der Vorteil der Verwendung der zweiten, ich denke, ist, dass Sie die normalen Pixel-Einheiten verwenden werden, ohne zu berücksichtigen, dass Sie Ihren Registrierungspunkt in der Mitte nicht bei 0,0 haben.

Also, in Ihrer Aktualisierungsschleife (wo Sie m_world.Step nennen) würden Sie so etwas wie haben:

if((objectA.m_userData.y + objectA.m_userData.height*.5) < (objectB.m_userData.y-objectB.m_userData.height*.5)) trace('objectA is above ground'); 
else trace('objectB is on the ground'); 

Lesen Sie einfach noch einmal Sie kommentieren und aktualisiert.

Ich fing an, einen jsfl-Befehl für Flash zu schreiben, der die x, y, Breite, Höhe von Elementen auf der Bühne erhält und den box2d-Code erzeugte. Ich habe es benutzt, um dieses einfache Spiel zu machen: Es scheint, dass ich das Rad nicht neu erfinden muss, da jemand anderes schon etwas ziemlich Gleichmäßiges gemacht hat. Wir kommen gerade von LFPUG wo Carlos Ulloa ein wenig über box2d auch gesprochen und er auf diese Sache hingewiesen:

http://www.sideroller.com/wck/

Es Arrays für komplexere Form Definitionen zu koordinieren zu erzeugen scheint das ist, was Sie brauchen. In gewisser Weise ist dies nicht die vollständige Antwort auf Ihre spezifische Frage, aber es ist ein Schritt weiter entwickelt.

Aus Ihrer Beschreibung klingt das Spiel wirklich interessant. Halten Sie uns auf dem Laufenden :)

+0

die Objekte in meinem Blitz immer bewegt: p sie einige Lebensform sind, die Aktionen weiterhin tun .. aber ich muss wissen, ob sie auf dem Boden oder nicht. So isSleeping wird nicht in der Bodenerkennung helfen. Vielen Dank für deine Antwort. – Unreality

+0

Ich habe meine Antwort nach Ihrem Kommentar bearbeitet. Hoffe das hilft. –

+0

Box2D nimmt keine Pixeleinheiten an. 1 Einheit! = 30 Pixel! – Zifre

1

Im Kontaktlistener gibt es eine Methode namens Remove (b2ContactPoint). Diese Methode nennt die Physik-Engine zwei Körper, die sich nicht mehr berühren. Mit anderen Worten, sie haben keine Kontaktpunkte mehr. Sie können an diesem Punkt feststellen, dass der Körper A, der der Akteur ist, nicht schwebt.

Eine andere coole Lösung wird Raycast vom Schauspieler auf den Boden sein, überprüfen Sie die Entfernung zwischen ihnen und Sie können feststellen, ob Sie schweben oder zu Fuß sind. Hoffe, das funktioniert

1

Ich löste dies eine Weile zurück, obwohl meine Lösung doof ist, funktioniert es wirklich gut. Ich stelle nur die Dichte, die Wiederherstellung und die Reibung des Bodens auf einige "magische" Zahlen ein und in meinem Kontakt-Listener überprüfe ich einfach, ob einer dieser Körper diese Zahlen hat und dass der andere Körper mein Sprite ist.

Wie ich schon sagte, es ist doof, aber ich muss noch etwas anderes so einfach sehen, das funktioniert.

1

Ich bin sicher, dass die box2d-Version geändert hat, seit Sie Ihre Frage gestellt haben.

Eine gängige Methode zur Überprüfung der Bodenkollision besteht derzeit darin, die Richtung der "normalen" Kollision zu überprüfen.

Wenn es aufwärts geht, dann gehen Sie voraus und nehmen an, dass der Held geerdet ist und gehen lässt.

andere Teile Ihrer Frage

gibt es BeginContact und EndContact zu beantworten.

Ich speichere oft eine var geerdet: Boolesche Variable auf meinem Helden, um den Überblick zu behalten, und ich setze es manuell auf falsch, wenn ich versuche zu vermeiden, dass der Sprung mehr als einmal passiert, bevor der Held den Boden verlässt.

ich hoffe, das hilft etwas.

2

Ich glaube, Sie wurden für diese Suche:

override public function EndContact(contact:b2Contact):void 
     { 
      if (contact.GetFixtureA().GetBody().GetUserData() != null) 
      { 
Verwandte Themen