Rozdział 2. Witaj Box2D - PolishDocs/Box2D-PL GitHub Wiki

Dobrym przykładem jak rozpocząć pracę z Box2D będzie projekt Hello Wolrd. Program stworzy jeden, duży i statyczny klocek oraz drugi, mały i dynamiczny. Kod nie będzie zawierał żadnej grafiki. Jedyny co zobaczysz na ekranie to wyjście z konsoli, informujące o aktualnej pozycji klocka.

2.1 Tworzenie świata.

Każdy program pisany z użyciem Box2D rozpoczyna się stworzeniem obiektu b2World. b2World jest ośrodkiem fizycznym który zarządza pamięcią, obiektami i symulacją. Możesz zaalokować świat fizyczny na stosie, kopcu lub sekcji z danymi.
Świat Box2D można stworzyć bardzo łatwo. Najpierw definiujemy wektor grawitacji.

b2Vec2 gravity(0.0f, -10.0f);

Następnie tworzymy obiekt świata. Zwróć uwagę na to, że tworzymy świat na stosie więc musi on pozostać w zakresie widoczności.

b2World world(gravity);

Tym sposobem stworzyliśmy na świat fizyczny, dodajmy więc trochę rzeczy do niego.

2.2 Tworzenie statycznego klocka

Ciała są tworzone w następujących krokach:

  1. Zdefiniuj ciało, nadając mu pozycje, tłumienie itd.
  2. Użyj obiektu świata by storzyć ciało.
  3. Zdefiniuj fikstury, nadając im kształt, tarcie, gęstość itd.
  4. Stwórz fikstury korzystając z obiektu ciała.

Krokiem pierwszym jest stworzenie statycznego ciała. Do tego potrzebujemy je najpierw zdefiniować. Mając definicje ciała, określamy jego pozycje początkową.

b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0.0f, -10.0f);

Krokiem drugim jest przekazanie definicji ciała obiektowi świata, by ten stworzył to ciało. Obiekt świata nie trzyma referencji do definicji ciała. Ciała są domyślnie statyczne. Ciała statyczne nie kolidują z innymi ciałami statycznymi i nie da się ich poruszyć.

b2Body* groundBody = world.CreateBody(&groundBodyDef);

Krokiem trzecim jest stworzenie kształtu dla statycznego klocka. Użyjemy skrótowej formy SetAsBox by kształt przybrał formę prostokąta, ze środkiem w punkcie początkowym(ang. origin) ciała-rodzica.

b2PolygonShape groundBox;
groundBox.SetAsBox(50.0f, 10.0f);

Funkcja SetAsBox jako argumenty przyjmuje połowę szerokości oraz połowę wysokości prostokąta. W tym przypadku statyczny klocek będzie szeroki na 100 jednostek (oś x) i wysoki na 20 jednostek (oś y). Box2D operuje na metrach, kilogramach i sekundach, więc wymiary powinny być w metrach. Box2D radzi sobie najlepiej z obiektami o rozmiarach podobnych to przedmiotów z prawdziwego świata. Na przykład,beczka o wysokości około 1 metra. Z powodu ograniczeń związanych z obliczeniami na liczbach zmiennoprzecinowych, użycie Box2D do symulacji ruchu lodowca lub cząsteczek kurzu nie jest dobrym pomysłem.

W kroku czwartym kończymy statyczny klocek poprzez tworzenie fikstury kształtu. Do wykonania tego kroku posłużymy się skróconą formą. Nie ma potrzeby zmieniania domyślnych parametrów fikstury, więc możemy przesłać kształt bezpośrednio jako argument. Później zobaczymy jak użyć definicji fikstury do dostosowania jej właściwości. Drugi parametr to gęstość kształtu w kilogramach na metr kwadratowy. Statyczne ciało ma zerową masę z definicji, więc gęstość w tym przypadku nie jest używana.

groundBody->CreateFixture(&groundBox, 0.0f);

Box2D nie przechowuje referencji do przesłanego kształtu. Kopiuje jedynie dane do nowego obiektu b2Shape.

Zauważ, że każda fikstura musi mieć ciało-rodzica, nawet statyczne fikstury. Jednakże, możesz związać wszystkie statyczne fikstury z jednym statycznym ciałem.

Gdy związujesz kształt z ciałem przy użyciu fikstury, współrzędne kształtu stają się lokalnymi współrzędnymi względem ciała. Z tego powodu gdy ciało się porusza, porusza się kształt. Pozycja fikstury jest odziedziczona od ciała-rodzica. Fikstura nie posiada niezależnych koordynatów pozycji, więc nie możemy poruszać kształtem względem ciała. Poruszanie lub modifikowanie kształtów które są związane z ciałem nie jest wspierane. Powód jest prosty: ciało zmieniające kształt nie jest ciałem sztywnym, a Box2D jest silnikiem operującym na ciałach sztywnych. Wiele założeń bazuje na modelu ciała sztywnego, jesli ten model zostanie naruszony, wiele rzeczy może się popsuć.