package Ġcom . aa hack . yo jump . game object Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . util . Log Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġon Ġ 1 5 . 1 2 . 2 0 1 8 . Ċ Ġ* Ġ@ author Ġdh ab ens ky Ġ< dh ab ens ky @ yandex . ru > Ċ Ġ*/ Ċ class ĠScene Ġ{ ĊĊ ĉ private Ġval Ġobjects Ġ= ĠLinkedList < GameObject >() Ċ ĉ private Ġlateinit Ġvar Ġcamera : ĠCamera Ċ ĉ private Ġlateinit Ġvar Ġplayer : ĠPlayer Ċ ĉ private Ġlateinit Ġvar Ġscore : ĠScore Label ĊĊ ĉ var Ġlast Frame Millis : ĠLong Ġ= Ġ 0 L ĊĊ ĉ private Ġval Ġplayer Bounds Ġ= ĠRect F () Ċ ĉ private Ġval Ġplayer Bounds Copy Ġ= ĠRect F () Ċ ĉ private Ġval Ġbounds Ġ= ĠRect F () ĊĊ ĉ public Ġvar Ġgame Over Ġ= Ġfalse ĊĊ ĉ private Ġval Ġobj ToRemove Ġ= Ġarray ListOf < GameObject >() Ċ ĉ private Ġval Ġobj ToAdd Ġ= Ġarray ListOf < GameObject >() ĊĊ ĉ fun Ġrender ( canvas : ĠCanvas ) Ġ{ ĊĊĉ ĉ val Ġcur Millis Ġ= ĠSystem . currentTimeMillis () Ċĉ ĉ if Ġ( last Frame Millis Ġ== Ġ 0 L ) Ġ{ Ċĉĉ ĉ last Frame Millis Ġ= Ġcur Millis Ċĉ ĉ } Ċĉ ĉ val Ġdelta Ġ= Ġ( cur Millis Ġ- Ġlast Frame Millis ) Ġ/ Ġ 1 0 0 0 f Ċĉ ĉ last Frame Millis Ġ= Ġcur Millis ĊĊĊĉ ĉ for Ġ( obj Ġin Ġobjects ) Ġ{ Ċĉĉ ĉ obj . update ( delta ) Ċĉ ĉ } ĊĊĉ ĉ process Coll isions ( delta ) ĊĊĉ ĉ canvas . matrix Ġ= Ġcamera . get Matrix () ĊĊĉ ĉ for Ġ( obj Ġin Ġobjects ) Ġ{ Ċĉĉ ĉ obj . render ( canvas ) Ċĉ ĉ } ĊĊĉ ĉ for Ġ( obj Ġin Ġobj ToRemove ) Ġ{ Ċĉĉ ĉ Log . d (" GENER ATION ", Ġ" re moving Ġ${ obj }") Ċĉĉ ĉ objects . remove ( obj ) Ċĉ ĉ } Ċĉ ĉ obj ToRemove . clear () ĊĊĉ ĉ for Ġ( obj Ġin Ġobj ToAdd ) Ġ{ Ċĉĉ ĉ objects . add ( obj ) Ċĉ ĉ } Ċĉ ĉ obj ToAdd . clear () ĊĊĉ ĉ score . render ( canvas ) ĊĊĉ ĉ val Ġiter Ġ= Ġobjects . iterator () Ċĉ ĉ while Ġ( iter . hasNext ()) Ġ{ Ċĉĉ ĉ val Ġobj Ġ= Ġiter . next () Ċĉĉ ĉ if Ġ( obj . tag Ġ== Ġ" death ") Ġcontinue Ċĉĉ ĉ if Ġ( obj . pos . x Ġ< Ġcamera . pos . x Ġ- Ġ 3 0 0 0 f ) Ġ{ Ċĉĉĉ ĉ iter . remove () Ċĉĉĉ ĉ Log . d (" GENER ATION ", Ġ" pop Ġobject ") Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġprocess Coll isions ( delta : ĠFloat ) Ġ{ ĊĊĉ ĉ player . get Bounds ( player Bounds ) Ċĉ ĉ if Ġ( player . velocity . y Ġ> Ġ 0 ) Ġ{ Ċĉĉ ĉ bounds . top Ġ-= Ġplayer . velocity . y Ġ* Ġdelta Ċĉ ĉ } ĊĊĉ ĉ var Ġcoll iding Ġ= Ġfalse ĊĊĉ ĉ for Ġ( obj Ġin Ġobjects ) Ġ{ Ċĉĉ ĉ player Bounds Copy . set ( player Bounds ) Ċĉĉ ĉ obj . get Bounds ( bounds ) ĊĊĉĉ ĉ if Ġ( player Bounds Copy . intersect ( bounds )) Ġ{ Ċĉĉĉ ĉ if Ġ( obj . tag Ġ== Ġ" block ") Ġ{ Ċĉĉĉĉ ĉ log (" collision Ġwith Ġblock ") Ċĉĉĉĉ ĉ process Block Collision ( obj , Ġplayer Bounds Copy ) Ċĉĉĉĉ ĉ coll iding Ġ= Ġtrue Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġif Ġ( obj . tag Ġ== Ġ" collect able ") Ġ{ Ċĉĉĉĉ ĉ process Collect able Collision ( obj ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġif Ġ( obj . tag Ġ== Ġ" death ") Ġ{ Ċĉĉĉĉ ĉ process Death Collision ( obj ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ player . is Coll iding Ġ= Ġcoll iding Ċ ĉ } ĊĊ ĉ private Ġfun Ġprocess Block Collision ( obj : ĠGameObject , Ġcollision : ĠRect F ) Ġ{ ĊĊĉ ĉ if Ġ( player . velocity . y Ġ< Ġ 0 ) Ġ{ Ċĉĉ ĉ log (" negative Ġvelocity . ĠEND ") Ċĉĉ ĉ return Ċĉ ĉ } ĊĊĉ ĉ log (" collision : Ġ$ collision , Ġplayer : Ġ$ player Bounds ") ĊĊĉ ĉ if Ġ( collision . bottom Ġ!= Ġplayer Bounds . bottom ) Ġ{ Ċĉĉ ĉ log (" bottom Ġnot Ġmatch . ĠEND ") Ċĉĉ ĉ return Ċĉ ĉ } ĊĊĉ ĉ val Ġthreshold Ġ= Ġ 1 6 f Ċĉ ĉ val Ġnear Top Ġ= Ġcollision . height () Ġ< Ġthreshold ĊĊĉ ĉ val Ġnew Collision Ġ= Ġnear Top Ġ|| Ġ! player . is Coll iding ĊĊĉ ĉ if Ġ( new Collision ) Ġ{ Ċĉĉ ĉ log (" new Ġcollision . ĠEND ") Ċĉĉ ĉ player . pos . y Ġ= Ġbounds . top Ġ- Ġplayer . h Ċĉĉ ĉ player . velocity . y Ġ= Ġ 0 f Ċĉĉ ĉ player . reset Jump Count () ĊĊĉĉ ĉ if Ġ( obj Ġis ĠBlock Ġ&& Ġobj . destruct ible ) Ġ{ Ċĉĉĉ ĉ obj . schedule Dest ruct () Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ else Ġ{ Ċĉĉ ĉ log (" ign oring Ġcollision . ĠEND ") Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġprocess Collect able Collision ( obj : ĠGameObject ) Ġ{ Ċĉ ĉ player . collect () Ċĉ ĉ obj ToRemove . add ( obj ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġprocess Death Collision ( obj : ĠGameObject ) Ġ{ Ċĉ ĉ game Over Ġ= Ġtrue Ċ ĉ } ĊĊ ĉ fun Ġadd Object ( gameObject : ĠGameObject ) Ġ{ Ċĉ ĉ objects . add ( gameObject ) Ċ ĉ } ĊĊ ĉ fun Ġset Camera ( camera : ĠCamera ) Ġ{ Ċĉ ĉ add Object ( camera ) Ċĉ ĉ this . camera Ġ= Ġcamera Ċ ĉ } ĊĊ ĉ fun Ġset Player ( player : ĠPlayer ) Ġ{ Ċĉ ĉ add Object ( player ) Ċĉ ĉ this . player Ġ= Ġplayer Ċ ĉ } ĊĊ ĉ fun Ġset Score ( score : ĠScore Label ) Ġ{ Ċĉ ĉ add Object ( score ) Ċĉ ĉ this . score Ġ= Ġscore Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ const Ġval ĠTAG Ġ= Ġ" COLL ISION " Ċĉ ĉ private Ġval Ġformatter Ġ= ĠSimpleDateFormat (" mm : ss : SS S ") ĊĊĉ ĉ fun Ġlog ( message : ĠString ) Ġ{ Ċĉĉ ĉ Log . d ( TAG , Ġformatter . format ( Date ()) Ġ+ Ġ" Ġ" Ġ+ Ġmessage ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġget Score (): ĠString ? Ġ{ Ċĉ ĉ return Ġscore . get Score () Ċ ĉ } ĊĊ ĉ fun Ġdelayed Add Object ( obj : ĠGameObject ) Ġ{ Ċĉ ĉ obj ToAdd . add ( obj ) Ċ ĉ } ĊĊ ĉ fun Ġdelayed Remove Object ( obj : ĠGameObject ) Ġ{ Ċĉ ĉ obj ToRemove . add ( obj ) Ċ ĉ } Ċ Ċ } Ċ