package Ġtriple k lay . ui . util Ċ Ċ import Ġk lay . scene . Pointer Ċ import Ġe uk lid . f . I Point Ċ import Ġe uk lid . f . Math Util Ċ import Ġe uk lid . f . Point Ċ import Ġreact . Signal Ċ import Ġkotlin . math . sign Ċ Ċ /** Ċ Ġ* ĠTrans lates Ġpointer Ġinput Ġon Ġa Ġlayer Ġinto Ġan Ġx , Ġy Ġoffset . ĠWith Ġa Ġsufficient ly Ġlarge Ġdrag Ġdelta , Ċ Ġ* Ġcalculates Ġa Ġvelocity , Ġapplies Ġit Ġto Ġthe Ġposition Ġover Ġtime Ġand Ġdim in ishes Ġits Ġvalue Ġby Ċ Ġ* Ġf riction . ĠFor Ġsmaller Ġdrag Ġdelt as , Ġdis patches Ġthe Ġpointer Ġend Ġevent Ġon Ġthe Ġ[. clicked ] Ċ Ġ* Ġsignal . ĊĊ Ġ* Ċ Ġ* Ġ** NOTE :** Clients Ġof Ġthis Ġclass Ġmust Ġcall Ġ[. update ], Ġso Ġthat Ġf riction Ġand Ċ Ġ* Ġother Ġcalculations Ġcan Ġbe Ġapplied . ĠThis Ġis Ġnormally Ġdone Ġwithin Ġthe Ġclient 's Ġown Ġupdate Ġmethod Ċ Ġ* Ġand Ġfollowed Ġby Ġsome Ġusage Ġof Ġthe Ġ[. position ] Ġmethod . ĠFor Ġexample : ĊĊ Ġ* Ġ< pre >` XY F lick er Ġf lick er Ġ= Ġnew ĠXY F lick er (); Ċ Ġ* ĠLayer Ġlayer Ġ= Ġ... ; Ċ Ġ* Ġ{ Ġlayer . addListener ( f lick er ); Ġ} Ċ Ġ* Ġvoid Ġupdate Ġ( int Ġdelta ) Ġ{ Ċ Ġ* Ġf lick er . update ( delta ); Ċ Ġ* Ġlayer . set Translation ( f lick er . position (). x (), Ġf lick er . position (). y ()); Ċ Ġ* Ġ} Ċ ` </ pre > Ġ* ĊĊ Ġ* ĠTODO : Ġfigure Ġout Ġhow Ġto Ġimplement Ġwith Ġtwo ĠF lick ers . Ġcould Ġrequire Ġsome Ġchanges Ġthere in Ġsince Ċ Ġ* Ġyou Ġprobably Ġdon 't Ġwant Ġthem Ġto Ġhave Ġdiffer ing Ġstates , Ġplus Ġ 2 x Ġclicked Ġsignals Ġis Ġwast ef ul Ċ Ġ*/ Ċ class ĠXY F lick er Ġ: ĠPointer . Listener Ġ{ ĊĠĠĠ Ġ/** ĠSignal Ġdis patched Ġwhen Ġa Ġpointer Ġusage Ġdid Ġnot Ġend Ġup Ġbeing Ġa Ġf lick . Ġ Ġ*/ ĊĠĠĠ Ġvar Ġclicked Ġ= ĠSignal < k lay . core . Pointer . Event >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġcurrent Ġposition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġposition (): ĠI Point Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ position ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart ( i act : ĠPointer . Interaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ vel . set ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġ_ max Delta Sq Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ_ orig Pos . set (_ position ) ĊĠĠĠĠĠĠĠ Ġget Position ( i act . event !! , Ġ_ start ) ĊĠĠĠĠĠĠĠ Ġ_ prev . set (_ start ) ĊĠĠĠĠĠĠĠ Ġ_ cur . set (_ start ) ĊĠĠĠĠĠĠĠ Ġ_ prev Stamp Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ_ cur Stamp Ġ= Ġi act . event !!. time ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Drag ( i act : ĠPointer . Interaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ prev . set (_ cur ) ĊĠĠĠĠĠĠĠ Ġ_ prev Stamp Ġ= Ġ_ cur Stamp ĊĠĠĠĠĠĠĠ Ġget Position ( i act . event !! , Ġ_ cur ) ĊĠĠĠĠĠĠĠ Ġ_ cur Stamp Ġ= Ġi act . event !!. time ĊĠĠĠĠĠĠĠ Ġvar Ġdx Ġ= Ġ_ cur . x Ġ- Ġ_ start . x ĊĠĠĠĠĠĠĠ Ġvar Ġdy Ġ= Ġ_ cur . y Ġ- Ġ_ start . y ĊĠĠĠĠĠĠĠ Ġset Position (_ orig Pos . x Ġ+ Ġdx , Ġ_ orig Pos . y Ġ+ Ġdy ) ĊĠĠĠĠĠĠĠ Ġ_ max Delta Sq Ġ= Ġmax Of ( dx Ġ* Ġdx Ġ+ Ġdy Ġ* Ġdy , Ġ_ max Delta Sq ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġthe Ġpurposes Ġof Ġcapturing Ġthe Ġevent Ġstream , Ġdx Ġand Ġdy Ġare Ġc apped Ġby Ġtheir Ġranges ĊĠĠĠĠĠĠĠ Ġdx Ġ= Ġ_ position . x Ġ- Ġ_ orig Pos . x ĊĠĠĠĠĠĠĠ Ġdy Ġ= Ġ_ position . y Ġ- Ġ_ orig Pos . y ĊĠĠĠĠĠĠĠ Ġif Ġ( dx Ġ* Ġdx Ġ+ Ġdy Ġ* Ġdy Ġ>= Ġmax Click Delta Sq ()) Ġi act . capture () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon End ( i act : ĠPointer . Interaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġjust Ġdispatch Ġa Ġclick Ġif Ġthe Ġpointer Ġdidn 't Ġmove Ġvery Ġfar ĊĠĠĠĠĠĠĠ Ġif Ġ(_ max Delta Sq Ġ< Ġmax Click Delta Sq ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclicked . emit ( i act . event !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġnot , Ġmaybe Ġimp art Ġsome Ġvelocity ĊĠĠĠĠĠĠĠ Ġval Ġdrag Time Ġ= Ġ(_ cur Stamp Ġ- Ġ_ prev Stamp ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠPoint (_ cur . x Ġ- Ġ_ prev . x , Ġ_ cur . y Ġ- Ġ_ prev . y ) ĊĠĠĠĠĠĠĠ Ġval Ġdrag Vel Ġ= Ġdelta . mult ( 1 Ġ/ Ġdrag Time ) ĊĠĠĠĠĠĠĠ Ġvar Ġdrag Speed Ġ= Ġdrag Vel . distance ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġif Ġ( drag Speed Ġ> Ġf lick Speed Th resh () Ġ&& Ġdelta . distance ( 0 f , Ġ 0 f ) Ġ> Ġmin F lick Delta ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag Speed Ġ> Ġmax F lick Speed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Vel . mult Local ( max F lick Speed () Ġ/ Ġdrag Speed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Speed Ġ= Ġmax F lick Speed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ vel . set ( drag Vel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ vel . mult Local ( f lick X fer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsx Ġ= Ġ_ vel . x . sign ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsy Ġ= Ġ_ vel . y . sign ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ accel . x Ġ= Ġ- sx Ġ* Ġf riction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ accel . y Ġ= Ġ- sy Ġ* Ġf riction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cancel ( i act : ĠPointer . Interaction ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ vel . set ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġ_ accel . set ( 0 f , Ġ 0 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( delta : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ vel . x Ġ== Ġ 0 f Ġ&& Ġ_ vel . y Ġ== Ġ 0 f ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ_ prev . set (_ position ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġapply Ġx Ġand Ġy Ġvelocity ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĠMath Util . clamp (_ position . x Ġ+ Ġ_ vel . x Ġ* Ġdelta , Ġ_ min . x , Ġ_ max . x ) ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= ĠMath Util . clamp (_ position . y Ġ+ Ġ_ vel . y Ġ* Ġdelta , Ġ_ min . y , Ġ_ max . y ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġstop Ġwhen Ġwe Ġhit Ġthe Ġedges ĊĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġ_ position . x ) Ġ_ vel . x Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġif Ġ( y Ġ== Ġ_ position . y ) Ġ_ vel . y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ_ position . set ( x , Ġy ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġapply Ġx Ġand Ġy Ġacceleration ĊĠĠĠĠĠĠĠ Ġ_ vel . x Ġ= Ġapply Accel ert ion (_ vel . x , Ġ_ accel . x , Ġdelta ) ĊĠĠĠĠĠĠĠ Ġ_ vel . y Ġ= Ġapply Accel ert ion (_ vel . y , Ġ_ accel . y , Ġdelta ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe sets Ġthe Ġf lick er Ġto Ġthe Ġgiven Ġmaximum Ġvalues . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreset ( max X : ĠFloat , Ġmax Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ max . set ( max X , Ġmax Y ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġre clamp Ġthe Ġposition ĊĠĠĠĠĠĠĠ Ġset Position (_ position . x , Ġ_ position . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġf lick er Ġposition , Ġin Ġthe Ġcase Ġof Ġa Ġprogram matic Ġchange . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġposition Changed ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Position ( x , Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠTrans lates Ġa Ġpointer Ġevent Ġinto Ġa Ġposition . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Position ( event : Ġk lay . core . Pointer . Event , Ġdest : ĠPoint ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdest . set (- event . x , Ġ- event . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSets Ġthe Ġcurrent Ġposition , Ġclamp ing Ġthe Ġvalues Ġbetween Ġmin Ġand Ġmax . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Position ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ position . set ( Math Util . clamp ( x , Ġ_ min . x , Ġ_ max . x ), ĠMath Util . clamp ( y , Ġ_ min . y , Ġ_ max . y )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġminimum Ġdistance Ġ( in Ġpixels ) Ġthe Ġpointer Ġmust Ġhave Ġmoved Ġto Ġregister Ġas Ġa ĊĠĠĠĠ Ġ* Ġf lick . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmin F lick Delta (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġde cel eration Ġ( in Ġpixels Ġper Ġms Ġper Ġms ) Ġapplied Ġto Ġnon - zero Ġvelocity . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġf riction (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 . 0 0 1 5 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġminimum Ġ( positive ) Ġspeed Ġ( in Ġpixels Ġper Ġmilli second ) Ġat Ġtime Ġof Ġtouch Ġrelease ĊĠĠĠĠ Ġ* Ġrequired Ġto Ġinitiate Ġa Ġf lick Ġ( i . e . Ġtransfer Ġthe Ġf lick Ġvelocity Ġto Ġthe Ġentity ). Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġf lick Speed Th resh (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 . 5 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġfraction Ġof Ġf lick Ġspeed Ġthat Ġis Ġtransfer ed Ġto Ġthe Ġentity Ġ( a Ġvalue Ġbetween Ġ 0 ĊĠĠĠĠ Ġ* Ġand Ġ 1 ). Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġf lick X fer (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 . 9 5 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġmaximum Ġf lick Ġspeed Ġthat Ġwill Ġbe Ġtransfer ed Ġto Ġthe Ġentity ; Ġlimits Ġthe Ġactual ĊĠĠĠĠ Ġ* Ġf lick Ġspeed Ġat Ġtime Ġof Ġrelease . ĠThis Ġvalue Ġis Ġnot Ġadjusted Ġby Ġ[. f lick X fer ]. Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmax F lick Speed (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 . 4 f Ġ// Ġpixels / ms ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġsquare Ġof Ġthe Ġmaximum Ġdistance Ġ( in Ġpixels ) Ġthe Ġpointer Ġis Ġallowed Ġto Ġtravel ĊĠĠĠĠ Ġ* Ġwhile Ġpressed Ġand Ġstill Ġregister Ġas Ġa Ġclick . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmax Click Delta Sq (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 2 2 5 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ max Delta Sq : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠĠĠ Ġprivate Ġval Ġ_ position Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġval Ġ_ vel Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġval Ġ_ accel Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġval Ġ_ orig Pos Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġval Ġ_ start Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġval Ġ_ cur Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġval Ġ_ prev Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġval Ġ_ max Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġval Ġ_ min Ġ= ĠPoint () ĊĠĠĠ Ġprivate Ġvar Ġ_ prev Stamp : ĠDouble Ġ= Ġ 0 . toDouble () ĊĠĠĠ Ġprivate Ġvar Ġ_ cur Stamp : ĠDouble Ġ= Ġ 0 . toDouble () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġapply Accel ert ion ( v : ĠFloat , Ġa : ĠFloat , Ġdt : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ+= Ġa Ġ* Ġdt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġde cel erate Ġpast Ġzero Ġvelocity , Ġstop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( prev . sign Ġ== Ġv . sign ) Ġv Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ