PureBasic

Forums PureBasic
Nous sommes le Mar 16/Juil/2019 19:35

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 11 messages ] 
Auteur Message
 Sujet du message: Le Tweening ? Trop fastoch !!
MessagePosté: Ven 14/Déc/2018 14:00 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Bonjour, pour rester dans l'esprit des modules simple à utiliser qui font tout le boulot tout seul, voici EZEase, un moteur de tweening très simple d'utilisation qui donnera sans aucun effort des rendu smooth à vos animations ;)
Pour ne pas avoir à y aller à l'aveugle, vous pouvez avoir un aperçu de quiquifékoi ICI
Code:
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


Dernière édition par boby le Jeu 21/Fév/2019 10:16, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Ven 14/Déc/2018 17:31 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4216
Localisation: Arras, France
Joli travail


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Ven 14/Déc/2018 18:12 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Merci Djes.
Petite MAJ pour du petit bug fix (j'ai pas encore testé tous les ease, j'éspère que j'me suis pas trop planté en le recopiants :p) et j'en ai profité pour virer l'énorme select que j'avais mis pour tester si le bousin fonctionnait ou pas.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Ven 14/Déc/2018 18:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 14/Oct/2004 19:48
Messages: 1121
Ca va être utile surtout pour copier/coller la fonction spécifique dont on a besoin dans un cas particulier.
Merci pour ton boulot. :wink:

_________________
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 5.45LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Ven 14/Déc/2018 18:57 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Pour les fonctions de easing, j'ai moi même tout pompé ICI :p donc fait toi plaisir :wink:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Ven 14/Déc/2018 22:20 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3459
C'est une belle participation ce sujet Boby.
J'apprends que le terme ease semble signifier échelonner.

Je parlais (publiquement) de l'échelonnement intégré dans un neurone artificiel à Fig, et l'illustration sur le site de ton 1er lien, avec les différentes courbes possibles est un beau résumé des échelonnement possibles.

Ce n'est pas très mathématique leur méthode de classement et de nomination, mais, ça a le don d'être pragmatique.

@Fig

Maintenant que je dispose d'un vocabulaire grâce à ce site offert dans ce sujet, je peux te préciser que l'échelonnement en question est le EaseExpo. C'est plus simple quand on a les mots... Sûrement avais-tu déjà trouvé depuis le temps de ma remarque, faute d'avoir eu plus de précisions de ma part.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Sam 15/Déc/2018 3:55 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
Sympa tout ça !! :P

Au fait, si les métiers de l'éducation vous intéressent, l'éducation nationale va recruter en masse toutes les personnes qui s'y connaissent en informatique (ils seront peu regardant sur les diplômes).
Les nouveaux programmes contiennent des heures d'infos obligatoires. 1h30 pour les secondes, 4h pour les premières, 6h pour les terminales(rentrée 2020) sans compter les enseignements optionnels de seconde !
Idem pour la maintenance des parcs informatiques.
La réforme a été lancée, rien n'a été prévu, c'est la panique !!!!!

Hasta la vista !

_________________
Elevé au MSX !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Sam 15/Déc/2018 6:14 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3459
HuitBit is good !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Lun 17/Déc/2018 10:12 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 24/Aoû/2005 10:42
Messages: 464
Huitbit a écrit:
La réforme a été lancée, rien n'a été prévu, c'est la panique !!!!!

Pourquoi, d'habitude en France quand on lance des réformes, on prévoit tout ?? :mrgreen:

_________________
Bureau : Win10 64bits
Maison : Macbook Pro 13" Retina / SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone X 256 Go


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Jeu 21/Fév/2019 10:17 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Maj : petit bug fix, oubli de () sur les InOut


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Le Tweening ? Trop fastoch !!
MessagePosté: Jeu 21/Fév/2019 15:26 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1012
Salut, mes respect, super boulot :o , ça devrait intégrer à purebasic un truc comme ça !

_________________
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 11 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye