[résolu] Souci avec sinus scroll

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

[résolu] Souci avec sinus scroll

Message par majikeyric »

Arghhhhhhhhh, je n'arrive pas à savoir ce qui provoque les à-coups dans mon sinus scroll :(
J'y ai passé des heures... sans succès :?

Image

Si vous pouviez m'éclairer d'un regard neuf :lol:

Les fichiers sont dispos ici : http://majikeyric.free.fr/purebasic/SinusScroll.zip

* A compiler en mode ASCII

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

texte$="abcdefghijklmnopqrstuvwxyz"
texte$= Space(#nbCaracParLigne) + UCase(texte$) + Space(#nbCaracParLigne); + Chr(0)

*texte=@texte$

Global Dim posY.i(360)

For ib=0 To 359
	posY(ib)=Cos(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)
	
	j2=j
	
	For i=0 To (#largeurEcran/#largeurFonte)+1
		car=PeekA(*texte+i)-32
		x=(car%nbCaracteresParLigneFonte)*#largeurFonte
		y=(car/nbCaracteresParLigneFonte)*#hauteurFonte
		
		For k=0 To #LargeurFonte-2 Step 2
			ClipSprite(fonte,x+k,y,2,#hauteurFonte-6)
			DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,posY(j2))
			j2+1
			j2%360
		Next
		
	Next
	j+1
	j%360
	
	decalage+vitesse
	
	If decalage>=#largeurFonte
		decalage-#largeurFonte
		If PeekA(*texte+(#nbCaracParLigne+1))=0
			*texte=@texte$
		Else
			*texte+1
		EndIf
	EndIf
	
	FlipBuffers()
	
	ExamineKeyboard()	
	
Until KeyboardPushed(#PB_Key_Escape)
Dernière modification par majikeyric le sam. 11/oct./2014 16:58, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Souci avec sinus scroll

Message par Ar-S »

J'avoue que j'ai pas pigé grand chose avec tout ces modulos..
Je trouve juste étrange les valeurs x & y quand tu les debugs tout comme le (i*#largeurFonte)-decalage+k qui devient parfois négatif.

Je suis dans le flou :oops:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Souci avec sinus scroll

Message par majikeyric »

Merci d'avoir jeter un oeil Ar-s :mrgreen:

Les modulos c'est juste pour simplifier l'écriture (mais peut être pas la compréhension).

Code : Tout sélectionner

j%360
equivaut à

Code : Tout sélectionner

if j>=360
 j-360
endif
j ou j2 étant l'indice dans le tableau à 360 éléments des différentes positions verticales (calculées avec un cosinus() ).
C'est pour toujours boucler sur le tableau.

x et y représentent les coordonnées dans le sprite fonte de la lettre à afficher avec un ClipSprite()
La division '/' permet de récupérer le numéro de ligne de la lettre dans la fonte
Le modulo '%' permet de récuper le numéro de colonne de la lettre dans la fonte

Si (i*#largeurFonte)-decalage+k devient des fois négatif c'est parce que la lettre à afficher est partiellement hors de l'écran (coordonnée horizontale négative).


Je n'affiche pas une lettre entière à une position verticale donnée, je découpe la lettre en 32 colonnes de 2 pixels et chaque colonne a une position verticale propre. C'est la variable k qui permet le découpage.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Souci avec sinus scroll

Message par GallyHC »

Bonjour,

Je n'ai pas encore réussi a trouvais complètement le problème, la seule chose que c'est dans le décalage de la police. si tu mets en commentaire comme ci-dessous, tu n'as que le a qui n'a pas de problème au niveau de l'ondulation.

Code : Tout sélectionner

;	If decalage >= #largeurFonte
;		decalage - #largeurFonte
;		If PeekA(*texte+(#nbCaracParLigne + 1)) = 0
;			*texte=@texte$
;		Else
;			*texte+1
;		EndIf
;	EndIf
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Souci avec sinus scroll

Message par majikeyric »

Merci GallyHC, effectivement le problème doit venir du décalage des lettres qui ne se fait pas au bon moment.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Souci avec sinus scroll

Message par GallyHC »

Apres c'est une question perso et surtout de presentation (sachant que je ne sais pas l'incidence que cela a au niveau du compilateur), mais je préfère voir :

Code : Tout sélectionner

  j2 = (j2 + 1) % 360
au lieu de :

Code : Tout sélectionner

  j2+1
  j2%360
Comme je disais, je ne sais pas si c'est mieux pour le compilateur, la j'attend toutes informations sur l'écriture.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Souci avec sinus scroll

Message par majikeyric »

bah au niveau compilateur ça revient quasimment à la même chose :mrgreen:
Ta version est plus rapide car l'incrémentation est faite sur un registre et moi sur une adresse mémoire.
Mais c'est du au fait que ton calcul se résume en une seule affectation et moi deux.

Code : Tout sélectionner

; j2 = (j2 + 1) % 360
  MOV    ebx,dword [v_j2]
  INC    ebx               ;<-----
  MOV    eax,ebx
  MOV    ecx,360
  CDQ
  IDIV   ecx
  MOV    ebx,edx
  MOV    dword [v_j2],ebx
; 
; j2+1
  INC    dword [v_j2]   ;<------
; j2%360
  MOV    ebx,dword [v_j2]
  MOV    eax,ebx
  MOV    ecx,360
  CDQ
  IDIV   ecx
  MOV    ebx,edx
  MOV    dword [v_j2],ebx
; 
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Souci avec sinus scroll

Message par GallyHC »

Donc en plus d'être plus propre c'est mieux ^^, bon je rigole mais c'est quand bien de savoir de tel chose, cela peu aider pas mal de personne (moi en premier).

Merci,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Souci avec sinus scroll

Message par PAPIPP »

Bonjour à tous

Pas facile de trouver les bugs.
Ce n'est peut être pas ce que vous cherchez (il n'y a plus de déplacement du texte sur l'axe des X pour l'instant)
Avec le texte modifié j'ai remarqué que le déplacement du texte sur les X posait un problème qui peut être résolu.

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

; texte$="abcdefghijklmnopqrstuvwxyz"
texte$=UCase("abcdefghijklmnopqrstuvwxyz")
; texte$=Space(#nbCaracParLigne)+UCase(texte$)+Space(#nbCaracParLigne); + Chr(0)
texte$=texte$+texte$+texte$
*texte=@texte$

Global Dim posY.i(360)

For ib=0 To 359
   posY(ib)=Cos(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)
   
   j2=j
   
   For i=0 To (#largeurEcran/#largeurFonte)+1
;    For i=0 To (#largeurEcran/#largeurFonte)
      car=PeekA(*texte+i)-32
      x=(car%nbCaracteresParLigneFonte)*#largeurFonte
      y=(car/nbCaracteresParLigneFonte)*#hauteurFonte
      
      For k=0 To #LargeurFonte-2 Step 2
         ClipSprite(fonte,x+k,y,2,#hauteurFonte-6)
;          DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,posY(j2))
         DisplayTransparentSprite(fonte,(i*#largeurFonte)+k,posY(j2))
         j2+1
         j2%360
      Next
      
   Next
   j+1
   j%360
   
   decalage+vitesse
   
   If decalage>=#largeurFonte
      decalage-#largeurFonte
;       If PeekA(*texte+(#nbCaracParLigne+1))=0
;          *texte=@texte$
; ;       Else
; ;          *texte+1
;       EndIf
   EndIf
   
   FlipBuffers()
   
   ExamineKeyboard()   
   
Until KeyboardPushed(#PB_Key_Escape)
J'ai supprimé

; If PeekA(*texte+(#nbCaracParLigne+1))=0
; *texte=@texte$
; ; Else
; ; *texte+1
; EndIf

Remplacé la formation du texte

; texte$="abcdefghijklmnopqrstuvwxyz"
texte$=UCase("abcdefghijklmnopqrstuvwxyz")
; texte$=Space(#nbCaracParLigne)+UCase(texte$)+Space(#nbCaracParLigne); + Chr(0)
texte$=texte$+texte$+texte$
*texte=@texte$

et enfin remplacé

; DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,posY(j2))
DisplayTransparentSprite(fonte,(i*#largeurFonte)+k,posY(j2))

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Souci avec sinus scroll

Message par PAPIPP »

Maintenant avec déplacement du texte sur l'axe des X

il suffit de donner une vitesse négative -1 par exemple et de supprimer *texte+1
dans
If decalage>=#largeurFonte
decalage-#largeurFonte
If PeekA(*texte+(#nbCaracParLigne+1))=0
*texte=@texte$
; Else
; ; *texte+1 ; ===> ICI
EndIf
EndIf
et garder le texte$ sans blanc.

Ce n'est pas encore parfait mais l'approche semble bonne

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  ;;; =====> ICI
Global.i   j=0
Global.i   i, j2, k
Global.a   car
Global.i   x,y

texte$=UCase("abcdefghijklmnopqrstuvwxyz")
; texte$= Space(#nbCaracParLigne) + UCase(texte$) + Space(#nbCaracParLigne); + Chr(0)
texte$+texte$+texte$
*texte=@texte$

Global Dim posY.i(360)

For ib=0 To 359
   posY(ib)=Cos(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)
   
   j2=j
   
   For i=0 To (#largeurEcran/#largeurFonte)+1
      car=PeekA(*texte+i)-32
      x=(car%nbCaracteresParLigneFonte)*#largeurFonte
      y=(car/nbCaracteresParLigneFonte)*#hauteurFonte
      
      For k=0 To #LargeurFonte-2 Step 2
         ClipSprite(fonte,x+k,y,2,#hauteurFonte-6)
         DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,posY(j2))
         j2+1
         j2%360
      Next
      
   Next
   j+1
   j%360
   
   decalage+vitesse
   
   If decalage>=#largeurFonte
      decalage-#largeurFonte
      If PeekA(*texte+(#nbCaracParLigne+1))=0
         *texte=@texte$
      Else
;          *texte+1
      EndIf
   EndIf
   
   FlipBuffers()
   
   ExamineKeyboard()   
   
Until KeyboardPushed(#PB_Key_Escape)
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Souci avec sinus scroll

Message par majikeyric »

Salut PAPIPP, merci pour ton aide.
Le problème c'est que je n'arrive vraiment pas à voir ce qui peut clocher :?
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Souci avec sinus scroll

Message par PAPIPP »

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)
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Souci avec sinus scroll

Message par majikeyric »

Whaou faut que je regarde ça à tête reposée 8O Merci PAPIPP :)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Souci avec sinus scroll

Message par PAPIPP »

Avec le prg suivant j’ai différencié la vitesse de la sinusoïde et du texte projeté.
Pour n’avoir que peu de saut intempestif j’ai donné une vitesse de J+4 à la sinusoïde.
(Plus la vitesse de la sinusoïde est élevée moins on remarque le saut )

On voit nettement que les deux vitesses (texte projeté sur la sinusoïde et la sinusoïde) se décalent dans le temps.
P_X=(i*#largeurFonte)+k Pour la sinusoïde
PP_X=(i*#largeurFonte)+decalage+K Pour le texte projeté

Pour rattraper plus doucement le décalage il faut créer une fonction qui projette le caractère qui défile a la vitesse V1 sur la sinusoïde à la vitesse V2
Cette fonction devra tenir compte des vitesses V1 et V2 différentes.

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
    PP_X=(i*#largeurFonte)+decalage+K
    ;     P_X=(i*#largeurFonte)+decalage+k
    P_Y=posY(j2)
;     DisplayTransparentSprite(fonte,P_X,P_Y)
    DisplayTransparentSprite(fonte,PP_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
    P_Y=320
    ;     DisplayTransparentSprite(fonte,P_X,P_Y)  ; permet de matérialiser le texte de référence qui défile
    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+4
  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)
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Souci avec sinus scroll

Message par PAPIPP »

Bonjour à tous

Voici un essai qui tend à diminuer le saut en anticipant la valeur de Y du texte sur la sinusoïde
Donc en différenciant la vitesse sur l'axe des X et la position Y correspondante du texte défilant et de la sinusoïde.
.
Ce n'est pas encore parfait.
Car pour faire mieux il faut projeter le texte défilant à la vitesse V1 sur la sinusoïde à la vitesse V2 (un peu plus complexe).

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
      PP_X=(i*#largeurFonte)+decalage+K
      ;     P_X=(i*#largeurFonte)+decalage+k
      P_Y=posY(j2)
      ;*************************** CORRECTION  anticipation de PP_Y **********************************************
      DP_X=PP_X-P_X
      ANG=(360+J2+DP_X)%360
      PP_Y=POSY(ANG)
      
      ;     DisplayTransparentSprite(fonte,P_X,P_Y)
      DisplayTransparentSprite(fonte,PP_X,PP_Y)
      
      StartDrawing(WindowOutput(0))
;         Box(P_x,P_Y,2,2,RGB(255,255,0))
      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
      P_Y=320
;       DisplayTransparentSprite(fonte,P_X,P_Y)  ; permet de matérialiser le texte de référence qui défile
      
    Next
    Delay(10)
    j+6
    j%360
    
    decalage-vitesse
    
    If Abs(decalage)>=#largeurFonte
      ;     decalage+#largeurFonte
      decalage=0
      *texte+1
      If *texte=MAXtext
        *texte=@texte$
        decalage=0
      EndIf
    EndIf
    
    FlipBuffers()
    
    ExamineKeyboard()
    
  Until KeyboardPushed(#PB_Key_Escape)
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Répondre