Basic Univers



; Rotodeforme
; codé par Dobro
; en purebasic 4.00

Declare Ondulation(x, Y, Texte.s, r, v, b)
; *********** initialisation *********
; coord de départ
xr.f = 1024
Yr.f = 110
 
     ; vitesses de départ
vx.f = 10
vy.f = - 45
                             
pas.f = 10
Declare Ondulation(x, Y, Texte.s, r, v, b)

; ***** variables a OLIV *********
            ; Variables

#HauteurSin = 50 ; Coef qui joue sur la hauteur de la sinusoide
#LargeurSin = 50 ; Coef qui joue sur la largeur de la sinusoide
#VitesseAngle = 1 * #PI / 50 ; vitesse de modification de l'angle de départ du texte
#Vitesse = 2 ; Temps du Delay() qui ralentit/augmente l'animation.
#font = 1
Global angler.f, long_text_bas
            ; ****************************************


UseJPEGImageDecoder()
InitSprite()
LoadFont( #font , "Arial" , 40)
#dobro = 1
#Police = 1
#Sprite = 1
#image1 = 1
#image2 = 2

Dim tabl1(1024, 768 )
; ***********************************

FontID = LoadFont( #Police , "arial" , 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_( #SM_CYSCREEN ): ;=hauteur de l'ecran
     WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello" , #PB_Window_BorderLess |#PB_Window_ScreenCentered )
    
     WindowID = WindowID(1)
    Result = OpenWindowedScreen( WindowID , 0, 0, EcranX, EcranY, 1, 0, 0)
    
    
    
    
    
     ; principe de rotation
     ; x1 = coordonée x du point rotationé
     ; Y1 = coordonée y du point rotationé
     ; a = angle de rotation
     ; x1 = x * Cos(a) + Y * Sin(a);
     ; y1 = -x * Sin(a) + Y * Cos(a)
    
    
    
    
    
     LoadImage( #image1 , "logo2.jpg" ) ; 144x150
     ; ResizeImage(#image1,1024,768 )
     CreateImage( #image2 , 1024, 768 )
    
     ; ******* mise en tableau de l'image **********
     StartDrawing( ImageOutput( #image1 ) )
     For Y = 1 To 144
         For x = 1 To 150
            tabl1(x, Y)= Point(x, Y)
         Next x
     Next Y
     StopDrawing()
     ; *****************************************
    
    
    Resultat = InitMouse()
     Repeat
         ExamineMouse()
        Event = WindowEvent()
         Delay(2)
        
         ResizeImage( #image2 , 150, 144)
         StartDrawing( ImageOutput( #image2 ) )
        angle = angle + 1 ; on augmente de 2 degres a chaque fois
         ; angle = 180
         For Y = 1 To 144
             For x = 1 To 150
                 ; ********* voici la formule de la rotation d'image *********
                x1 = x * Cos(angle* #PI /180) + Y* Sin(angle* #PI /180)+ 75
                y1 = - x * Sin(angle* #PI /180) + Y + 0.5 * Cos(angle* #PI /180) + 72
                 ;*****************************************************
                
                 ; *** on evite que les coordonée sorte du tableau dim ****
                 If y1<0 : y1 = 144 - y1: EndIf
                 If y1>144 : y1 = 0 + y1 - 144: EndIf
                 If x1>150 : x1 = 0 + x1 - 150: EndIf
                 If x1<1 : x1 = 150 - x1: EndIf
                 ; *************************************************
                 Plot(x, Y, tabl1(x1, y1)) ; on dessine l'image rotaté a l'aide du tableau de points : D
             Next x
         Next Y
         StopDrawing()
        
         ResizeImage( #image2 , 1024, 768 )
        
         ; ****** **on affiche l'image ********
         StartDrawing( ScreenOutput())
         DrawImage( ImageID( #image2 ), 1, 1)
         StopDrawing()
         ; *******************************
        
        Texte.s = "YEEEEHAAAAAA Pure Basic Power .... petit Coucou de Dobro : D"
        
        xr = xr - 10
        Ondulation(xr, Yr, Texte.s, 255, 255, 0)
        
        
        
         FlipBuffers(): ; affiche l'ecran
         ClearScreen( RGB(0, 0, 0)) : ; efface l'ecran
        Event = WindowEvent()
        
         ;}
        
         If MouseButton(2)
             End
         EndIf
        
     Until Event = #PB_Event_CloseWindow
    
    
     Procedure Ondulation(x, Y, Texte.s, r, v, b)
         ; procedure realisé par OLIV
        
         StartDrawing( ScreenOutput()) ; Pour pouvoir utiliser les commandes des dessin 2D.
         DrawingFont( FontID( #font )) ; On change la police
         DrawingMode(1) ; On selectionne le mode pour ne pas avoir de fond derrière les lettres.
         FrontColor( RGB(r, v, b) ) ; On change la couleur.
        
        angler + #VitesseAngle ; Angle de départ de la sinusoide en radian
         If angler >= 2 * #PI
            angler = 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(angler + 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
            
             DrawText(x + PosX, Y + PosY, Lettre)
            PosX + TextWidth(Lettre)
         Next
         StopDrawing() ; On signife que l'on arrête les fonctions dessin 2D.
     EndProcedure