package Ġcom . co dy zen . sp riter un ner Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . graphics . drawable . to Bitmap Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule ĊĊ Ċ class ĠSprite View ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: ĠView ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġvar Ġimage : ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġsprite Width Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġsprite Height Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġcolumns Ġ= Ġ 4 ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Frame Ġ= Ġvalue Ġ* Ġrows ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġrows Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Frame Ġ= Ġcolumns Ġ* Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġfps Ġ= Ġcolumns Ġ* Ġrows ĊĠĠĠ Ġvar Ġlast Frame Ġ= Ġcolumns Ġ* Ġrows ĊĠĠĠ Ġvar Ġis Fixed Row Ġ= Ġfalse ĊĠĠĠ Ġvar Ġauto Play Ġ= Ġtrue ĊĠĠĠ Ġval Ġis Running : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrunning ĊĠĠĠ Ġ} Ċ // ĠĠĠ Ġvar Ġmax Cycles Ġ= Ġ 0 Ċ // ĠĠĠ Ġvar Ġcurrent Cycle Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġstate ChangeListener : ĠState ChangeListener ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġrender Row Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġrender Column Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġcurrent Frame Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġrunning Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġsrc Frame Ġ= ĠRect () ĊĠĠĠ Ġprivate Ġval Ġdst Frame Ġ= ĠRect () ĊĠĠĠ Ġprivate Ġvar Ġtimer Ġ= ĠTimer () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( attrs Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĠR . style able . Sprite View , Ġ 0 , Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= Ġa . get Drawable ( R . style able . Sprite View _ src )?. to Bitmap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns Ġ= Ġa . getInt ( R . style able . Sprite View _ columns , Ġcolumns ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows Ġ= Ġa . getInt ( R . style able . Sprite View _ rows , Ġrows ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfps Ġ= Ġa . getInt ( R . style able . Sprite View _ fps , Ġfps ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Frame Ġ= Ġa . getInt ( R . style able . Sprite View _ last Frame , Ġlast Frame ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Row Ġ= Ġa . getInt ( R . style able . Sprite View _ render Row , Ġrender Row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Fixed Row Ġ= Ġa . getBoolean ( R . style able . Sprite View _ is Fixed Row , Ġis Fixed Row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauto Play Ġ= Ġa . getBoolean ( R . style able . Sprite View _ auto Play , Ġauto Play ) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġmax Cycles Ġ= Ġa . getInt ( R . style able . Sprite View _ cycles , Ġmax Cycles ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( auto Play ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĊĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( image Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsprite Width Ġ= Ġimage !!. width . toDouble () Ġ/ Ġcolumns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsprite Height Ġ= Ġimage !!. height . toDouble () Ġ/ Ġrows ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . schedule ( 0 , Ġ( 1 0 0 0 Ġ/ Ġfps ). to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Frame Ġ== Ġcurrent Frame ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Frames () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Frame ++ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max Cycles Ġ> Ġ 0 Ġ&& Ġcurrent Cycle Ġ> Ġmax Cycles ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ schedule Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Frame Ġ== Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Cycle Ġ+= Ġ 1 Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ChangeListener ?. onStart ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġpause () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Frame Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ChangeListener ?. on Stop ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreset Frames () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠ Ġcurrent Cycle Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠĠĠĠĠ Ġtimer Ġ= ĠTimer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Frames () Ġ{ ĊĠĠĠĠĠĠĠ Ġrender Row Ġ= Ġif Ġ( is Fixed Row ) Ġrender Row Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġrender Column Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġcurrent Frame Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( image Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc X Ġ= Ġrender Column Ġ* Ġsprite Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Y Ġ= Ġrender Row Ġ* Ġsprite Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Frame . left Ġ= Ġsrc X . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Frame . top Ġ= Ġsrc Y . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Frame . right Ġ= Ġ( src X Ġ+ Ġsprite Width ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Frame . bottom Ġ= Ġ( src Y Ġ+ Ġsprite Height ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Frame . left Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Frame . top Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Frame . right Ġ= Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Frame . bottom Ġ= Ġheight ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( image !! , Ġsrc Frame , Ġdst Frame , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( render Column Ġ== Ġcolumns Ġ- Ġ 1 Ġ&& Ġ! is Fixed Row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Row Ġ= Ġ++ render Row Ġ% Ġrows ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Column Ġ= Ġ++ render Column Ġ% Ġcolumns ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ChangeListener ?. on Update Frame ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }