Pretraživanje svijeta
U Box2D Engine-u postoje mehanizmi kojima možemo saznati koja tijela su u određenom dijelu svijeta. Ovo je često jako korisno i srećom Box2D to podržava. Jedna od tehnika se zove Ray casting. Ovo radi na naćin da Box2D povuće neku vrstu linije, i zatim računa koja tijela su presječena tom linijom. Metoda koja nam omogućuje testiranje da li je neko tijelo presječeno linijom je sljedeća:
bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input);
Na ovaj naćin trebamo iterirati kroz sva tijela u svijetu te za svako tijelo pozvati ovu metodu i vidjeti koji rezultat vraća (true / false). No Box2D nudi sofisticiraniji način da ovo napravimo i to putem automatiziranog Ray casting-a, te AABB testiranja. Kako bi implementirali ovu vrstu postavljanja upita služimo se sljedećom metodom.
void RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2);
Drugi i treći parametar označavaju početak i kraj linije koju želimo povući, dok je drugi parametar tipa b2RayCastCallback klase čiju ReportFixture metodu moramo implementirati, a ona izgleda ovako:
float32 ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction);
Svaki put kada je pronadjen neki Fixture ova metoda će biti pozvana.
Druga vrsta postavljanja upita nad tijelima je AABB. Ta funkcija izgleda ovako:
void QueryAABB(b2QueryCallback* callback, const b2AABB& aabb);
Slično kao i kod Ray castinga prvi parametar je klasa koju moramo implementirati, a ima sljedeću virtualnu metodu:
bool ReportFixture(b2Fixture* fixture);
Drugi parametar QueryAABB metode je početak i kraj kocke unutar koje će se tražiti tijela. To slikovito izgleda ovako:
Sile i impulsi
Kako bi micali tijela unutar Box2D svijeta trebamo djelovati na tijela silama i impulsima. Impulsi mijenjau brzinu tijela trenutno, dok sile mijenjaju brzinu tijela konstantno kroz vrijeme. Sljedeća metoda omogućava primjenu sile na neko tijelo
body->ApplyForce(b2Vec2(0,50), body->GetWorldCenter());
Zatim možemo primjeniti linearni impuls na tijelo metodom:
body->ApplyLinearImpulse(b2Vec2(0,50), body->GetWorldCenter());
Prvi parametar označava vektor smjera impulsa. Također možemo primjeniti i neke kutne impulse na tijela, npr:
body->ApplyAngularImpulse(0);
Eksplozije
Box2D putem već spomenutih mehanizama omogućava simuliranje eksplozija. Više informacija možete čuti o tome na sljedećem videu:
Fluidi
Box2D nam omogućava i simuliranje ponašanja fluida. Za više informacija pogledajte sljedeći video: