[résolu] Souci avec sinus scroll

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Souci avec sinus scroll

Message par Demivec »

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	vitesseCaracteres = 1, vitesseCourbe = 1 ;les valeurs positives seulement
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$ +5

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_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+vitesseCourbe
	j%360
	
	decalage+vitesseCaracteres
	
	If decalage>=#largeurFonte
	  j + decalage - (#LargeurFonte / 2)
	  j % 360
	  decalage%#largeurFonte
	  
		If PeekC(*texte+(#nbCaracParLigne+1) * SizeOf(Character))=0
			*texte=@texte$
		Else
			*texte+1
		EndIf
	EndIf
	
	FlipBuffers()
	ExamineKeyboard()	
	
Until KeyboardPushed(#PB_Key_Escape)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Souci avec sinus scroll

Message par PAPIPP »

Bonjour Demivec

Et bravo pour ce prg
Mais avec une vitesses contraire à l'autre donc négative que fait-on ?

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 »

@demivec: Comment en as-tu déduit ce calcul ?

Code : Tout sélectionner

   If decalage>=#largeurFonte
     j + decalage - (#LargeurFonte / 2)
   ...
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Souci avec sinus scroll

Message par PAPIPP »

Bonjour Majikeyric
Je vais me permettre de répondre à la place de Demivec je pense qu'il ne m'en voudra pas trop

Comme pour les autres essais j'ai matérialisé les 2 courbes sunusoïde et texte dans le prg de Demivec

et l'on voit très nettement dans le prg de Demivec qu'il fait sauter la sinusoïde pour conserver une évolution continue sur le texte

Tous nos Prg ne touchaient qu'àu texte alors que la sunusoîde restait normale.

donc le saut j+decalage-(#LargeurFonte/2) limité par decalage +une demi largeur de la fonte permet de replacer la sinusoîde en concordance avec le texte. Il corrige la sinusoîde du décalage du texte et il remarque qu'une 1/2 largeur de la fonte reste à combler.

Il est inutile de travailler sur l'axe Y les 2 courbes ont la même amplitude. Il n'y a que sur l'axe X qu'il y a une différence
il suffit de synchroniser la courbe sinusoîdale sur le texte au moment ou le texte est décalé d'une largeur de fonte au moins.

C'est
If decalage>=#largeurFonte
j+decalage -(#LargeurFonte/2) ;
j%360
decalage%#largeurFonte

If PeekC(*texte+(#nbCaracParLigne+1)*SizeOf(Character))=0
*texte=@texte$
Else
*texte+1
EndIf
EndIf
Vous pouvez faire des essais en supprimant j+decalage -(#LargeurFonte/2) on obtient le même saut que sur le prg original
en supprimant -(#LargeurFonte/2) on remarque qu'il y a encore 1/2 largeur de la fonte de décalage

Et n'oublions pas que c'est la sinusoÎde qui va sauter alors qu'elle n'est normalement pas visible.

Pour rester rigoureux il faut dire que le texte n'ondule pas suivant une sinusoîde pure mais suivant une pseudo sinusoîde

Comme l'oeil est moins sensible à la déformation légère d'une courbe continue qu'à un saut aussi léger soit-il
Demivec à trouvé une solution élégante au PB.

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 vitesseCaracteres=1,vitesseCourbe=1 ;les valeurs positives seulement
Global.i j=0
Global.i i,j2,k
Global.a car
Global.i x,y,P_X,P_Y

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

Global Dim posY.i(360)

For ib=0 To 359
  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_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)
      P_X=(i*#largeurFonte)+k
      P_Y=posY(j2)
      DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,posY(j2));
      
      StartDrawing(WindowOutput(0))
        Box(P_x,P_Y,2,2,RGB(255,255,0))
      StopDrawing()
      
      j2+1
      j2%360
    Next
    
  Next
  
  j+vitesseCourbe
  j%360
  
  decalage+vitesseCaracteres
  
  If decalage>=#largeurFonte
     j+decalage -(#LargeurFonte/2) ;
     j%360
    decalage%#largeurFonte
    
    If PeekC(*texte+(#nbCaracParLigne+1)*SizeOf(Character))=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 »

Merci beaucoup PAPIPP et Demivec :)
J'avoue avoir un peu de mal à assimiler le truc mais je vais l'étudier au calme, ça devrait le faire.
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: [résolu] Souci avec sinus scroll

Message par majikeyric »

Je suis arrivé à l'origine du problème ! :D

le tracé de la courbe doit toujours commencer à la position horizontale 0 de l'écran
OR lorsque la variable "décalage" était différente de 0 pour le premier caractère,
la position horizontale était négative,
le tracé commençait dans le bord gauche non visible de l'écran et la courbe visible à l'écran se "déphasait".

Il suffit de tester pour l'affichage du premier caractère, si la position horizontale >= 0 pour commencer
à prendre en compte les données de la courbe.

Plus besoin d'essayer de re-synchroniser la courbe après coup lors du décalage des caractères de la ligne.

Code : Tout sélectionner

EnableExplicit

#NomAppli$="SinusScroll"

#LargeurEcran=800
#HauteurEcran=600

#NomFonte$="199-64x64.png"
#LargeurFonte=64
#HauteurFonte=64
#NbLettres=59

#NbCaracParLigne=13

#Amplitude=150
#PosYCentre=#HauteurEcran/2-#HauteurFonte/2

#NbValCos=720

Global.f	Angle
Global		Texte$
Global.i	Fonte, PosTexte, PosTexteMax
Global.i	Decalage, VitesseScroll
Global.i	PasCourbe, VitesseCourbe
Global.i	i, j, j2, k, Car, x, y
Global Dim	PosY.i(#NbValCos)
Global Dim	SpriteLettre.i(#NbLettres)

texte$="abcdefghijklmnopqrstuvwxyz"

texte$= Space(#nbCaracParLigne) + UCase(texte$) + Space(#nbCaracParLigne)
PosTexteMax=Len(texte$)-#NbCaracParLigne

Angle=0
For i=0 To #NbValCos-1
	posY(i)=Cos(Radian(Angle))*#Amplitude+#PosYCentre
	Angle+(360.0/#NbValCos)
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=LoadImage(#PB_Any,#NomFonte$)

If Fonte=0
	MessageRequester("Error", "GFX not loaded !",#PB_MessageRequester_Ok|#MB_ICONERROR)
	End
EndIf

; Création d'un sprite pour chaque lettre de la fonte

StartDrawing(ScreenOutput())
DrawImage(ImageID(Fonte),0,0)
StopDrawing()

i=0
x=0
y=0
While i<#NbLettres
	SpriteLettre(i)=GrabSprite(#PB_Any,x,y,#LargeurFonte,#HauteurFonte-6)
	
	If SpriteLettre(i)=0
		End
	EndIf
	
	x+#LargeurFonte
	If x=ImageWidth(Fonte)
		x=0
		y+#HauteurFonte
	EndIf
	i+1
Wend

ClearScreen(0)
FreeImage(Fonte)

j=0
Decalage=0
VitesseScroll=2
PasCourbe=1
VitesseCourbe=4
PosTexte=1

Repeat
	
	Repeat
	Until WindowEvent()=0
	
	ClearScreen(0)
	
	j2=j
	
	i=0 ; traitement du premier caractère
	car=Asc(Mid(texte$,PosTexte+i,1))-32
	For k=0 To #LargeurFonte-2 Step 2
		x=(i*#LargeurFonte)+k-decalage
		If x>=0
			ClipSprite(SpriteLettre(car),k,0,2,#PB_Default)
			DisplayTransparentSprite(SpriteLettre(car),x,posY(j2))
			j2+PasCourbe
			j2%#NbValCos
		EndIf
	Next
	
	For i=1 To #NbCaracParLigne ; traitement du reste des caractères
		car=Asc(Mid(texte$,PosTexte+i,1))-32
		For k=0 To #LargeurFonte-2 Step 2
			ClipSprite(SpriteLettre(car),k,0,2,#PB_Default)
			DisplayTransparentSprite(SpriteLettre(car),(i*#LargeurFonte)+k-decalage,posY(j2))
			j2+PasCourbe
			j2%#NbValCos
		Next
	Next
	
	j+VitesseCourbe
	j%#NbValCos
	
	decalage+VitesseScroll
	
	If decalage>=#largeurFonte
		decalage-#largeurFonte
		PosTexte+1
		If PosTexte>PosTexteMax
			PosTexte=1
		EndIf
	EndIf
	
	FlipBuffers()
	
	ExamineKeyboard()	
	
Until KeyboardPushed(#PB_Key_Escape)
J'ai remis les fichiers de l'archive à jour.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: [résolu] Souci avec sinus scroll

Message par PAPIPP »

Bonjour et merci à tous

Voici un défilement avec projection des caractères non pas suivant l’axe Y
mais suivant la perpendiculaire à la tangente de la courbe sinusoïdale (effets différents).
Les jambages des lettres sont perpendiculaires à la tangente de la courbe sinusoïdale

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 vitesseCaracteres=1,vitesseCourbe=1 ;les valeurs positives seulement
Global.i j=0
Global.i i,j2,k
Global.a car
Global.i x,y,P_X,P_Y, ibf.f, cosf.f

texte$=UCase("abcdefghijklmnopqrstuvwxyz")
texte$=Space(#nbCaracParLigne)+UCase(texte$)+Space(#nbCaracParLigne); + Chr(0)
; texte$+texte$+texte$
*texte=@texte$+26
Structure tsin_tgt
  posY.i
  Atgt.f
EndStructure
Global Dim tab.tsin_tgt(360)
For ib=0 To 359
  tab(ib)\posY=Sin(Radian(ibf))*#Amplitude+#PosYCentre
  ibf=ib
  Cosf.f=Cos(Radian(ibf))
  tab(ib)\Atgt=Degree(ATan(Cosf))
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_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)
      P_X=(i*#largeurFonte)+k
      P_Y=tab(j2)\posY
      RotateSprite(Fonte, tab(J2)\Atgt,#PB_Absolute)
      DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,tab(J2)\posY);
      
;       StartDrawing(WindowOutput(0))
;         Box(P_x,P_Y,2,2,RGB(255,255,0))
;       StopDrawing()
;       P_Y=320
;       DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,P_Y)  ; permet de matérialiser le texte de référence qui défile
      
      j2+1
      j2%360
    Next
    
  Next
  
  j+vitesseCourbe
  j%360
  
  decalage+vitesseCaracteres
  
  If decalage>=#largeurFonte
    j+decalage-(#LargeurFonte/2) ;
    j%360
    decalage%#largeurFonte
    If PeekC(*texte+(#nbCaracParLigne+1)*SizeOf(Character))=0
      *texte=@texte$
    Else
      *texte+1
    EndIf
  EndIf
  
  FlipBuffers()
  ExamineKeyboard()
  
Until KeyboardPushed(#PB_Key_Escape)
On peut changer le signe du cos et on obtient un effet de roulement des caractères sur eux-mêmes mais peu lisible.
Pour avoir un effet de roulement lisible mettre COS(..) ou Sin(..) au deux fonctions.

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: [résolu] Souci avec sinus scroll

Message par majikeyric »

Joliiii !!! c'est la première fois que je vois ce type d'effet ! :D
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: [résolu] Souci avec sinus scroll

Message par PAPIPP »

On peut donner de la couleur par exemple à l'effet de roulement

Soit :
1) couleur tirée au sort reste constante
2) l'ensemble des lettres change de couleur à chaque caractère
3) les lettres changent de couleur
4) Chaque partie de la lettre change de couleur
5) L'ensemble des lettres change de couleur à chaque synchronisation
6) l'ensemble des lettres change après un défilement complet

en supprimant le commentaire devant colorc

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 vitesseCaracteres=1,vitesseCourbe=1 ;les valeurs positives seulement
Global.i j=0
Global.i i,j2,k
Global.a car
Global.i x,y,P_X,P_Y, ibf.f, cosf.f,colorc

texte$=UCase("abcdefghijklmnopqrstuvwxyz")
texte$=Space(#nbCaracParLigne)+UCase(texte$)+Space(#nbCaracParLigne); + Chr(0)
; texte$+texte$+texte$
*texte=@texte$+26
Structure tsin_tgt
  posY.i
  Atgt.f
EndStructure
Global Dim tab.tsin_tgt(360)
For ib=0 To 359
  tab(ib)\posY=Sin(Radian(ibf))*#Amplitude+#PosYCentre
  ibf=ib
  Cosf.f=Sin(Radian(ibf))
;   Cosf.f=Cos(Radian(ibf))
  tab(ib)\Atgt=Degree(ATan(Cosf))
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_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
    colorc=RGB(Random(255),Random(255),Random(255)); couleur tirée au sort reste constante

Repeat
 
  Repeat
  Until WindowEvent()=0
 
  ClearScreen(0)
 
  j2=j
;  colorc=RGB(Random(255),Random(255),Random(255)) ; l'ensemble des lettres change de couleur à chaque caractère
  For i=0 To (#largeurEcran/#largeurFonte)+1
    car=PeekA(*texte+i)-32
    x=(car%nbCaracteresParLigneFonte)*#largeurFonte
    y=(car/nbCaracteresParLigneFonte)*#hauteurFonte
    colorc=RGB(Random(255),Random(255),Random(255)); les lettres changent de couleur

    For k=0 To #LargeurFonte-2 Step 2
      ClipSprite(fonte,x+k,y,2,#hauteurFonte-6)
      P_X=(i*#largeurFonte)+k
      P_Y=tab(j2)\posY
      RotateSprite(Fonte, tab(J2)\Atgt,#PB_Absolute)
      DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,tab(J2)\posY,255,colorc);
;         colorc=RGB(Random(255),Random(255),Random(255)) ; Chaque partie de la lettre change de couleur
     
      j2+1
      j2%360
    Next
   
  Next
 
  j+vitesseCourbe
  j%360
 
  decalage+vitesseCaracteres
 
  If decalage>=#largeurFonte
    j+decalage-(#LargeurFonte/2) ;
    j%360
    decalage%#largeurFonte
;             colorc=RGB(Random(255),Random(255),Random(255)); L'ensemble des lettres change de couleur à chaque synchronisation

    If PeekC(*texte+(#nbCaracParLigne+1)*SizeOf(Character))=0
      *texte=@texte$
;             colorc=RGB(Random(255),Random(255),Random(255)) ; l'ensemble des lettres change après un défilement complet

    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
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: [résolu] Souci avec sinus scroll

Message par kernadec »

bonsoir
merci à vous pour ses codes de plus en plus top et avec vos commentaires en plus :D
@PAPIPP le code précédent avec les couleurs c'est très très beau 8O merci!

Cordialement
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [résolu] Souci avec sinus scroll

Message par djes »

Superbe PAPPIP ! Chouette topic :)

On se rapproche de cet incroyable scrolltext où les lettres en relief tournent autour d'une barre sinusoïdale, à mon avis le meilleur de tous les temps. Je n'arrive plus à mettre la main dessus, si quelqu'un s'en souvient...

Edit: Je l'ai ! C'est la Corkscrew de Phenomena. Photon, l'un des meilleurs coders de l'époque, nous pondait là une petite merveille de programmation.

Image

Video : https://www.youtube.com/watch?v=_T3PpsQ2nig
Plus d'infos sur pouet : http://www.pouet.net/prod.php?which=9393

Dans le même genre, par The Silents (mais quelques années plus tard...) :
http://khmertube.khmerelite.ws/index.ph ... D-MBnJ_uyE
http://www.pouet.net/prod.php?which=9176
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

Re: [résolu] Souci avec sinus scroll

Message par raven »

bonjour excellent topic.

bravo Papipp,Majikeyric,Demivec 8)

Ce genre d'effet,les signus scroolltext,je sais pas faire faudra bien que j'y passe un jour,pour mes prochaines demos.
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: [résolu] Souci avec sinus scroll

Message par PAPIPP »

Bonjour à tous
Tout en gardant les options précédentes voici une rotation complète des lettres.

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 vitesseCaracteres=1,vitesseCourbe=1 ;les valeurs positives seulement
Global.i j=0
Global.i i,j2,k
Global.a car
Global.i x,y,P_X,P_Y,ibf.f,cosf.f,colorc

texte$=UCase("abcdefghijklmnopqrstuvwxyz")
texte$=Space(#nbCaracParLigne)+UCase(texte$)+Space(#nbCaracParLigne); + Chr(0)
; texte$+texte$+texte$
*texte=@texte$+26
Structure tsin_tgt
  posY.i
  Atgt.f
EndStructure
Global Dim tab.tsin_tgt(360)
For ib=0 To 359
  tab(ib)\posY=Sin(Radian(ibf))*#Amplitude+#PosYCentre
  ibf=ib
   Cosf.f=Sin(Radian(ibf))
;    Cosf.f=Cos(Radian(ibf))
  tab(ib)\Atgt=Degree(ATan(Cosf))
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_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
colorc=RGB(Random(255),Random(255),Random(255)); couleur tirée au sort reste constante

Repeat
  
  Repeat
  Until WindowEvent()=0
  
  ClearScreen(0)
  
  j2=j
  ;  colorc=RGB(Random(255),Random(255),Random(255)) ; l'ensemble des lettres change de couleur à chaque caractère
  For i=0 To (#largeurEcran/#largeurFonte)+1
    car=PeekA(*texte+i)-32
    x=(car%nbCaracteresParLigneFonte)*#largeurFonte
    y=(car/nbCaracteresParLigneFonte)*#hauteurFonte
    colorc=RGB(Random(255),Random(255),Random(255)); les lettres changent de couleur
    
    For k=0 To #LargeurFonte-2 Step 2
      
      ClipSprite(fonte,x+k,y,2,#hauteurFonte-6)
    ; *****************************  Avec commentaire sur les 2 instructions suivantes => projection suivant axe Y ***************************************** 
      RotateSprite(Fonte, tab(J2)\Atgt,#PB_Absolute) ; instruction seule sans commantaire => projection  sur la  perpendiculaire à la tangente de la courbe sinusoïdale 
      RotateSprite(Fonte,90-j2,#PB_Absolute) ; instruction seule rotation du texte autour d'un axe Z fictif en 2D avec décalage de cette rotatiion de 90° 1/4 de cercle sur la sinusoÎde
  ;       DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,tab(J2)\posY-24,255,colorc);
      DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,tab(J2)\posY,255,colorc);

;         colorc=RGB(Random(255),Random(255),Random(255)) ; Chaque partie de la lettre change de couleur
      P_Y=320
;       DisplayTransparentSprite(fonte,(i*#largeurFonte)-decalage+k,P_Y)  ; permet de matérialiser le texte de référence qui défile
;       StartDrawing(WindowOutput(0))
;         Box((i*#largeurFonte)-decalage+k,tab(J2)\posY,4,4,RGBA(255,255,0,0))
;         Box((i*#largeurFonte)-decalage+k-4,tab(J2)\posY-4,4,4,RGBA(255,0,0,0))
;       StopDrawing()

      j2+1
      j2%360
    Next
   
  Next
 
  j+vitesseCourbe
  j%360
 
  decalage+vitesseCaracteres
 
  If decalage>=#largeurFonte
    j+decalage-(#LargeurFonte/2) ;
    j%360
    decalage%#largeurFonte
;             colorc=RGB(Random(255),Random(255),Random(255)); L'ensemble des lettres change de couleur à chaque synchronisation

    If PeekC(*texte+(#nbCaracParLigne+1)*SizeOf(Character))=0
      *texte=@texte$
;             colorc=RGB(Random(255),Random(255),Random(255)) ; l'ensemble des lettres change après un défilement complet

    Else
      *texte+1
    EndIf
  EndIf
 
  FlipBuffers()
  ExamineKeyboard()
 
Until KeyboardPushed(#PB_Key_Escape)
Avec la rotation complète voyez-vous une différence entre Cosf.f=Sin(Radian(ibf)) et cosF.f=Cos(Radian(ibf)) ?
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: [résolu] Souci avec sinus scroll

Message par majikeyric »

free style !!! :D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [résolu] Souci avec sinus scroll

Message par djes »

Dans l'autre sens, c'est pas mal aussi. Par contre, il n'y aura pas d'overscan sur PC !
http://dhs.nu/video.php?ID=456
Répondre