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
:lol:
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 :P

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. :twisted:

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. 8O

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.