Page 1 sur 2
Pourquoi mon Sinus scroll râme
Publié : lun. 04/mai/2009 15:30
par TazNormand
Bonjour,
Je me suis fait un petit sinus/jump scrolltext avec la version 4.30 Demo, et mon code n'est pas fluide !!
Qui pourrait m'expliquer pourquoi ces 2 version de mon code ne vont pas à la même vitesse :
Code "Rapide" :
If initsprite () =0 Or initkeyboard ()=0 Or initmouse ()=0
messagerequester ( "Error" , "Sprite system can't be initialized" , 0)
End
EndIf
msg.s= "Pourquoi mon Sinus/Jump Scroll râme autant ??? "
loadfont (1, "comic sans MS" , 30)
If openwindow (0,0,0,800,600, "Mon 1er Starfield" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
If openwindowedscreen ( windowid (0),0,0,800,600,1,0,0)
clearscreen ( rgb (255,255,255))
x=800
sens=-1
Repeat
startdrawing ( windowoutput (0))
drawingfont ( fontid (1))
If x<=- textwidth (msg)+5
x=800
EndIf
drawtext (x,( sin ((x+120)/800* #PI *3)*64)+350,msg)
Event= waitwindowevent ()
examinekeyboard ()
examinemouse ()
x=x+sens
stopdrawing ()
delay (2)
Until keyboardpushed ( #PB_Key_Escape ) Or Event= #PB_Event_CloseWindow
EndIf
EndIf
End
Code "Lent" :
If initsprite () =0 Or initkeyboard ()=0 Or initmouse ()=0
messagerequester ( "Error" , "Sprite system can't be initialized" , 0)
End
EndIf
msg.s= "Pourquoi mon Sinus/Jump Scroll râme autant ??? "
loadfont (1, "comic sans MS" , 30)
If openwindow (0,0,0,800,600, "Mon 1er Starfield" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
If openwindowedscreen ( windowid (0),0,0,800,600,1,0,0)
clearscreen ( rgb (255,255,255))
x=800
sens=-1
Repeat
startdrawing ( windowoutput (0))
drawingfont ( fontid (1))
If x<=- textwidth (msg)+5
x=800
EndIf
drawtext (x,( sin ((x+120)/800* #PI *3)*64)+350,msg)
Event= waitwindowevent ()
examinekeyboard ()
examinemouse ()
x=x+sens
stopdrawing ()
clearscreen ( rgb (255,255,255))
flipbuffers ()
delay (2)
Until keyboardpushed ( #PB_Key_Escape ) Or Event= #PB_Event_CloseWindow
EndIf
EndIf
End
Publié : lun. 04/mai/2009 15:48
par Backup
..................
Publié : lun. 04/mai/2009 16:04
par Backup
..............
Publié : lun. 04/mai/2009 16:21
par TazNormand
Merci Dobro
j'avais déjà vu ton code ou plutôt celui d'Olliv, mais il ne me plaisait pas car d'une part je voulais faire tout moi-même de A à Z, et comme je n'ai jamais fait de trigo au collège, j'ai commencé par regarder comment se dessine une sinusoïdale, et d'autre part, il "balade" les lettres une par une, ce que je cherche c'est une sorte de scrolling jump/bounce.
En fait, je voudrai réécrire une partie d'une démo AMSTRAD CPC (BSC MEGADEMO), celle qui s'appelle "CRAZYSCROLL", elle comporte un scrolltext horizontal, qui devient "sautant" puis "volant/sinusoidal".
en lisant ton 1er message, j'ai changé comme tu me le soulignais les mauvais emplacement d'Examine..., par contre le sens=-10, j'avais deja testé, c'est vrai que c'est plut rapide mais moins "coulé", moins fluide.
en plus sur le pc du boulot (ben oui, je bricole PB au boulot au lieu de bosser, désolé) j'ai un effet de "cran", on a l'impression que le texte saccade par moment, je sais pas trop décrire cet problème.
Je vais me pencher sur la transformation en sprite
merci encore Dobro
Publié : jeu. 07/mai/2009 7:43
par kerkael
Pour les saccades, Dobro te répondra que c'est la faute à Windows, pas à PB.
Tiens, et si le code était lancé sur inux, ça marcherait mieux, monsieur Dobro ?
Toutes les quelques secondes, on a une lettre qui sautille.
Publié : jeu. 07/mai/2009 8:50
par djes
On a beaucoup parlé de la fluidité sur ce forum. Pour qu'un effet soit vraiment fluide, il faut qu'il respecte un certain timing, très régulier; avec les écrans plats, en gros, il faut une nouvelle image tous les 1/60ème de seconde. Si vous utilisez des instructions très lourdes, comme drawtext, vous ne contrôlez pas le temps, puisque le dessin des lettres est très variable! Il vaut mieux utiliser uniquement ces sprites, qu'on aura éventuellement créés au début du programme. Ensuite il y a plusieurs autres astuces, la synchro (sujet d'une discussion récente), etc.
Publié : jeu. 07/mai/2009 9:47
par Backup
..............
Publié : jeu. 07/mai/2009 10:03
par djes
Du calme, du calme! T'es trop gentil, tu leur apportes tous les programmes tout faits, et ils ne sont jamais contents! Moi je les oriente et je les laisse coder

Publié : jeu. 07/mai/2009 13:12
par kerkael
Dobro a écrit :monsieur Dobro , il t'emmerde !
tu apporte quoi dans la debat là ??
t'es qui toi , pour faire des réponses a ma place ??
j'hallucine !!
Sur ma question sur les saccades du sprite du pendule, ici :
http://www.purebasic.fr/french/viewtopi ... ht=pendule, il ya pas une semaine tu m'as répondu que c'était windows la daube. Même symptôme, même cause, je me dis.
Alors je traduis : Si je n'apporte rien dans le débat en donnant la même réponse que toi au même problème ... quelle autre réponse veux-tu apporter, ici, et surtout au problème du pendule, puisque apparemment ta propre réponse n'a rien apporté la-bas.

Publié : jeu. 07/mai/2009 13:23
par TazNormand
Bon, je ne veux pas que mon post cause des tensions dans le forum.
voici une nouvelle version de mon code, cette fois-ci avec les sprites.
Dites moi ce que je peux améliorer.optimiser, et pourquoi.
Soyez indulgents, j'utilise la version Démo en attendant de gonfler mon compte Paypal pour m'acheter la version complète.
voici le code; j'ai essayé de mettre un maximum de commentaires, ça peut servir à d'autres :
; Mon 3ème Sinus Scrolling
; ©.2009 TazNormand
; Initialisations Diverses
If initsprite () =0 Or initkeyboard ()=0 Or initmouse ()=0
messagerequester ( "Error" , "Sprite system can't be initialized" , 0)
End
EndIf
;ExamineDesktops()
;ecranW.w=DesktopHeight(0)
;ecranH.w=DesktopHeight(0)
If openwindow (0,0,0,800,600, "Mon 2ème Sinus Scroll" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
If openwindowedscreen ( windowid (0),0,0,800,600,1,0,0)
clearscreen ( rgb (0,0,0))
EndIf
EndIf
; Choisir la police
loadfont (1, "impact" , 30)
; Init Variables
; Message du scrolling : ATTENTION, UN ESPACE A LA FOIS
msg.s= "<> <> <> o_o ^_^ . . . . . . . . Mon 3ème Sinus Scrolling !!! Cette fois chaque mot à sa propre position, dépendante de celle du mot précédent !!! Envie de vomir ??? . . . . . . . . . . . . . . ©.2009 TazNormand. . . . . . . . . . . . . . o_o ^_^ . . . . . . . . 5 4 3 2 1 0"
; combien d'espaces de séparation des mots + 1 espace à la fin de la chaine
nbspace.w= countstring (msg, space (1))+1
; Table des mots, et des positions X,Y,Largeur de ces mots
Dim Mots.s(nbspace)
Dim MotPosX.w(nbspace)
Dim MotPosY.w(nbspace)
Dim MotLarg.w(nbspace)
; Variable pour le tracé de la sinusoide
frequence.w=3
abscisse.w=120
ordonnee.w=350
amplitude.w=64
echantillon.w=800
; Créer autant de sprites que d'espaces
largtot.w=0
For i=1 To nbspace
mots.s(i)= stringfield (msg,i, space (1))
startdrawing ( windowoutput (0))
drawingfont ( fontid (1))
motlarg(i)= textwidth (mots(i))
tailleH.w= textheight (mots(i))
stopdrawing ()
createsprite (i,motlarg(i),tailleH)
startdrawing ( spriteoutput (i))
drawingmode ( #PB_2DDrawing_Transparent )
drawingfont ( fontid (1))
drawtext (0,0,mots(i), rgb (0,255,0), rgb (255,255,255))
stopdrawing ()
LargTot=largtot+motlarg(i)+5
; initialisation pour que les tables position ne soient pas vides
motposx(i)=800
motposy(i)=300
Next i
; Pas de décalage du scrolling = vitesse de défilement
sens.w=-5
; Boucle principale
Repeat
; Examen des evènements (clavier/souris/fenêtre)
Event= waitwindowevent ()
examinekeyboard ()
examinemouse ()
; Boucler sur le nombre de sprites
For i=1 To nbspace
If i=1
motposx(i)=motposx(i)+sens ; <<<< Si c'est le 1er sprite (=1er mot), on le positionne normalement
Else
motposx(i)=motposx(i-1)+sens+motlarg(i-1)+40 ; <<<< Par contre, les suivants sont décalés en fonction du mot/sprite précédent
EndIf
If motposx(nbspace)<(0-(motlarg(nbspace)+100))
motposx(1)=800 ; <<<< Si le dernier mot/sprite est positionné hors écran visible on repositionne le 1er mot/sprite en 800
EndIf
motposy(i)=( sin ((motposx(i)+abscisse)/echantillon* #PI *frequence)*amplitude)+ordonnee ; <<< Position verticale suivant sinus du mot
displaytranslucentsprite (i,motposx(i),motposy(i),128 ) ; <<<< Afficher le sprite transparent
Next i
flipbuffers ()
clearscreen ( rgb (0,0,0))
Until keyboardpushed ( #PB_Key_Escape ) Or Event= #PB_Event_CloseWindow Or mousebutton ( #PB_MouseButton_Right )
End
Publié : jeu. 07/mai/2009 15:27
par djes
Oulà! Pourquoi ne pas créer un sprite par lettre de l'alphabet, que tu n'afficherais que s'il est réellement à l'écran? Tu peux afficher plusieurs fois le même sprite.
Remplace le waitwindowevent par un windowevent (ça ne sert à rien de bloquer le prog).
Si tu peux, utilise plutôt des sprites 3d (attention à leur taille, avec directx7 il faut qu'ils soient carrés, genre 128*128).
Enfin, si tu veux un tracé à vitesse (à peu près) constante, il faut que tu utilises flipbuffers(1) ou 2.
Publié : jeu. 07/mai/2009 15:46
par TazNormand
@Djes : Ben en fait, je voulais faire justement un scrolltext où les sprites serait les mots, et pas les lettres. Je me doute que cela implique un grosse charge mémoire, et une optimisation, mais ce que je cherche c'est un effet sur le mot, pas sur la lettre, chose que m'a proposé Dobro avec le code d'Olliv.
J'ai essayé de rajouter un code de "Raster" en arrière plan, et là ça rame dur. Mais comme je suis sur le PC du boulot avec un chipset Intel 915 intégré, c'est pas la panacée pour les "effets graphiques".
Je vais essayer aussi les sprites3D, histoire de me former.
merci pour vos conseils
Publié : jeu. 07/mai/2009 16:38
par Backup
...............
Publié : jeu. 07/mai/2009 16:42
par TazNormand
Bon, une nouvelle version, avec Sprite3D, et spécial Parkinson juste pour tester RotateSprite3D, juste pour délirer quoi.
; Mon 3ème Sinus Scrolling
; ©.2009 TazNormand
; Initialisations Diverses
If initsprite () =0 Or initkeyboard ()=0 Or initmouse ()=0 Or initsprite3d ()=0
messagerequester ( "Error" , "Sprite system can't be initialized" , 0)
End
EndIf
;ExamineDesktops()
;ecranW.w=DesktopHeight(0)
;ecranH.w=DesktopHeight(0)
If openwindow (0,0,0,800,600, "Mon 2ème Sinus Scroll" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
If openwindowedscreen ( windowid (0),0,0,800,600,1,0,0)
clearscreen ( rgb (0,0,0))
EndIf
EndIf
; Choisir la police
loadfont (1, "impact" , 30)
; Init Variables
; Message du scrolling : ATTENTION, UN ESPACE A LA FOIS
msg.s= "<> <> <> o_o ^_^ . . . . . . . . Mon 3ème Sinus Scrolling !!! Cette fois chaque mot à sa propre position, dépendante de celle du mot précédent !!! Envie de vomir ??? . . . . . . . . . . . . . . ©.2009 TazNormand. . . . . . . . . . . . . . o_o ^_^ . . . . . . . . 5 4 3 2 1 0"
; combien d'espaces de séparation des mots + 1 espace à la fin de la chaine
nbspace.w= countstring (msg, space (1))+1
; Table des mots, et des positions X,Y,Largeur de ces mots
Dim Mots.s(nbspace)
Dim MotPosX.w(nbspace)
Dim MotPosY.w(nbspace)
Dim MotLarg.w(nbspace)
; Variable pour le tracé de la sinusoide
frequence.w=3
abscisse.w=120
ordonnee.w=350
amplitude.w=64
echantillon.w=800
; Créer autant de sprites que d'espaces
largtot.w=0
For i=1 To nbspace
mots.s(i)= stringfield (msg,i, space (1))
startdrawing ( windowoutput (0))
drawingfont ( fontid (1))
motlarg(i)= textwidth (mots(i))
tailleH.w= textheight (mots(i))
stopdrawing ()
createsprite (i,motlarg(i),tailleH, #PB_Sprite_Texture )
startdrawing ( spriteoutput (i))
drawingmode ( #PB_2DDrawing_Transparent )
drawingfont ( fontid (1))
drawtext (0,0,mots(i), rgb (0,255,0), rgb (255,255,255))
stopdrawing ()
LargTot=largtot+motlarg(i)+5
createsprite3d (i,i)
; initialisation pour que les tables position ne soient pas vides
motposx(i)=800
motposy(i)=300
Next i
; Pas de décalage du scrolling = vitesse de défilement
sens.w=-5
; Variables pour rotation du sprite3D
rotat.w=0
sensrot.w=1
; Boucle principale
If start3d ()
Repeat
; Examen des evènements (clavier/souris/fenêtre)
Event= windowevent ()
examinekeyboard ()
examinemouse ()
; Boucler sur le nombre de sprites
For i=1 To nbspace
If i=1
motposx(i)=motposx(i)+sens ; <<<< Si c'est le 1er sprite (=1er mot), on le positionne normalement
Else
motposx(i)=motposx(i-1)+sens+motlarg(i-1)+40 ; <<<< Par contre, les suivants sont décalés en fonction du mot/sprite précédent
EndIf
If motposx(nbspace)<(0-(motlarg(nbspace)+100))
motposx(1)=800 ; <<<< Si le dernier mot/sprite est positionné hors écran visible on repositionne le 1er mot/sprite en 800
EndIf
motposy(i)=( sin ((motposx(i)+abscisse)/echantillon* #PI *frequence)*amplitude)+ordonnee ; <<< Position verticale suivant sinus du mot
;DisplayTranslucentSprite (i,motposx(i),motposy(i),128 ) ; <<<< Afficher le sprite transparent
displaysprite3d (i,motposx(i),motposy(i),128 ) ; <<<< Afficher le sprite transparent
rotatesprite3d (i,rotat,1)
; Rotation du sprite3D
rotat=rotat+sensrot
If rotat>10
rotat=10
sensrot=sensrot*-1
EndIf
If rotat<-10
rotat=-10
sensrot=sensrot*-1
EndIf
Next i
flipbuffers (1)
clearscreen ( rgb (0,0,0))
Until keyboardpushed ( #PB_Key_Escape ) Or Event= #PB_Event_CloseWindow Or mousebutton ( #PB_MouseButton_Right )
stop3d ()
EndIf
End
PS : Merci Dobro pour Colorer2, excellent programme
EDIT : J'ai déplacer comme Djes me l'a conseillé les Start3d()/Stop3D(), et j'ai mis une rotation à max 10°, ça fait plus "lisible"
Publié : jeu. 07/mai/2009 17:40
par djes
C'est déjà mieux. Par contre il faut que tu sortes les start3d()/stop3d() de ta boucle car ce sont des opérations assez lentes (une seule fois avant la boucle ça ira).
Dobro> Avec le subsystem DirectX9, pas de problèmes de tailles de sprites, mais par défaut on est toujours en DirectX7, avec les mêmes contraintes.