; 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