package Ġtry pp . support . lig bd x . physics Ċ Ċ import Ġcom . badlogic . gdx . math . Matrix 4 Ċ import Ġcom . badlogic . gdx . math . Vector 2 Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Body Def . Body Type Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Body Def . Body Type . Dynamic Body Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Box 2 D Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Box 2 D Debug Renderer Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Circle Shape Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Contact Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Contact Imp ulse Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Contact Listener Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Fixture Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Man ifold Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Polygon Shape Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Shape Ċ import Ġcom . badlogic . gdx . utils . Array Ċ import Ġtry pp . support . collections . Array Map Ċ import Ġtry pp . support . collections . Array Set Ċ import Ġtry pp . support . lig bd x . physics . collision . Collision Ċ import Ġtry pp . support . lig bd x . physics . collision . Collision Callback Ċ import Ġtry pp . support . lig bd x . physics . collision . Collision Data Ċ import Ġtry pp . support . lig bd x . physics . collision . Collision Handler Ċ import Ġtry pp . support . lig bd x . physics . collision . Collision Handler Entry Ċ import Ġtry pp . support . math . Bit Utils Ċ import Ġtry pp . support . memory . Heap Pool Ċ import Ġtry pp . support . memory . Pool Ċ import Ġtry pp . support . time . Duration Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Body Ġas ĠB 2 Body Ċ import Ġcom . badlogic . gdx . physics . box 2 d . World Ġas ĠB 2 World ĊĊ Ċ /** Ċ Ġ* ĠA Ġsimple Ġwrapper Ġaround Ġa ĠBox 2 D Ġworld . ĠThis Ġis Ġthe Ġclass Ġwhich Ġwill Ġlet Ġthe Ġuser Ġgenerate Ċ Ġ* Ġ[ Body ] Ġinstances , Ġas Ġwell Ġas Ġmaintains Ġglobal Ġstate . Ċ Ġ*/ Ċ class ĠWorld Ġprivate Ġconstructor ( gravity : ĠVector 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Body Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsteps Per Sec : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcol lide sWith : ĠInt Array ) Ġ{ ĊĠĠĠ Ġclass ĠBuilder ( var Ġgravity : ĠVector 2 Ġ= ĠVector 2 ( 0 f , Ġ 0 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġexpected Body Count : ĠInt Ġ= ĠDEFAULT _ BODY _ COUNT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsteps Per Sec : ĠInt Ġ= ĠDEFAULT _ STEPS _ PER _ SEC ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcol lide sWith Ġ= ĠInt Array ( MAX _ NUM _ CATEG ORIES ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRegister Ġtwo Ġcategory Ġgroups Ġas Ġcoll id able . ĠUnless Ġset , Ġcontact Ġbetween Ġthese Ġtwo Ġcollision ĊĠĠĠĠĠĠĠĠ Ġ* Ġgroups Ġwon 't Ġtrigger Ġa Ġcollision . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġregister Coll id able ( categories A : ĠInt , Ġcategories B : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠMAX _ NUM _ CATEG ORIES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit Mask Ġ= Ġ 1 Ġshl Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( categories A Ġand Ġbit Mask Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcol lide sWith [ i ] Ġ= Ġ( col lide sWith [ i ] Ġor Ġcategories B ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( categories B Ġand Ġbit Mask Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcol lide sWith [ i ] Ġ= Ġ( col lide sWith [ i ] Ġor Ġcategories A ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠWorld Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWorld ( gravity , Ġexpected Body Count , Ġsteps Per Sec , Ġcol lide sWith ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ BODY _ COUNT Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ STEPS _ PER _ SEC Ġ= Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEXPECT ED _ COLL ISION _ HANDLER _ COUNT Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEXPECT ED _ NO _ CONTACT _ BODY _ COUNT Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġ// ĠRecomm ended Ġvalues Ġfrom ĠBox 2 D Ġmanual ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠV E LOC ITY _ ITER ATIONS Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPOSITION _ ITER ATIONS Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBox 2 D Ġhas Ġa Ġhard Ġlimit Ġof Ġ 1 6 Ġcollision Ġcategories . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠMAX _ NUM _ CATEG ORIES Ġ= Ġ 1 6 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox 2 D . init () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠCollision Listener Ġ: ĠContact Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbegin Contact ( contact : ĠContact ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! contact . is Touch ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Collision Handlers ( contact )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Collision Ġ= Ġcollision Pool . grab New () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Collision . fixture A Ġ= Ġcontact . fixture A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Collision . fixture B Ġ= Ġcontact . fixture B ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġend Contact ( contact : ĠContact ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Th ru Result . remove If ( contact ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Collision Handlers ( contact )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture A Ġ= Ġcontact . fixture A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture B Ġ= Ġcontact . fixture B ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Active Collision ( fixture A , Ġfixture B ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpre Solve ( contact : ĠContact , Ġold Man ifold : ĠMan ifold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skipped B odies . contains ( contact . fixture A . body ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskipped B odies . contains ( contact . fixture B . body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpass Th ru Ġ= Ġpass Th ru Result . get If ( contact ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pass Th ru Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass Th ru Ġ= Ġallow Pass Th ru ( contact ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass Th ru Result . put ( contact , Ġpass Th ru ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontact . isEnabled Ġ= Ġ! pass Th ru ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpost Solve ( contact : ĠContact , Ġimp ulse : ĠContact Imp ulse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġon Col li ded Dispatcher Ġ= Ġobject Ġ: ĠCollision Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( data : ĠCollision Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody First Ġ= Ġbody Map [ data . body First !! ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Second Ġ= Ġbody Map [ data . body Second !! ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . collision Handler !!. on Col li ded ( body First , Ġbody Second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġon Over lapping Dispatcher Ġ= Ġobject Ġ: ĠCollision Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( data : ĠCollision Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody First Ġ= Ġbody Map [ data . body First !! ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Second Ġ= Ġbody Map [ data . body Second !! ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . collision Handler !!. on Over lapping ( body First , Ġbody Second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġon Separ ated Dispatcher Ġ= Ġobject Ġ: ĠCollision Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( data : ĠCollision Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody First Ġ= Ġbody Map [ data . body First !! ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Second Ġ= Ġbody Map [ data . body Second !! ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . collision Handler !!. on Separ ated ( body First , Ġbody Second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠDebug Render () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrenderer Ġ= ĠBox 2 D Debug Renderer () ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix 4 () ĊĊĠĠĠĠĠĠĠ Ġfun Ġrender ( camera Matrix : ĠMatrix 4 , Ġmeters To Pixels : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . set ( camera Matrix ). scl ( meters To Pixels ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . render ( b 2 World , Ġmatrix ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbodies : ĠList < Body > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbody Pool . items InUse ĊĊĠĠĠ Ġval Ġstep Duration Ġ= ĠDuration . of Seconds ( 1 f Ġ/ Ġsteps Per Sec ) ĊĊĠĠĠ Ġinternal Ġval Ġb 2 World Ġ= ĠB 2 World ( gravity , Ġtrue ) ĊĊĠĠĠ Ġprivate Ġval Ġbody Pool Ġ= ĠHeap Pool . of ( Body :: class , Ġexpected Body Count ) ĊĠĠĠ Ġprivate Ġval Ġbody Map Ġ= ĠArray Map < B 2 Body , ĠBody >( expected Body Count ) ĊĊĠĠĠ Ġprivate Ġval Ġcollision Pool Ġ= ĠHeap Pool . of ( Collision :: class , Ġexpected Body Count Ġ/ Ġ 1 0 ) ĊĠĠĠ Ġ// ĠUsually Ġwe Ġonly Ġneed Ġ 1 Ġcollision Ġdata Ġitem , Ġbut Ġoccasion ally Ġrun Collision Handlers Ġtriggers Ġa ĊĠĠĠ Ġ// Ġcallback Ġwhich Ġcalls Ġrun Collision Handlers Ġagain Ġrecursively , Ġbut Ġthis Ġshould Ġnever Ġgo Ġvery Ġdeep . ĊĠĠĠ Ġprivate Ġval Ġcollision Data Pool Ġ= ĠPool . of ( Collision Data :: class , Ġ 4 ) ĊĊĠĠĠ Ġprivate Ġval Ġcollision Handlers Ġ= ĠArray < Collision Handler Entry >( EXPECTED _ COLL ISION _ HANDLER _ COUNT ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBody Ġto Ġbody Ġcontacts Ġthat Ġshould Ġskip Ġcollision Ġlogic ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġpass Th ru Result Ġ= ĠArray Map < Contact , ĠBoolean >( EXPECTED _ COLL ISION _ HANDLER _ COUNT ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠB odies Ġwhich Ġshould Ġalways Ġskip Ġcollision Ġlogic ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġskipped B odies Ġ= ĠArray Set < B 2 Body >( EXPECTED _ NO _ CONTACT _ BODY _ COUNT ) ĊĊĠĠĠ Ġprivate Ġval Ġelapsed So Far Ġ= ĠDuration . zero () ĊĊĠĠĠ Ġ// ĠRe usable Ġshapes Ġfor Ġcreating Ġbodies ĊĠĠĠ Ġprivate Ġvar Ġcircle Shape Ġ= ĠCircle Shape () ĊĠĠĠ Ġprivate Ġvar Ġpoly Shape Ġ= ĠPolygon Shape () ĊĊĠĠĠ Ġprivate Ġvar Ġdebug Render : ĠDebug Render ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġb 2 World . set Contact Listener ( Collision Listener ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Col lide sWith ( category : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbit Index Ġ= ĠBit Utils . get Bit Index ( category ) ĊĠĠĠĠĠĠĠ Ġassert ( bit Index Ġ< ĠMAX _ NUM _ CATEG ORIES , Ġ{ Ġ" Request ing Ġmask Ġfor Ġinvalid Ġcategory " Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġcol lide sWith [ bit Index ] ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġcreate Body ( category : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape : ĠShape , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠBody Type Ġ= ĠDynamic Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos : ĠVector 2 ? Ġ= Ġnull ): ĠBody Ġ{ ĊĠĠĠĠĠĠĠ ĠBit Utils . require Single Bit ( category ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġbody Pool . grab New () ĊĠĠĠĠĠĠĠ Ġbody . set ( this , Ġcategory , Ġget Col lide sWith ( category ), Ġshape , Ġtype , Ġpos ) ĊĠĠĠĠĠĠĠ Ġbody Map . put ( body . b 2 body !! , Ġbody ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbody ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Circle Body ( category : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠBody Type Ġ= ĠBody Type . Dynamic Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos : ĠVector 2 ? Ġ= Ġnull ): ĠBody Ġ{ ĊĠĠĠĠĠĠĠ Ġcircle Shape . radius Ġ= Ġradius ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Body ( category , Ġcircle Shape , Ġtype , Ġpos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Box Body ( category : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw : ĠFloat , Ġh : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠBody Type Ġ= ĠBody Type . Dynamic Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos : ĠVector 2 ? Ġ= Ġnull ): ĠBody Ġ{ ĊĠĠĠĠĠĠĠ Ġpoly Shape . set As Box ( w Ġ/ Ġ 2 f , Ġh Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Body ( category , Ġpoly Shape , Ġtype , Ġpos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Box Body ( category : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize : ĠVector 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠBody Type Ġ= ĠBody Type . Dynamic Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos : ĠVector 2 ? Ġ= Ġnull ): ĠBody Ġ{ ĊĠĠĠĠĠĠĠ Ġpoly Shape . set As Box ( size . x , Ġsize . y ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Body ( category , Ġpoly Shape , Ġtype , Ġpos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdestroy Body ( body : ĠBody ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb 2 Body Ġ= Ġbody . b 2 body !! Ġ// ĠAlways Ġset Ġby Ġcreate Body ĊĠĠĠĠĠĠĠ Ġenable Coll isions ( body , Ġtrue ) Ġ// ĠThis Ġforces Ġactive Ġcollisions Ġto Ġseparate ĊĠĠĠĠĠĠĠ Ġ// Ġset Active Ġputs Ġa Ġbody Ġreference Ġin Ġinactive B odies Ġ- Ġremove Ġit ! ĊĠĠĠĠĠĠĠ Ġskipped B odies . remove If ( b 2 Body ) ĊĠĠĠĠĠĠĠ Ġremove Active Coll isions ( b 2 Body ) ĊĠĠĠĠĠĠĠ Ġbody Map . remove ( b 2 Body ) ĊĠĠĠĠĠĠĠ Ġbody Pool . free ( body ) Ġ// ĠCalls Ġb 2 World . destroy Body Ġinternally ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp let ely Ġdisable Ġ( or Ġre - enable ) Ġcollisions Ġfor Ġa Ġspecific Ġbody ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġenable Coll isions ( body : ĠBody , Ġenable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb 2 body Ġ= Ġbody . b 2 body !! ĊĠĠĠĠĠĠĠ Ġif Ġ( enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skipped B odies . remove If ( b 2 body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Collision Handlers ( b 2 body , Ġon Col li ded Dispatcher ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skipped B odies . put If ( b 2 body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Collision Handlers ( b 2 body , Ġon Separ ated Dispatcher ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollisions Ġ= Ġcollision Pool . items InUse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollisions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . own s Body ( b 2 body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReset Ġ' just Col li ded ', Ġin Ġcase Ġthis Ġcollision Ġis Ġre activated Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . just Col li ded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġ[ Collision Handler ] Ġwith Ġthis Ġphysics Ġsystem . ĠNote Ġthis Ġeither Ġa Ġregistered Ġhandler Ġwill Ġhandle ĊĠĠĠĠ Ġ* Ġa Ġcollision ĠOR ĠBox 2 D Ġwill Ġhandle Ġit , Ġbut Ġnot Ġboth . ĠThe Ġcategory Ġorder Ġthat Ġa Ġhandler Ġis Ġregistered Ġwith Ġwill ĊĠĠĠĠ Ġ* Ġbe Ġpreserved Ġwhen Ġthe Ġhandler Ġis Ġcalled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠYou Ġcan Ġregister Ġmultiple Ġhandlers Ġfor Ġthe Ġsame Ġcollision , Ġwhich Ġis Ġuseful Ġif Ġyou Ġhave Ġa Ġdefault Ġbehavior Ġyou ĊĠĠĠĠ Ġ* Ġwant Ġto Ġhappen Ġin Ġmultiple Ġcollision Ġcases . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Collision Handler ( categories A : ĠInt , Ġcategories B : ĠInt , Ġhandler : ĠCollision Handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠMAX _ NUM _ CATEG ORIES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit Mask Ġ= Ġ 1 Ġshl Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( categories A Ġand Ġbit Mask Ġ!= Ġ 0 Ġ&& Ġcol lide sWith [ i ] Ġand Ġcategories B Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" At tempting Ġto Ġadd Ġhandler Ġfor Ġcategories Ġthat Ġdon 't Ġcol lide Ġ($ categories A Ġand Ġ$ categories B ). ĠDid Ġyou Ġforget Ġto Ġcall Ġregister Coll id able ?") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcollision Handlers . add ( Collision Handler Entry ( categories A , Ġcategories B , Ġhandler )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( elapsed Time : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġelapsed So Far . add ( elapsed Time ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( elapsed So Far . get Seconds () Ġ>= Ġstep Duration . get Seconds ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb 2 World . step ( step Duration . get Seconds (), ĠV E LOC ITY _ ITER ATIONS , ĠPOSITION _ ITER ATIONS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelapsed So Far . subtract ( step Duration ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Coll isions Ġ= Ġcollision Pool . items InUse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Coll isions Ġ= Ġactive Coll isions . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Coll isions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Collision Ġ= Ġactive Coll isions [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture A Ġ= Ġactive Collision . fixture A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture B Ġ= Ġactive Collision . fixture B ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skipped B odies . contains ( fixture A !!. body ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskipped B odies . contains ( fixture B !!. body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Collision Handlers ( fixture A , Ġfixture B , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Collision . just Col li ded ) Ġon Col li ded Dispatcher Ġelse Ġon Over lapping Dispatcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Collision . just Col li ded Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Active Collision ( fixture A : ĠFix ture , Ġfixture B : ĠFix ture ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcollisions Ġ= Ġcollision Pool . items InUse ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcollisions . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcollisions [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . matches ( fixture A , Ġfixture B )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Pool . free ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Active Coll isions ( body : ĠB 2 Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcollisions Ġ= Ġcollision Pool . items InUse ĊĠĠĠĠĠĠĠ Ġvar Ġnum Coll isions Ġ= Ġcollisions . size ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġnum Coll isions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcollisions [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . own s Body ( body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Pool . free ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Coll isions -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Collision Handler ( contact : ĠContact ): ĠCollision Handler Entry ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfixture A Ġ= Ġcontact . fixture A ĊĠĠĠĠĠĠĠ Ġval Ġfixture B Ġ= Ġcontact . fixture B ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcollision Handlers . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġcollision Handlers [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . matches ( fixture A . filter Data . category Bits . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixture B . filter Data . category Bits . toInt ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Collision Handlers ( contact : ĠContact ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Collision Handler ( contact ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġallow Pass Th ru ( contact : ĠContact ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġget Collision Handler ( contact ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( handler . is First Category ( contact . fixture A . filter Data . category Bits . toInt ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody First Ġ= Ġbody Map [ contact . fixture A . body ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Second Ġ= Ġbody Map [ contact . fixture B . body ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandler . collision Handler . allow Pass Th ru ( body First , Ġbody Second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody First Ġ= Ġbody Map [ contact . fixture B . body ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Second Ġ= Ġbody Map [ contact . fixture A . body ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandler . collision Handler . allow Pass Th ru ( body First , Ġbody Second ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġtwo Ġfixtures Ġthat Ġare Ġcoll iding , Ġcall Ġany Ġcollision Ġhandlers Ġthat Ġmay Ġhave Ġbeen Ġregistered Ġto Ġhandle Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrun Collision Handlers ( fixture A : ĠFix ture , Ġfixture B : ĠFix ture , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Callback : ĠCollision Callback ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcollision Handlers . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġcollision Handlers [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . matches ( fixture A . filter Data . category Bits . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixture B . filter Data . category Bits . toInt ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody A Ġ= Ġfixture A . body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody B Ġ= Ġfixture B . body ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġcollision Data Pool . grab New () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . is First Category ( fixture A . filter Data . category Bits . toInt ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . body First Ġ= Ġbody A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . body Second Ġ= Ġbody B ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . body First Ġ= Ġbody B ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . body Second Ġ= Ġbody A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . collision Handler Ġ= Ġentry . collision Handler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Callback . run ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollision Data Pool . free Count ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġall Ġactive Ġcollision Ġhandlers Ġthat Ġreference Ġthe Ġ[ Body ] Ġparameter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrun Collision Handlers ( body : ĠB 2 Body , Ġcollision Callback : ĠCollision Callback ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġactive Coll isions Ġ= Ġcollision Pool . items InUse ĊĠĠĠĠĠĠĠ Ġval Ġnum Coll isions Ġ= Ġactive Coll isions . size ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Coll isions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Collision Ġ= Ġactive Coll isions [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Collision . own s Body ( body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture A Ġ= Ġactive Collision . fixture A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture B Ġ= Ġactive Collision . fixture B ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFix tures Ġare Ġnon - null Ġif Ġowns Body Ġis Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Collision Handlers ( fixture A !! , Ġfixture B !! , Ġcollision Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! bodies . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Body ( bodies [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġb 2 World . dispose () ĊĠĠĠĠĠĠĠ Ġcircle Shape . dispose () ĊĠĠĠĠĠĠĠ Ġpoly Shape . dispose () ĊĊĠĠĠĠĠĠĠ Ġassert ( b 2 World . body Count Ġ== Ġ 0 , Ġ{ Ġ" Box 2 D Ġworld Ġwasn 't Ġdisposed Ġcorrectly " Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdebug Render ( camera Matrix : ĠMatrix 4 , Ġmeters To Pixels : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( debug Render Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Render Ġ= ĠDebug Render () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdebug Render !!. render ( camera Matrix , Ġmeters To Pixels ) ĊĠĠĠ Ġ} Ċ }