package Ġj corn az . demo . kotlin . fl appy bird . physics Ċ Ċ import Ġcom . badlogic . gdx . G dx Ċ import Ġcom . badlogic . gdx . math . Vector 2 Ċ import Ġcom . badlogic . gdx . physics . box 2 d . Body Ċ 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 . World Ċ import Ġcom . badlogic . gdx . utils . Disposable Ċ import Ġcom . code and web . phys ic sed itor . Physics Shape Cache Ċ import Ġj corn az . demo . kotlin . fl appy bird . PIXEL _ PER _ METER Ċ import Ġkotlinx . coroutines . channels . Broadcast Channel Ċ import Ġkotlinx . coroutines . channels . send Blocking Ċ import Ġk tx . box 2 d . body Ċ import Ġk tx . box 2 d . create World Ċ import Ġk tx . box 2 d . earth Gravity Ċ Ċ private Ġconst Ġval ĠSTEP _ TIME Ġ= Ġ 1 f Ġ/ Ġ 6 0 f Ċ Ċ sealed Ġclass ĠContact Event Ġ{ ĊĠ Ġabstract Ġval Ġfixtures : ĠSequence < Fixture > ĊĊĠ Ġoperator Ġfun Ġcontains ( body : ĠBody ): ĠBoolean Ġ= ĊĠĠĠĠĠ Ġfixtures . any Ġ{ Ġit . body Ġ== Ġbody Ġ} ĊĊĠ Ġclass ĠContact Be gan ( override Ġval Ġfixtures : ĠSequence < Fixture >) Ġ: ĠContact Event () ĊĠ Ġclass ĠContact Ended ( override Ġval Ġfixtures : ĠSequence < Fixture >) Ġ: ĠContact Event () Ċ } Ċ Ċ class ĠGame World Ġ: ĠDis posable Ġ{ ĊĊĠ Ġval Ġworld Ġ= Ġcreate World ( earth Gravity ) ĊĠ Ġprivate Ġval Ġshape Cache Ġ= ĠPhysics Shape Cache ( G dx . files . internal (" physics . xml ")) ĊĊĠ Ġprivate Ġvar Ġtime Since Last Step Ġ= Ġ 0 f ĊĊĠ Ġprivate Ġval Ġbroadcast Ġ= ĠBroadcast Channel < Contact Event >( 1 6 ) ĊĊĠ Ġval Ġbird Ġ= Ġworld . create Body ( shape Cache , Ġ" bird ") ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġworld . set Contact Listener ( object Ġ: ĠContact Listener Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġbegin Contact ( contact : ĠContact ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbroadcast . send Blocking ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact Event . Contact Be gan ( sequence Of ( contact . fixture A , Ġcontact . fixture B )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġend Contact ( contact : ĠContact ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbroadcast . send Blocking ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact Event . Contact Ended ( sequence Of ( contact . fixture A , Ġcontact . fixture B )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġpre Solve ( contact : ĠContact ?, Ġold Man ifold : ĠMan ifold ?) Ġ= ĠUnit ĊĠĠĠĠĠ Ġoverride Ġfun Ġpost Solve ( contact : ĠContact ?, Ġimp ulse : ĠContact Imp ulse ?) Ġ= ĠUnit ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġfun Ġcreate Floor () Ġ= Ġworld . create Body ( shape Cache , Ġ" ground ") ĊĠ Ġfun Ġcreate Pipe () Ġ= Ġworld . create Body ( shape Cache , Ġ" pipe ") ĊĠ Ġfun Ġcreate Score Zone () Ġ= Ġworld . body Ġ{ ĊĠĠĠ Ġbox ( 0 . 2 5 f , Ġ 2 . 5 f , ĠVector 2 ( 0 f , Ġ 1 . 2 5 f )) Ġ{ ĊĠĠĠĠĠ Ġfilter . group Index Ġ= Ġ 1 ĊĠĠĠĠĠ Ġis Sensor Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġstep ( deltaTime : ĠFloat ) Ġ{ ĊĠĠĠ Ġtime Since Last Step Ġ+= Ġdelta Time ĊĊĠĠĠ Ġwhile Ġ( time Since Last Step Ġ>= ĠSTEP _ TIME ) Ġ{ ĊĠĠĠĠĠ Ġworld . step ( STEP _ TIME , Ġ 5 , Ġ 2 ) ĊĠĠĠĠĠ Ġtime Since Last Step Ġ-= ĠSTEP _ TIME ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġopen Contact Subscription () Ġ= Ġbroadcast . open Subscription () ĊĊĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠ Ġworld . dispose () ĊĠ Ġ} Ċ } Ċ Ċ fun ĠWorld . create Body ( shape Cache : ĠPhysics Shape Cache , Ġname : ĠString ): ĠBody Ġ= ĊĠĠĠ Ġshape Cache . create Body ( name , Ġthis , Ġ 1 f Ġ/ ĠPIX EL _ PER _ METER , Ġ 1 f Ġ/ ĠPIX EL _ PER _ METER ) ĊĊ