Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.08.2013, 23:09

Box2D Body immer noch da!?

Hi!
Ich zerstöre einen Body.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
for(unsigned int j=0; j<killingList.size(); ++j)
    if(!entities[i].isDead && killingList[j]==entities[i].a)
    {
        for(b2Fixture *Fixture=entities[i].body->GetFixtureList(); Fixture;)
        {
            b2Fixture* fix = Fixture;
            Fixture = Fixture->GetNext();
            entities[i].body->DestroyFixture(fix);
        }
        world.DestroyBody(entities[i].body);
        entities[i].isDead=true;
    }

Mein Problem ist, dass er scheinbar trotzdem da ist! Es wird fröhlich weiter mit kollidiert. Was muss ich denn noch machen? 8|
Das Manual stimmt mir eigentlich zu oder ich übersah eine Stelle die besagt, dass das den Body nicht komplett rauskickt...

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (07.08.2013, 00:35)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

07.08.2013, 00:05

Ein Body hat nichts mit Kollisionen zu tun.
Musst du vielleicht auch die Shapes explizit löschen?
Ansonsten: http://stackoverflow.com/questions/42930…stroying-bodies

PS: Ziemlich komische Variante einer for-Schleife (die innere)!

3

07.08.2013, 00:22

'ne b2Fixture hat ja einen Pointer auf das Shape.
Die killingList ist leider genau das, was bei stackoverflow empfohlen wird.
Ich muss wohl mit der Positionierung ein wenig spielen...
Inwiefern komisch?
Mir ist sonst nichts eingefallen, was die Validität von der Fixture weiter erhält, sodass die Schleife weiter durchlaufen und ich somit alle Fixtures löschen kann.
entities[i].isDead wurde auch nur angelegt, falls das Teil denn schon gelöscht wurde, ansonsten gibts access violations.
Die momentane Position im Syntax des obigen Codes ist nach world.Step und vor dem Rendervorgang mittels sf::RenderTarget::draw, ich spiele mal ein wenig herum...

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (07.08.2013, 00:30)


4

07.08.2013, 12:57

Ich cheate mich erst einmal darum herum und ändere die Position des betreffenden b2Body-Objekts auf einen absurden Wert.
Schön ist das freilich nicht. :(

MfG
Check

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

5

07.08.2013, 13:04

Ich habe diesen Code bei einem Levelwechsel drin:

C-/C++-Quelltext

1
2
3
4
5
6
// Delete every static body
for(std::size_t i = 0; i < m_physics_body_list.size(); i++)
{
    m_physics_world.DestroyBody(m_physics_body_list[i]);
}
m_physics_body_list.clear();

Es funktioniert einwandfrei, mit den Fixtures mache ich erst gar nichts.

6

07.08.2013, 13:09

Betreffende Zeilen wären ja nur heraus zu kommentieren, was ich prompt mal tat. (man weiß ja nie)
Trotzdem scheint der Body da zu bleiben.

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

07.08.2013, 13:38

Bei Rickety Racquet geht's auch, also irgendwas ist bei dir faul. Sicher, dass Du die selbe World benutzt und nicht eine völlig andere? Z.B. wegen einem Copy-Constructor?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

07.08.2013, 13:59

Die Welt wird in der selben Funktion definiert.
Ich gucke die Tage mal in den Source von Rickety Racquet, um mir, was Box2D und den Aufbau im Code davon betrifft, eventuell etwas abzugucken.
Schließlich ist das nicht nur das einzige Problem.

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

07.08.2013, 15:24

Ich glaub da wirst Du keine Freude dran haben ;) Die Welt wird aus einem XML-Monster generiert. Das Löschen der Bodies allerdings sieht in etwa so aus, wie auch patrick das schon vorgezeichnet hat.

Quellcode

1
2
3
4
5
6
7
8
    void unbindBody()
    {
        if(m_world != nullptr && m_body != nullptr)
        {
            m_world->DestroyBody(m_body);
            m_body = nullptr;
        }
    }
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

07.08.2013, 18:05

Wer hat schon Freude im fremden Code nach Wirkungsweisen zu suchen? :D
Aber danke, ich werde, wenn das Mini-Projekt "fertig" ist, wohl mal jede einzelne Zeile, die irgendwas mit Box2D zu tun hat, auf Anomalien überprüfen. Vielleicht wirds dann was....
Der Code scheint ja sowieso irgendwie irgendwo ziemlich Trash zu sein. :S

MfG
Check

Werbeanzeige