Voici une tentative d’explication du bug
Le prg suivant montre bien les différents objets matérialisés et leur vitesse.
1) La sinusoïde a une vitesse de 1 pixel par image J+1
Ce qui nous donne une courbe se déplaçant vers la gauche de 1 pixel/image
2) le texte
Pour avoir un effet sur le texte il faut lui donner une vitesse différente de la sinusoïde
-1 pixel /par image C’est le texte de référence en horizontal il défile parfaitement bien avec un calcul de décalage correct
3) le texte projeté
Enfin le texte reconstitué qui suit la courbe sinusoïdale qui a une vitesse différente du texte de référence.
(P_X=(i*#largeurFonte)+k (pour ne pas avoir de saut dans la courbe sinusoîdale)
or le texte de référence n'a que le P_X=(i*#largeurFonte)+decalage)
OR le Pb est que la sinusoïdale et le texte projeté sur la sinusoïdale ont des vitesses différentes mais ont le même P_X et donc le même D(p_x) /Dt c'est-à-dire la même vitesse de référence
Ce qui est en contradiction avec les hypothèses de départ.les vitesses de la sinusoïde et du texte ont des vitesses +1 et -1 donc différentes
Ont peut donc soit annuler l’une des deux vitesses, c’est ce que j’ai présenté dans le premier test (Voir ci-dessus) que j’ai proposé, j’’ai annulé l’une des 2 vitesses (le texte est fixe) seule la sinusoïde évolue.
On peut également annuler la vitesse de la sinusoïde et garder le texte déroulant.
C’est le deuxième exemple que j’ai présenté.
Si l’on veut garder des vitesses non nulles et différentes il faut donc différencier les courbes sinusoïdales et le texte projeté sur celle-ci.
Bon courage à vous
Code : Tout sélectionner
; EnableExplicit
#NomAppli$="SinusScroll"
#LargeurEcran=800
#HauteurEcran=600
#NomFonte$="199-64x64.png"
#LargeurFonte=64
#HauteurFonte=64
#NbCaracParLigne=13
#Amplitude=150
#PosYCentre=300
Global.i ib
Global.i fonte,largeurImageFonte,nbCaracteresParLigneFonte,nbCaracteresParLigneEcran,*texte
Global texte$
Global.i decalage=0
Global.i vitesse=1
Global.i j=0
Global.i i,j2,k
Global.a car
Global.i x,y,temp,M_POSY,m_temp
Macro FORMAT_CAR
For k=0 To #LargeurFonte Step 2 ;reconstitution de la police sur la courbe sinus
; ClipSprite(fonte,x+k,y,2,#hauteurFonte-6)
ClipSprite(fonte,x+k,y,2,#hauteurFonte)
; P_X=(i*#largeurFonte)+decalage+k
P_X=(i*#largeurFonte)+k
; P_X=(i*#largeurFonte)+decalage+k
P_Y=posY(j2)
DisplayTransparentSprite(fonte,P_X,P_Y)
StartDrawing(WindowOutput(0))
Box(P_x,P_Y,2,2,RGB(255,255,0))
StopDrawing()
d_P_Y=Abs(m_P_Y-P_Y)
d_P_X=Abs(m_P_X-P_x)
StartDrawing(WindowOutput(0))
DrawText(10,10,Space(600))
; DrawText(10,10,_N(P_X)+_n(P_Y)+_n(d_P_X)+_n(D_P_Y)+_n(car)+_n(X)+_n(Y)+_n(i)+_n(decalage)+_n(K)); [, FrontColor [, BackColor]])
StopDrawing()
m_P_Y=P_Y
m_P_X=P_X
j2+1
j2%360
Next
EndMacro
texte$=UCase("abcdefghijklmnopqrstuvwxyz")
; texte$=Space(#nbCaracParLigne)+UCase(texte$)+Space(#nbCaracParLigne); + Chr(0)
texte$=texte$+texte$+texte$
*texte=@texte$
MAXtext=@texte$+26 ;Len(texte$)
; *texte=MAXTEXT-26
Global Dim posY.i(360)
For ib=0 To 360
; posY(ib)=Cos(Radian(ib))*#Amplitude+#PosYCentre
posY(ib)=Sin(Radian(ib))*#Amplitude+#PosYCentre
Next
UsePNGImageDecoder()
If InitKeyboard()=0 Or InitSprite()=0
MessageRequester("Error","Initialization failed !",#PB_MessageRequester_Ok | #MB_ICONERROR)
End
EndIf
If OpenWindow(0,0,0,#LargeurEcran,#HauteurEcran,#NomAppli$,#PB_Window_ScreenCentered | #PB_Window_BorderLess)=0 Or
OpenWindowedScreen(WindowID(0),0,0,#LargeurEcran,#HauteurEcran)=0
MessageRequester("Error","Couldn't open the screen !",#PB_MessageRequester_Ok | #MB_ICONERROR)
End
EndIf
fonte=LoadSprite(#PB_Any,#NomFonte$)
If fonte=0
MessageRequester("Error","GFX not loaded !",#PB_MessageRequester_Ok | #MB_ICONERROR)
End
EndIf
largeurImageFonte=SpriteWidth(fonte)
nbCaracteresParLigneFonte=largeurImageFonte/#LargeurFonte
j=0
Repeat
Repeat
Until WindowEvent()=0
ClearScreen(0)
FlipBuffers()
; Debug _n(j)+_n(J2)+_n(m_j)+_n(m_j2)+_n(car)+_n(M_car)+_n(*texte)
m_j=j
m_j2=J2
j2=j
M_car=CAR
For i=0 To (#largeurEcran/#largeurFonte)+1
car=PeekA(*texte+i)-32
x=(car%nbCaracteresParLigneFonte)*#largeurFonte
y=(car/nbCaracteresParLigneFonte)*#hauteurFonte
FORMAT_CAR
M_P_X=P_X
ClipSprite(fonte,x,y,64,#hauteurFonte-6)
P_X=(i*#largeurFonte)+decalage
; Debug _nl+_n(K)+_n(P_X+64)+_n(M_P_X)+_n(P_Y)+_n(i)+_n(decalage)
; P_Y=posY(J2)
P_Y=320
DisplayTransparentSprite(fonte,P_X,P_Y)
StartDrawing(WindowOutput(0))
DrawText(10,10,Space(600))
; DrawText(10,10,_N(*texte)+_n(@texte$)+_n(decalage)+_n(maxtext)); [, FrontColor [, BackColor]])
StopDrawing()
Next
Delay(30)
j+1
j%360
decalage-vitesse
If Abs(decalage)>=#largeurFonte
; decalage+#largeurFonte
decalage=0
*texte+1
If *texte=MAXtext
*texte=@texte$
decalage=0
EndIf
; If PeekA(*texte+(#nbCaracParLigne+1))=0
; *texte=@texte$
; Else
; *texte+1
; EndIf
EndIf
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)