Page 2 sur 2

Re: Souci avec sinus scroll

Publié : mar. 07/oct./2014 11:14
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)

Re: Souci avec sinus scroll

Publié : mar. 07/oct./2014 11:31
par PAPIPP
Bonjour Demivec

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

A+

Re: Souci avec sinus scroll

Publié : mar. 07/oct./2014 23:49
par majikeyric
@demivec: Comment en as-tu déduit ce calcul ?

Code : Tout sélectionner

   If decalage>=#largeurFonte
     j + decalage - (#LargeurFonte / 2)
   ...

Re: Souci avec sinus scroll

Publié : mer. 08/oct./2014 7:48
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+

Re: Souci avec sinus scroll

Publié : sam. 11/oct./2014 16:58
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.

Re: [résolu] Souci avec sinus scroll

Publié : dim. 12/oct./2014 0:59
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.

Re: [résolu] Souci avec sinus scroll

Publié : mar. 14/oct./2014 9:02
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+

Re: [résolu] Souci avec sinus scroll

Publié : mar. 14/oct./2014 15:36
par majikeyric
Joliiii !!! c'est la première fois que je vois ce type d'effet ! :D

Re: [résolu] Souci avec sinus scroll

Publié : mar. 14/oct./2014 22:32
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)

Re: [résolu] Souci avec sinus scroll

Publié : mer. 15/oct./2014 19:29
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

Re: [résolu] Souci avec sinus scroll

Publié : jeu. 16/oct./2014 9:51
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

Re: [résolu] Souci avec sinus scroll

Publié : ven. 17/oct./2014 18:42
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.

Re: [résolu] Souci avec sinus scroll

Publié : sam. 18/oct./2014 14:39
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)) ?

Re: [résolu] Souci avec sinus scroll

Publié : sam. 18/oct./2014 15:40
par majikeyric
free style !!! :D

Re: [résolu] Souci avec sinus scroll

Publié : dim. 26/oct./2014 10:00
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