package Ġio . github . ps he g ger . game dev experiments Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Surface Holder Ċ import Ġandroid . view . Surface View Ċ import Ġio . github . ps he g ger . game dev experiments . utils . Touch Ċ Ċ /** Ċ Ġ* Ġ@ author Ġps he g ger @ gmail . com Ċ Ġ*/ Ċ class ĠGame Surface View ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt , Ġdef Style Res : ĠInt ) Ġ: ĠSurface View ( context , Ġattrs , Ġdef Style Attr , Ġdef Style Res ), ĠSurface Holder . Callback Ġ{ ĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġthis ( context , Ġattrs , Ġdef Style Attr , Ġ 0 ) ĊĊĠĠĠ Ġprivate Ġvar Ġrender Thread : ĠRender Thread ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtouch Helper : ĠTouch ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġscene : ĠScene ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. size Changed ( width , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Thread ?. fps Paint ?. color Ġ= Ġvalue ?. fps Color () Ġ?: ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtouch : ĠTouch ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtouch Helper ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . add Callback ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Changed ( holder : ĠSurface Holder , Ġformat : ĠInt , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscene ?. size Changed ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġrender Thread ?. running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrender Thread Ġ= ĠRender Thread ( this ) ĊĠĠĠĠĠĠĠ Ġrender Thread ?. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Destroyed ( holder : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrender Thread ?. running Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Created ( holder : ĠSurface Holder ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ UP Ġ|| Ġevent . action Ġ== ĠMotion Event . ACTION _ CANCEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Helper Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Helper Ġ= ĠTouch ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( deltaTime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscene ?. update ( deltaTime ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscene ?. render ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠRender Thread ( val Ġgame Surface View : ĠGame Surface View , Ġvar Ġrunning : ĠBoolean Ġ= Ġtrue ) Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Render Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġvar Ġfps : ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġval Ġfps Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġ 4 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġframes Draw n Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast FP ST imer Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Now Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Time Ġ= Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġt Now Ġ- Ġlast Render Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ== Ġ 0 L ) Ġ 1 L Ġelse Ġt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( deltaTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Surface View . holder . lock Hardware Canvas () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Surface View . holder . lock Canvas () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgame Surface View . holder . unlock Canvas And Post ( canvas ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Render Time Ġ= Ġt Now ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframes Draw n ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Now Ġ- Ġlast FP ST imer Ġ> Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfps Ġ= Ġframes Draw n Ġ/ Ġ(( t Now Ġ- Ġlast FP ST imer ) Ġ/ Ġ 1 0 0 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast FP ST imer Ġ= Ġt Now ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframes Draw n Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate ( deltaTime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Surface View . update ( deltaTime ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrender ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Surface View . render ( canvas ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text (" FPS : Ġ${ String . format ("% . 1 f ", Ġfps )} ", Ġ 1 0 f , Ġ 5 2 f , Ġfps Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }