Page 1 sur 2

Lib sur l'animation du texte

Publié : mer. 18/août/2004 23:52
par Oliv
Garzul (qu'est-ce qu'il nous fait faire celui-là, un jour on va copier son orthographe :lol: ) m'a demandé comment faire onduler du texte, je ne savais pas mais j'avais une peite idée alors j'ai essayé et j'ai peut-être réinventé la roue (soyons modestes) mais voilà mon code. Je vais y mettre d'autres animation que j'ai en tête et faire un lib.

essayez aussi en metant les paramètres Hauteur et Vitesse à 1, moi je trouve ça très drôle, ça fait plus vibreur que onduleur mais bon :D

edit : Grace à Garzul vous avez le droit aux comentaires de la fonction Ondulation()

Code : Tout sélectionner

InitSprite()

; Variables
Hauteur.l = 2 ; Multiplicateur de Sin() qui augmente ou réduit le débatement du texte.
Vitesse.l = 90 ; Temps du Delay() qui ralentit/augmente l'animation.
Texte.s = "Ceci est un texte qui ondule"
Global Texte,Y.l,Angle.l,Hauteur,Vitesse


; Création de la fenêtre - en plein écran le mouvement est plus lisse
OpenWindow(0,0,0,220,70,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"Texte")
OpenWindowedScreen(WindowID(),0,0,220,70,0,0,0)

Procedure Affichage()
  FlipBuffers()
  ClearScreen(0,0,0)
EndProcedure

Procedure Ondulation()
  X.l = 10
  StartDrawing(ScreenOutput()) ; Pour pouvoir utiliser les commandes des dessin 2D.
    DrawingMode(1) ; On selectionne le mode pour ne pas avoir de fond derrière es lettres.
    FrontColor(255,0,0) ; On change la couleur.
    For i = 1 To Len(Texte) ; On repette pour chaque lettre.
      X + (TextLength(Texte) / Len(texte)) ; On avance en X de la taille d'un caractère.
      Angle + 1 ; On augmente l'angle d'un.
      If Angle > 360 ; si il est supérieur à 360 (un tour) on le remet à 0. On pourrait ne pas mettre
; ce controle mais au bout d'un certain temps la valeur maximale des long serait dépassée.
        Angle = 0
      EndIf
      Locate(X,27 + (Sin(Angle) * Hauteur)) ; On se place en X et en Y.
; Sin(Angle) sert à donner le décalage de chaque lettre, on multiplie par Hauteur pour l'augmenter.
      DrawText(Mid(Texte,i,1)) ; On affiche la lettre.
    Next i ; et on recommence...
  StopDrawing() ; On signife que l'on arrête les fonctions dessin 2D.
EndProcedure

Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      Sortie.b = 1
  EndSelect
  Ondulation()
  Affichage()
  Delay(Vitesse)
Until Sortie = 1

End

Publié : jeu. 19/août/2004 0:28
par Dr. Dri
sympa, une suggestion (en espérant me faire comprendre)

ton texte ondule selon une hauteur, on considere que c'est le diametre du cercle sur le quel le texte ondule...
avec ca et les fonctions TextLength() et Mid() tu peux changer ton effet de facon à ce que ca ondule aussi à l'horizontale...

je vais essayer de faire un exemple... mais avec la hauteur des caracters c'est pas évident ^^

Code : Tout sélectionner

                ondu
              i     le
             u        !
s           q          !
 u        e
  pe    xt
    r te
au lieu de

Code : Tout sélectionner

   e   e           u   !
s p r t x e q i o d l !
 u       t   u   n   e
Dri

Publié : jeu. 19/août/2004 1:27
par garzul
:D Vous voyez que je peux donner des idéés a quelqu'un .

Sinon j'ai fait un programme avec le code d'oliv sa fait un effet matrix.

ps : Oliv dis moi ce que t'en pense !

Voici le code : (pas commenter et brouillon et ATTENTION AU YEUX )

Code : Tout sélectionner

InitSprite() And InitKeyboard()

;- Declarations
; Constantes

; Structures

; Listes

; Buffer

; Variables
Hauteur.l = 700 ; Multiplicateur de Sin() qui augmente ou réduit le débatement du texte.
Vitesse.l = 1 ; Temps du Delay() qui ralentit/augmente l'animation
Texte.s = "010101010101010101010101010101010101010101010101010110101010101010010101010101010101010101010100101010101010101010101010101010101010101001"
Texte2.s = "101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100101010101010101010101010100"
Texte3.s = "010101010101010101010101010101010101010101010101010110101010101010010101010101010101010101010100101010101010101010101010101010101010101001"
Texte4.s = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
Texte5.s = "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
Global Texte , Texte2 , Texte3 , Texte4 , Texte5 , Y.l , Angle.l , Hauteur , Vitesse

LoadFont (0, "Courier", 15) 

; Création de la fenêtre
OpenScreen(1024,768,32,"texte")

Procedure Affichage()
  FlipBuffers()
  ClearScreen(0,0,0)
EndProcedure

Procedure Ondulation()
  X.l = 0
  StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(0))                 
    FrontColor($7B,$E0,$84)
    For i = 1 To Len(Texte)
      X + (TextLength(Texte) / Len(texte))
      Angle + 1
      If Angle > 360
        Angle = 0
      EndIf
      Locate(X,695 + (Sin(Angle) * Hauteur))
      DrawText(Mid(Texte,i,1))
    Next i
  StopDrawing()
EndProcedure

Procedure Ondulation2()
  X.l = 0
  StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(0))                 
    FrontColor($7B,$E0,$84)
    For i = 1 To Len(Texte2)
      X + (TextLength(Texte2) / Len(texte2))
      Angle + 1
      If Angle > 360
        Angle = 0
      EndIf
      Locate(X,620 + (Sin(Angle) * Hauteur))
      DrawText(Mid(Texte2,i,1))
    Next i
  StopDrawing()
EndProcedure

Procedure Ondulation3()
  X.l = 0
  StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(0))                 
    FrontColor($7B,$E0,$84)
    For i = 1 To Len(Texte3)
      X + (TextLength(Texte3) / Len(texte3))
      Angle + 1
      If Angle > 360
        Angle = 0
      EndIf
      Locate(X,650 + (Sin(Angle) * Hauteur))
      DrawText(Mid(Texte3,i,1))
    Next i
  StopDrawing()
EndProcedure

Procedure Ondulation4()
  X.l = 0
  StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(0))                 
    FrontColor($7B,$E0,$84)
    For i = 1 To Len(Texte4)
      X + (TextLength(Texte4) / Len(texte4))
      Angle + 1
      If Angle > 360
        Angle = 0
      EndIf
      Locate(X,700 + (Sin(Angle) * Hauteur))
      DrawText(Mid(Texte4,i,1))
    Next i
  StopDrawing()
EndProcedure

Procedure Ondulation5()
  X.l = 0
  StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(0))                 
    FrontColor($7B,$E0,$84)
    For i = 1 To Len(Texte5)
      X + (TextLength(Texte5) / Len(texte5))
      Angle + 1
      If Angle > 360
        Angle = 0
      EndIf
      Locate(X,700 + (Sin(Angle) * Hauteur))
      DrawText(Mid(Texte5,i,1))
    Next i
  StopDrawing()
EndProcedure

Repeat

  Ondulation()
  Ondulation2()
  Ondulation3()
  Ondulation4()
  Ondulation5()
  
  Affichage()
  Delay(Vitesse)
  
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
ps : Merci Oliv :D [/code][/quote]

Publié : jeu. 19/août/2004 8:54
par Backup
l'effet machine a ecrire !! :lol:

Code : Tout sélectionner

InitSprite()

; Variables
Hauteur.l = 2 ; Multiplicateur de Sin() qui augmente ou réduit le débatement du texte.
Vitesse.l = 20 ; Temps du Delay() qui ralentit/augmente l'animation.
Texte.s = "Ceci est un texte qui ondule"
Global Texte,y.l,Angle.l,Hauteur,Vitesse


; Création de la fenêtre - en plein écran le mouvement est plus lisse
OpenWindow(0,0,0,220,70,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"Texte")
OpenWindowedScreen(WindowID(),0,0,220,70,0,0,0)

Procedure Affichage()
    FlipBuffers()
    ClearScreen(0,0,0)
EndProcedure

Procedure Ondulation()
    x.l = 10
    StartDrawing(ScreenOutput()) ; Pour pouvoir utiliser les commandes des dessin 2D.
    DrawingMode(1) ; On selectionne le mode pour ne pas avoir de fond derrière es lettres.
    FrontColor(255,0,0) ; On change la couleur.
    For i = 1 To Len(Texte) ; On repette pour chaque lettre.
        x + (TextLength(Texte) / Len(Texte)) ; On avance en X de la taille d'un caractère.
        Angle + 1 ; On augmente l'angle d'un.
        If Angle > 360 ; si il est supérieur à 360 (un tour) on le remet à 0. On pourrait ne pas mettre
            ; ce controle mais au bout d'un certain temps la valeur maximale des long serait dépassée.
            Angle = 0
        EndIf
        Locate(x,27 + (Sin(Angle) * Hauteur)/Sin(Angle)/Hauteur) ; On se place en X et en Y.
        ; Sin(Angle) sert à donner le décalage de chaque lettre, on multiplie par Hauteur pour l'augmenter.
        DrawText(Mid(Texte,i,1)) ; On affiche la lettre.
    Next i ; et on recommence...
    StopDrawing() ; On signife que l'on arrête les fonctions dessin 2D.
EndProcedure

Repeat
    Select WindowEvent()
        Case #PB_Event_CloseWindow
            Sortie.b = 1
    EndSelect
    Ondulation()
    Affichage()
    Delay(Vitesse)
Until Sortie = 1

End

Publié : jeu. 19/août/2004 10:07
par Le Soldat Inconnu
je me suis permit de modifier ton code pour faire onduler le texte

Code : Tout sélectionner

InitSprite()

; Variables
#HauteurSin.l = 20 ; Coef qui joue sur la hauteur de la sinusoide
#LargeurSin.l = 20 ; Coef qui joue sur la largeur de la sinusoide
#VitesseAngle.f =  2 * #pi / 50 ; vitesse de modification de l'angle de départ du texte
#Vitesse.l = 25 ; Temps du Delay() qui ralentit/augmente l'animation.
#Texte.s = "Ceci est un texte qui ondule"
Global Angle.f, FontID

; Création de la fenêtre - en plein écran le mouvement est plus lisse
OpenWindow(0, 0, 0, 250, 100, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Texte")
OpenWindowedScreen(WindowID(), 0, 0, 250, 100, 0, 0, 0)

Procedure Ondulation(Texte.s)
  StartDrawing(ScreenOutput()) ; Pour pouvoir utiliser les commandes des dessin 2D.
    DrawingMode(1) ; On selectionne le mode pour ne pas avoir de fond derrière les lettres.
    FrontColor(255, 255, 255) ; On change la couleur.
    DrawingFont(FontID()) ; On change la police
    
    Angle + #VitesseAngle ; Angle de départ de la sinusoide en radian
    
    If Angle >= 2 * #pi
      Angle = 0
    EndIf
    
    ; On affiche toute les lettres
    PosX = 10 ; Position du caractère
    For n = 1 To Len(Texte) ; Pour chaque lettre du texte
      
      Lettre.s = Mid(Texte, n, 1) ; on récupère la lettre à la position n
      
      PosY = 50 + #HauteurSin * Sin(Angle + PosX / #LargeurSin) ; on calcul la position en Y de la lettre
      ; On part du centre de l'image (50) puis on ajoute un sin
      ; #HauteurSin fait varier l'amplitude du mouvement
      ; l'angle mis dans le sinus est d'abord composé de l'angle de départ d'affichage du texte (Angle)
      ; puis on augmente l'angle au fur et à mesure que l'on affiche des lettres avec le coefficient #LargeurSin qui permet de faire varier la largeur de la sinusoide
      
      Locate(PosX, PosY)
      DrawText(Lettre)
      
      PosX + TextLength(Lettre)
      
    Next
    
  StopDrawing() ; On signife que l'on arrête les fonctions dessin 2D.
EndProcedure

;- Début du programme

; On charge une police
FontID = LoadFont(0, "Tahoma", 10, #PB_Font_HighQuality)

Repeat
  Event = WindowEvent()
  
  ClearScreen(0, 0, 0)
  
  Ondulation(#Texte)
  
  FlipBuffers()
  
  Delay(#Vitesse)
Until Event = #PB_Event_CloseWindow

End

Publié : jeu. 19/août/2004 10:18
par Dr. Dri
Et voila Regis, t'as fait exactement ce que je suggérait à Oliv
comme ca je suis sûr d'être compris :p

Dri

Publié : jeu. 19/août/2004 11:21
par Oliv
ahh, j'avais pas regardé l'aide, je savais pas que la fonction était en radians :oops: . Sinon je n'aurais pas fait exactement comme ça, mais dans le même genre :oops: .

@Dobro : Chouette ton animation

@Garzul : Utilise des paramètres pour tes fonctions, ça évite d'en refaire 5.

@Soldat Innconu : Par contre, je vais remodifier ton code pour remettre les paramettres en variables (ou à la rigueur en paramètre de la procédure) car une constante je peux pas changer dans un prog.


Je peux mettre vos codes dans une lib ?

Publié : jeu. 19/août/2004 13:21
par Le Soldat Inconnu
Pas de prob :
tu me donneras la dernière version, je la mettrai sur Codes-FR, si ça te gène pas ;)

Publié : jeu. 19/août/2004 14:42
par Oliv
ok

Publié : jeu. 19/août/2004 19:47
par Backup
effet lac d'annecy !! :D

Code : Tout sélectionner

LoadFont(1, "arial", 50 ,#PB_Font_Italic ) 
LoadFont(2, "arial", 50 ) 
UseFont(1) 
Resultat = InitSprite() 
Global Angle,amplitude
amplitude=5
Texte.s="Le Lac d'annecy !"





WindowID = OpenWindow(1, 50, 50, 640, 200,  #PB_Window_SystemMenu|#PB_Window_MinimizeGadget  , "hello") 

OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0) 



CreateImage(100, 640, 100) 
StartDrawing( ImageOutput())
FrontColor($0,$FF,$FF) 
BackColor(0, 0, 0) 

UseFont(1) 
DrawingFont(FontID()) 
 DrawingMode(1) 
Locate(0, 0)  
DrawText(Texte.s)  
StopDrawing() 

For t=0 To 100
    GrabImage(100, t, 0, t, 640,1)   
Next t
    
Repeat
    
    For y= 0 To 100 
        StartDrawing(ScreenOutput()) 
        UseFont(2) 
        DrawingFont(FontID()) 
        DrawingMode(1) 
        
        FrontColor($95,$25,$BA) 
        BackColor(0, 0, 0) 
        Locate(40, 0)  
        DrawText(Texte.s)  
        
        Angle+1 :If Angle=360*10: Angle=0 :EndIf 
        x+(Sin(Angle)* amplitude)
        DrawImage( UseImage(y), x+y, y+50,640,1)  
        StopDrawing()          
    Next y  
    
    
     FlipBuffers(50)
    
    ClearScreen(0, 0, 0) 
    Event=WindowEvent() 
    delay(1)
    
    
Until Event=#PB_Event_CloseWindow 


Publié : jeu. 19/août/2004 21:39
par Le Soldat Inconnu
bof, je préfère la mer :mrgreen:

en passant j'ai corrigé un truc, il manquait un Event = WindowEvent()

Code : Tout sélectionner

LoadFont(1, "arial", 50 ,#PB_Font_Italic ) 
LoadFont(2, "arial", 50 ) 
UseFont(1) 
Resultat = InitSprite() 
Global Angle,amplitude 
amplitude=5 
Texte.s="Le Lac d'annecy !" 





WindowID = OpenWindow(1, 50, 50, 640, 200,  #PB_Window_SystemMenu|#PB_Window_MinimizeGadget  , "hello") 
WindowID = WindowID(1) 
OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0) 

Event=WaitWindowEvent() 

CreateImage(100, 640, 100) 
StartDrawing( ImageOutput()) 
FrontColor($0,$FF,$FF) 
BackColor(0, 0, 0) 

UseFont(1) 
DrawingFont(FontID()) 
 DrawingMode(1) 
Locate(0, 0)  
DrawText(Texte.s)  
StopDrawing() 

For t=0 To 100 
    GrabImage(100, t, 0, t, 640,1)    
Next t 
    
Repeat 
    
    For y= 0 To 100 
        StartDrawing(WindowOutput()) 
        UseFont(2) 
        DrawingFont(FontID()) 
        DrawingMode(1) 
        
        FrontColor($95,$25,$BA) 
        BackColor(0, 0, 0) 
        Locate(40, 0)  
        DrawText(Texte.s)  
        
        Angle+1 :If Angle=360*10: Angle=0 :EndIf 
        x+(Sin(Angle)* amplitude) 
        DrawImage( UseImage(y), x+y, y+50,640,1)  
        StopDrawing()          
    Next y  
    
    
     FlipBuffers(50) 
    
    ClearScreen(0, 0, 0) 
    
    Event = WindowEvent()
    
Until Event=#PB_Event_CloseWindow 

Publié : jeu. 19/août/2004 21:40
par Backup
encore mieux !!

Code : Tout sélectionner

 LoadFont(1, "arial", 50 ,#PB_Font_Italic )
LoadFont(2, "arial", 50 )
UseFont(1)
Resultat = InitSprite()
Global Angle,amplitude
amplitude=2
Texte.s="Le Lac d'annecy !"





WindowID = OpenWindow(1, 50, 50, 640, 200,  #PB_Window_SystemMenu|#PB_Window_MinimizeGadget  , "hello")

OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0)



CreateImage(100, 640, 100)
StartDrawing( ImageOutput())
FrontColor($0,$FF,$FF)
BackColor(0, 0, 0)

UseFont(1)
DrawingFont(FontID())
DrawingMode(1)
Locate(0, 0) 
DrawText(Texte.s) 
StopDrawing()

For t=0 To 100
    GrabImage(100, t, 0, t, 640,1)  
Next t
   
Repeat
    
    For y= 0 To 100
        StartDrawing(WindowOutput())
        UseFont(2)
        DrawingFont(FontID())
        DrawingMode(1)
        
        FrontColor($95,$25,$BA)
        BackColor(0, 0, 0)
        Locate(40, 0) 
        DrawText(Texte.s) 
        
        Angle+1 :If Angle=360*10: Angle=0 :EndIf
        x+(Sin(Angle*2*3.1415926/50)* amplitude)
        DrawImage( UseImage(y), x+y, y+50,640,1) 
        StopDrawing()            
    Next y 
    
    
    FlipBuffers(50)
    
    ClearScreen(0, 0, 0)
    Event=WindowEvent()
    delay(1)
  
    
Until Event=#PB_Event_CloseWindow 

Publié : jeu. 19/août/2004 21:52
par Oliv
:lol: :lol: . Très sympa :D
Maintenant tu met les planches à voile et l'auberge du père machin à Talloir :D :D

T'habites par là bas ?

Publié : jeu. 19/août/2004 21:54
par Backup
j'y ai vecu les 12 derniere année !! :D
j'ai mem ete une figure locale puisque j'y ai ete commercant !!
(annecy le vieux )

ps le pere bize a talloire ! :D


ps2: merci regis !! pour l'event !! c'est un oublis !!

tout comme le radiant !! moi aussi je me suis fait avoir avec ça !!
:)


Voici l'effet Canal + :D

Code : Tout sélectionner

LoadFont(1, "arial", 50 ,#PB_Font_Italic )
LoadFont(2, "arial", 50 )
UseFont(1)
Resultat = InitSprite()
Global Angle,amplitude
amplitude=2
Texte.s="Le Lac d'annecy !"





WindowID = OpenWindow(1, 50, 50, 640, 200,  #PB_Window_SystemMenu|#PB_Window_MinimizeGadget  , "hello")

OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0)



CreateImage(100, 640, 100)
StartDrawing( ImageOutput())
FrontColor($0,$FF,$FF)
BackColor(0, 0, 0)

UseFont(1)
DrawingFont(FontID())
DrawingMode(1)
Locate(0, 0) 
DrawText(Texte.s) 
StopDrawing()

For t=0 To 100
    GrabImage(100, t, 0, t, 640,1)
    ;GrabSprite(t, 0, 0, 100, 1) 
Next t
   
Repeat
   
    For y= 0 To 100
        StartDrawing(WindowOutput()) 
        Angle+1 :If Angle=360*10: Angle=0 :EndIf
        
        x=1+(Sin(Angle)* amplitude*Random(14))
        DrawImage( UseImage(y), x+y, y+50,640,1) 
        StopDrawing()
        dep+1 :If dep>640 :dep=-100:EndIf
        
    Next y 
    
    
    FlipBuffers(50)
    
    ClearScreen(0, 0, 0)
    Event=WindowEvent()
    delay(1)
    
    
Until Event=#PB_Event_CloseWindow 

Publié : jeu. 19/août/2004 22:33
par Backup
voici un effet pseudo 3D l'ondulation semble aller dans la profondeur

:D

Code : Tout sélectionner

LoadFont(1, "arial", 50 )
LoadFont(2, "arial", 50 )
UseFont(1)
Resultat = InitSprite()
Global Angle,amplitude
amplitude=10
Texte.s="Le Lac d'annecy !"





WindowID = OpenWindow(1, 50, 50, 640, 200,  #PB_Window_SystemMenu|#PB_Window_MinimizeGadget  , "hello")
WindowID = WindowID(1)
OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0)

CreateImage(100, 640, 100)
StartDrawing( ImageOutput())
FrontColor($0,$FF,$FF)
BackColor(0, 0, 0)

UseFont(1)
DrawingFont(FontID())
DrawingMode(1)
Locate(0, 0) 
DrawText(Texte.s) 
StopDrawing()

For t=0 To 100
    GrabImage(100, t, 0, t, 640,1) 
Next t
   
Repeat
   
    For y= 0 To 100
        StartDrawing(WindowOutput()) 
        
        StartDrawing(WindowOutput())
        UseFont(2)
        DrawingFont(FontID())
        DrawingMode(1)
        
        FrontColor($95,$25,$BA)
        BackColor(0, 0, 0)
        Locate(40, 0) 
        DrawText(Texte.s) 
        
        
        
        
        Angle+1 :If Angle=360*10: Angle=0 :EndIf 
        x=1+(Sin(Angle*2*3.1415926/50)* amplitude)
        DrawImage( UseImage(y), x+40, y+20*x/25+50,640,1) 
        StopDrawing()
        dep+1 :If dep>640 :dep=-100:EndIf
        
    Next y 
    
    
    FlipBuffers(50)
    
    ClearScreen(0, 0, 0)
    Event=WindowEvent()
    delay(1)
    
    
Until Event=#PB_Event_CloseWindow