
Pour ne pas avoir à y aller à l'aveugle, vous pouvez avoir un aperçu de quiquifékoi ICI
Code : Tout sélectionner
DeclareModule EZEase
  ;{ Ease list
  #EZEase_easeLinear = "easeLinear"
  #EZEase_easeInQuad = "easeInQuad"
  #EZEase_easeOutQuad = "easeOutQuad"
  #EZEase_easeInOutQuad = "easeInOutQuad"
  #EZEase_easeInCubic = "easeInCubic"
  #EZEase_easeOutCubic = "easeOutCubic"
  #EZEase_easeInOutCubic = "easeInOutCubic"
  #EZEase_easeInQuart = "easeInQuart"
  #EZEase_easeOutQuart = "easeOutQuart"
  #EZEase_easeInOutQuart = "easeInOutQuart"
  #EZEase_easeInQuint = "easeInQuint"
  #EZEase_easeOutQuint = "easeOutQuint"
  #EZEase_easeInOutQuint = "easeInOutQuint"
  #EZEase_easeInSine = "easeInSine"
  #EZEase_easeOutSine = "easeOutSine"
  #EZEase_easeInOutSine = "easeInOutSine"
  #EZEase_easeInExpo = "easeInExpo"
  #EZEase_easeOutExpo = "easeOutExpo"
  #EZEase_easeInOutExpo = "easeInOutExpo"
  #EZEase_easeInCirc = "easeInCirc"
  #EZEase_easeOutCirc = "easeOutCirc"
  #EZEase_easeInOutCirc = "easeInOutCirc"
  #EZEase_easeInElastic = "easeInElastic"
  #EZEase_easeOutElastic = "easeOutElastic"
  #EZEase_easeInOutElastic = "easeInOutElastic"
  #EZEase_easeInBack = "easeInBack"
  #EZEase_easeOutBack = "easeOutBack"
  #EZEase_easeInOutBack = "easeInOutBack"
  #EZEase_easeInBounce = "easeInBounce"
  #EZEase_easeOutBounce = "easeOutBounce"
  #EZEase_easeInOutBounce = "easeInOutBounce"
  Enumeration #PB_EventType_FirstCustomValue
    #EZEase_EndEase
  EndEnumeration ;}
  Declare CreateEase(EaseType.s,StartValue.f,ChangeInValue.f,Duration.f)
  Declare FreeEase(*Ease)
  Declare InitEase(*Ease)
  Declare.f EaseResult(*Ease)
  Declare EditeEase(*Ease,StartValue.f,ChangeInValue.f,Duration.f)
EndDeclareModule
Module EZEase
  ;{ Declaration
  Structure Ease
    Type.s
    t.f
    b.f
    c.f
    d.f
  EndStructure
  Global NewList Ease.Ease()
  
  Prototype.f EaseName(t.f,b.f,c.f,d.f)
  
  Declare.f EaseLinear(t.f,b.f,c.f,d.f)
  Declare.f easeInQuad(t.f,b.f,c.f,d.f)
  Declare.f easeOutQuad(t.f,b.f,c.f,d.f)
  Declare.f easeInOutQuad(t.f,b.f,c.f,d.f)
  Declare.f easeInCubic(t.f,b.f,c.f,d.f)
  Declare.f easeOutCubic(t.f,b.f,c.f,d.f)
  Declare.f easeInOutCubic(t.f,b.f,c.f,d.f)
  Declare.f easeInQuart(t.f,b.f,c.f,d.f)
  Declare.f easeOutQuart(t.f,b.f,c.f,d.f)
  Declare.f easeInOutQuart(t.f,b.f,c.f,d.f)
  Declare.f easeInQuint(t.f,b.f,c.f,d.f)
  Declare.f easeOutQuint(t.f,b.f,c.f,d.f)
  Declare.f easeInOutQuint(t.f,b.f,c.f,d.f)
  Declare.f easeInSine(t.f,b.f,c.f,d.f)
  Declare.f easeOutSine(t.f,b.f,c.f,d.f)
  Declare.f easeInOutSine(t.f,b.f,c.f,d.f)
  Declare.f easeInExpo(t.f,b.f,c.f,d.f)
  Declare.f easeOutExpo(t.f,b.f,c.f,d.f)
  Declare.f easeInOutExpo(t.f,b.f,c.f,d.f)
  Declare.f easeInCirc(t.f,b.f,c.f,d.f)
  Declare.f easeOutCirc(t.f,b.f,c.f,d.f)
  Declare.f easeInOutCirc(t.f,b.f,c.f,d.f)
  Declare.f easeInElastic(t.f,b.f,c.f,d.f)
  Declare.f easeOutElastic(t.f,b.f,c.f,d.f)
  Declare.f easeInOutElastic(t.f,b.f,c.f,d.f)
  Declare.f easeInBack(t.f,b.f,c.f,d.f)
  Declare.f easeOutBack(t.f,b.f,c.f,d.f)
  Declare.f easeInOutBack(t.f,b.f,c.f,d.f)
  Declare.f easeInBounce(t.f,b.f,c.f,d.f)
  Declare.f easeOutBounce(t.f,b.f,c.f,d.f)
  Declare.f easeInOutBounce(t.f,b.f,c.f,d.f)
  ;}
  ; Public procedure
  Procedure CreateEase(EaseType.s,StartValue.f,ChangeInValue.f,Duration.f)
    AddElement(Ease())
    Ease()\Type  = EaseType
    Ease()\b = StartValue
    Ease()\c = ChangeInValue
    Ease()\d = Duration
    Ease()\t = ElapsedMilliseconds()
    ProcedureReturn @Ease()
  EndProcedure
 
  Procedure FreeEase(*Ease)
    ChangeCurrentElement(Ease(),*Ease)
    DeleteElement(Ease())
  EndProcedure
 
  Procedure InitEase(*Ease.Ease)
    *Ease\t = ElapsedMilliseconds()
  EndProcedure
 
  Procedure.f EaseResult(*Ease.Ease)
    Protected t.f = ElapsedMilliseconds() - *Ease\t, CallEase.EaseName = GetRuntimeInteger("EZEase::"+*Ease\Type + "()")
    If t > *Ease\d
      PostEvent(#EZEase_EndEase,0,0,0,*Ease)
      ProcedureReturn *Ease\c
    EndIf
    ProcedureReturn CallEase(t,*Ease\b,*Ease\c,*Ease\d)
  EndProcedure
  Procedure EditeEase(*Ease.Ease,StartValue.f,ChangeInValue.f,Duration.f)
    *Ease\b = StartValue
    *Ease\c = ChangeInValue
    *Ease\d = Duration
    *Ease\t = ElapsedMilliseconds()
  EndProcedure
  ; Private procedure
 
  Runtime Procedure.f easeLinear(t.f,b.f,c.f,d.f)
    ProcedureReturn c*t/d + b
  EndProcedure
  Runtime Procedure.f easeInQuad(t.f,b.f,c.f,d.f)
    t/d
    ProcedureReturn c*t*t + b
  EndProcedure
  Runtime Procedure.f easeOutQuad(t.f,b.f,c.f,d.f)
    t/d
    ProcedureReturn -c *t*(t-2) + b
  EndProcedure
  Runtime Procedure.f easeInOutQuad(t.f,b.f,c.f,d.f)
    t = t/(d/2)
    If t < 1
      ProcedureReturn c/2*t*t+b
    EndIf
    t - 1
    ProcedureReturn -c/2 * (t*(t-2)-1) +b
  EndProcedure
  Runtime Procedure.f easeInCubic(t.f,b.f,c.f,d.f)
    t / d
    ProcedureReturn c*t*t*t + b
  EndProcedure
  Runtime Procedure.f easeOutCubic(t.f,b.f,c.f,d.f)
    t = t / d - 1
    ProcedureReturn c*(t*t*t+1) + b
  EndProcedure
  Runtime Procedure.f easeInOutCubic(t.f,b.f,c.f,d.f)
    t= t/(d/2)
    If t < 1
      ProcedureReturn c/2*t*t*t + b
    EndIf
    t - 2
    ProcedureReturn c/2*(t*t*t + 2) + b
  EndProcedure
  Runtime Procedure.f easeInQuart(t.f,b.f,c.f,d.f)
    t / d
    ProcedureReturn c*t*t*t*t + b
  EndProcedure
  Runtime Procedure.f easeOutQuart(t.f,b.f,c.f,d.f)
    t = t / d - 1
    ProcedureReturn -c * (t*t*t*t - 1) + b
  EndProcedure
  Runtime Procedure.f easeInOutQuart(t.f,b.f,c.f,d.f)
    t = t/(d/2)
    If t < 1
      ProcedureReturn c / 2 * t*t*t*t + b
    EndIf
    t - 2
    ProcedureReturn -c/2 * (t*t*t*t - 2) + b
  EndProcedure
  Runtime Procedure.f easeInQuint(t.f,b.f,c.f,d.f)
    t/d
    ProcedureReturn c*t*t*t*t*t + b
  EndProcedure
  Runtime Procedure.f easeOutQuint(t.f,b.f,c.f,d.f)
    t = t/d - 1
    ProcedureReturn c*(t*t*t*t*t+1) + b
  EndProcedure
  Runtime Procedure.f easeInOutQuint(t.f,b.f,c.f,d.f)
    t = t/(d/2)
    If t < 1
      ProcedureReturn c/2*t*t*t*t*t + b
    EndIf
    t - 2
    ProcedureReturn c/2*(t*t*t*t*t + 2) + b
  EndProcedure
  Runtime Procedure.f easeInSine(t.f,b.f,c.f,d.f)
    ProcedureReturn -c * Cos(t/d * (#PI/2)) + c + b
  EndProcedure
  Runtime Procedure.f easeOutSine(t.f,b.f,c.f,d.f)
    ProcedureReturn c * Sin(t/d * (#PI/2)) + b
  EndProcedure
  Runtime Procedure.f easeInOutSine(t.f,b.f,c.f,d.f)
    ProcedureReturn -c/2 * Cos((#PI*t/d)-1) + b
  EndProcedure
  Runtime Procedure.f easeInExpo(t.f,b.f,c.f,d.f)
    If t = 0
      ProcedureReturn b
    EndIf
    ProcedureReturn c * Pow(2,10 * (t/d-1)) +b
  EndProcedure
  Runtime Procedure.f easeOutExpo(t.f,b.f,c.f,d.f)
    If t = d
      ProcedureReturn b+c
    EndIf
    ProcedureReturn c * (-Pow(2,-10*t/d)+1) + b
  EndProcedure
  Runtime Procedure.f easeInOutExpo(t.f,b.f,c.f,d.f)
    If t = 0 : ProcedureReturn b : EndIf
    If t = d : ProcedureReturn b+c : EndIf
    t = t/(d/2)
    If t < 1
      ProcedureReturn c/2 * Pow(2,10*(t-1))+b
    EndIf
    t-1
    ProcedureReturn c/2*(-Pow(2,-10 * t)+2)+b
  EndProcedure
  Runtime Procedure.f easeInCirc(t.f,b.f,c.f,d.f)
    t/d
    ProcedureReturn -c * Sqr(1- (t*t-1)) + b
  EndProcedure
  Runtime Procedure.f easeOutCirc(t.f,b.f,c.f,d.f)
    t = t/d-1
    ProcedureReturn c * Sqr(1-t*t) + b
  EndProcedure
  Runtime Procedure.f easeInOutCirc(t.f,b.f,c.f,d.f)
    t = t/(d/2)
    If t < 1
      ProcedureReturn -c/2 * (Sqr(1 - t*t)-1) + b
    EndIf
    t-2
    ProcedureReturn c/2 * (Sqr(1 - t*t)+1) + b
  EndProcedure
  Runtime Procedure.f easeInElastic(t.f,b.f,c.f,d.f)
    Protected s.f = 1.70158, p.f = d * 0.3, a.f = c
    If t = 0 : ProcedureReturn b : EndIf
    t/d
    If t = 1 : ProcedureReturn b+c : EndIf
    If a < Abs(c)
      s = p/4
    Else
      s = p/(2*#PI) * ASin(c/a)
    EndIf
    t-1
    ProcedureReturn -(a*Pow(2,10*t) * Sin( (t*d-s)*(2*#PI)/p)) + b
  EndProcedure
  Runtime Procedure.f easeOutElastic(t.f,b.f,c.f,d.f)
    Protected s.f = 1.70158, p.f = d*0.3, a.f = c
    If t = 0 : ProcedureReturn b : EndIf
    t/d
    If t = 1 : ProcedureReturn b+c : EndIf
    If a < Abs(c)
      s = p/4
    Else
      s = p/(2*#PI) * ASin(c/a)
    EndIf
    ProcedureReturn a*Pow(2,-10*t)* Sin((t*d-s)*(2*#PI)/p) + c + b
  EndProcedure
  Runtime Procedure.f easeInOutElastic(t.f,b.f,c.f,d.f)
    Protected s.f = 1.70158, p.f = d*(0.3*1.5), a.f = c
    If a < Abs(c)
      s = p/4
    Else
      s = p/(2*#PI) * ASin(c/a)
    EndIf
    t-1
    If t < 1
      ProcedureReturn -0.5*(a*Pow(2,10*t)) * Sin((t*d-s)*(2*#PI)/p) + b
    EndIf
    ProcedureReturn a*Pow(2,-10*t) * Sin((t*d-s)*(2*#PI)/p )* 0.5 + c+b
  EndProcedure
  Runtime Procedure.f easeInBack(t.f,b.f,c.f,d.f)
    Protected s.f = 1.70158
    t/d
    ProcedureReturn c*t*t*((s+1)*t -s ) + b
  EndProcedure
  Runtime Procedure.f easeOutBack(t.f,b.f,c.f,d.f)
    Protected s.f = 1.70158
    t = t/d-1
    ProcedureReturn c*(t*t*((s+1)*t+s)+1)+b
  EndProcedure
  Runtime Procedure.f easeInOutBack(t.f,b.f,c.f,d.f)
    Protected s.f = 1.525
    t = t/(d/2)
    If t < 1
      ProcedureReturn c/2*(t*t*((s+1)*t-s))+b
    EndIf
    t-2
    ProcedureReturn c/2*(t*t*((s+1)*t+s)+2)+b
  EndProcedure
  Runtime Procedure.f easeInBounce(t.f,b.f,c.f,d.f)
    ProcedureReturn c- easeOutBounce(d-t,0,c,d)+b
  EndProcedure
  Runtime Procedure.f easeOutBounce(t.f,b.f,c.f,d.f)
    t/d
    If t < 1/2.75
      ProcedureReturn c*(7.5625*t*t)+b
    ElseIf t < 2/2.75
      t = t - 1.5/2.75
      ProcedureReturn c*(7.5626*t*t + 0.75)+b
    ElseIf t < 2.5/2.75
      t = t-2.25/2.75
      ProcedureReturn c*(7.5625*t*t+0.9375)+b
    Else
      t = t- 2.625/2.75
      ProcedureReturn c*(7.5625*t*t+0.984375) + b
    EndIf
  EndProcedure
  Runtime Procedure.f easeInOutBounce(t.f,b.f,c.f,d.f)
    If t < d/2
      ProcedureReturn easeInBounce(t*2,0,c,d)*0.5+b
    EndIf
    ProcedureReturn easeOutBounce(t*2-d,0,c,d) * 0.5+c*0.5+b
  EndProcedure
EndModule
CompilerIf #PB_Compiler_IsMainFile
  Procedure resetEase()
    EZEase::InitEase(EventData())
  EndProcedure
 
  OpenWindow(0,0,0,500,500,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  InitSprite()
  OpenWindowedScreen(WindowID(0),0,0,500,500)
  SetFrameRate(60)
  BindEvent(EZEase::#EZEase_EndEase,@resetEase())
  spr = CreateSprite(#PB_Any,20,20)
  StartDrawing(SpriteOutput(spr))
  Box(0,0,20,20,$1122FF)
  StopDrawing()
  Elastic = EZEase::CreateEase(EZEase::#EZEase_easeOutElastic,0,400,2000)
  Bounce = EZEase::CreateEase(EZEase::#EZEase_easeOutBounce,0,400,1000)
  Circ = EZEase::CreateEase(EZEase::#EZEase_easeOutCirc,0,400,1500)
  Back = EZEase::CreateEase(EZEase::#EZEase_easeOutBack,0,400,1800)
  Expo = EZEase::CreateEase(EZEase::#EZEase_easeInExpo,0,400,3000)
  time = ElapsedMilliseconds()
  Repeat
    ClearScreen($000000)
    DisplaySprite(spr,EZEase::EaseResult(Elastic),10)
    DisplaySprite(spr,EZEase::EaseResult(Bounce),40)
    DisplaySprite(spr,EZEase::EaseResult(Circ),70)
    DisplaySprite(spr,EZEase::EaseResult(Back),100)
    DisplaySprite(spr,EZEase::EaseResult(Expo),130)
    FlipBuffers()
  Until WindowEvent() = #PB_Event_CloseWindow
CompilerEndIf


 
 

 , ça devrait intégrer à purebasic un truc comme ça !
 , ça devrait intégrer à purebasic un truc comme ça !