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

26.08.2013, 21:30

[Box2D] Wtf-Momente.

Hi! Irgendwie muss ich ja grinsen. Box2D und ich scheinen eine gute Beziehung aufzubauen. - Egal. :D
Ich hätte ein paar bislang ziemliche WTF-Momente im Bezug auf Box2D.
Ich beschreibe erst mal die Momente die ich (fehlerhaft?) mit Box2D verbinde und füge dann Codebeispiele hinzu.

(1) Der Body wird auf eine Position gesetzt, Velocity ist 0. Nun fällt der Body ab und an einfach mal nicht hinunter, trotz Gravity.
Das Verhalten fällt verstärkt auf, wenn er sich auf X zusätzlich bewegt.

(2) Beim Bewegen auf X fliegt eine augenscheinlich exakte Kopie des Objekts, nach der Erzeugung mehrerer dieser, einfach so in irgendeine Richtung.
Die Werte da mit dem Debugger abzufragen ist etwas schwer, aber ich glaub mir fehlt einfach ein Hotkey für ein sofortiges breaken.

(3) Jene Kopie startet ganz wo anders und scheint auf der Position auch nicht vorhanden zu sein, zumindest die b2Fixture + b2Body. (keine Kollision)
Die Positionen (sf::Transofrm und b2Body) scheinen richtig.

(4) Ein Objekt, welches erzeugt wird, und schließlich in einen Container kopiert wird, ist einfach nicht da. Es wird gerendert. Die Positionen sind richtig.
Augenscheinlich ist alles ok.

Von dem Grad sind 1 und 4 am ehesten zu besprechen, bei den anderen beiden kann ich mir noch vorstellen innerhalb von einer Debug-Session und 5634 Espresso das ganze zu lösen.
Aber ansonsten finde ich keinen wirklichen Fehler und schiebe es natürlich auf die böse Lib. :D
Zu den Codes: (auf das wesentlichste reduziert und unnötig lange Ausdrücke zusammengefasst [fallen meist als Deutsche auf])

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// (1)
//Ich kann nicht eingrenzen was hier Relevanz hat und was nicht, sollte ich mal alle Aktionen die in Verbindung zum Box2D-Objekt stehen auflisten? Ich denke nicht... Auf der anderen Seite...
//Vielleicht ist das Problem ja irgendwie bekannt, deshalb lass ich den Codebatzen erst mal weg


////////
// (2) + (3)
//Objekt hinzufügender Gültigkeitsbereich
{
    GhostObject ghost;
    ghost.Initialize(m_physicsWorld, m_object);
    m_ghostObjects.push_back(ghost);
}
//Initialize
{
    Init(rhs.GetShape(), rhs.GetMoves());
    InitPhys(world, EN_GPLAYER, EN_OBJECT);
    m_body->SetTransform(b2Vec2(m_moves[0].pos.x, m_moves[0].pos.y), 0.f);
}
//Init
{
    std::shared_ptr<sf::RectangleShape> ptr(new sf::RectangleShape(shape));
    m_shape = std::move(ptr);
}
//InitPhys
{
    bodydef.position.Set(m_shape->getPosition().x/30.f, m_shape->getPosition().y/30.f);
    bodydef.type = b2_dynamicBody;
    m_body = world.CreateBody(&bodydef);

    fixturedef.shape = &box;
    fixturedef.filter.categoryBits = cat; //param 2
    fixturedef.filter.maskBits = mask; //param 3
    m_body->CreateFixture(&fixturedef);

    m_shape->setOrigin(m_shape->getSize().x/2.f, m_shape->getSize().y/2.f);
}
//Updaten der Position
{
    m_shape->setPosition(m_body->GetPosition().x*30.f, m_body->GetPosition().y*30.f);
}


///////
// (4)
//hinzufügen
{
    LevelSegment lvSeg;
    lvSeg.Init(sf::FloatRect(wertX, wertY, wert2X, wert2Y), m_physicsWorld);
    m_levelSegments.push_back(lvSeg);
}
//Initialisierung (Objekt soll statisch einfach am Geschehen beteiligt sein
{
    bodyDef.position.Set(rect.left/30.f+rect.width/2.f/30.f, rect.top/30.f+rect.height/2.f/30.f);
    m_body = world.CreateBody(&bodyDef);

    shape.SetAsBox(rect.width/2.f/30.f, rect.height/2.f/30.f);

    fixtureDef.shape = &shape;
    m_body->CreateFixture(&fixtureDef);

    m_shape.setSize(sf::Vector2f(rect.width, rect.height));
    m_shape.setPosition(rect.left, rect.top);
}

Danke für die Hilfe!

MfG
Check

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

2

27.08.2013, 04:07

Da die Physik ja nur durch dein Rendering "sichtbar" gemacht wird, empfehle ich dir DebugDraw mit SFML zu implementieren. Somit bekommst du die Physik richting visualiziert und kannst evtl. feststellen, dass du das graphische Objekt völlig falsch platziert hast.

Zum Debuggen von solchen Problem empfiehlt es sich meist, das Problem exact zu isolieren, d.h. du erstellst ein neues Projekt und implementierst in einem File die Dinge, welche relevant sind um das Problem zu "erzeugen", somit kannst du den ganzen Rest vergessen und dich nur genau auf das eine Problem konzentrieren und es wird meistens ziemlich schnell klar was falsch lief.
Mit den geposteten Code Schnippsel kann man meist sehr wenig anfangen... :)
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

27.08.2013, 06:31

Also irgendwie haben wir keins dieser Probleme, obwohl wir alle diese Dinge ebenfalls machen. Allerdings duplizieren wir unsere Objekte auch nicht, wenn wir sie in Container pushen.
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]

4

27.08.2013, 15:10

Wie das? Nutzt ihr std::vector nicht?

MfG
Check

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

5

27.08.2013, 15:19

Doch, aber Konstruktoren wurden ja mit einem Sinn erfunden. All deine Init() und Initialize() Funktionen stehen quer zum Konstruktor. Objekte sollten völlig initialisiert sein, wenn der Konstruktor verlassen wird.

Somit kannst du dann mit der C++11 Funktion emplace_back, das Objekt direkt im Vector initialisieren.
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

27.08.2013, 15:28

Wir arbeiten auf dem Heap mit den dynamischen Objekten. Ist auch ganz gut so, so lassen sie sich einfacher hin- und herschieben.
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]

7

27.08.2013, 16:16

Hachja, neue Regel für einen selber: Frühstens nach 3 Tagen intensiven Bugfixings um Hilfe bitten. :D
Hat sich alles aufgeklärt, bis auf das noch nicht vorhandene LevelSegment, aber mal sehen... :hmm:
Danke jedenfalls!

MfG
Check

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

8

31.08.2013, 17:13

Wenn du mit Box2D und SFML arbeitest, könnte das hier nützlich für dich sein, falls du es nicht schon selber geschrieben hast:

SFMLDebugDraw.hpp: http://nopaste.info/95705d3ba5.html
SFMLDebugDraw.cpp: http://nopaste.info/61e57f7b2a.html

Konstruktor:
sf::RenderWindow& window - sollte klar sein
const float& scale - Umrechnungsfaktor zwischen Meter und Pixel, keine Ahnung mehr, warum das ein const float& ist...

9

31.08.2013, 17:37

Danke dafür, ich bleib bei meinem.
Das Wiki freut sich jedoch sicherlich über einen Artikel darüber! ^^

MfG
Check

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

31.08.2013, 18:02

Gute Idee, werde ich gleich mal machen

Werbeanzeige