Algo - Défilement de texte "doux" [Résolu]

Algo - Défilement de texte "doux" [Résolu] - Flash/ActionScript - Programmation

Marsh Posté le 15-12-2005 à 12:46:35    

Bonjour,
je cherche a faire en flash un défilement de texte horizontal doux. C'est à dire que quelque soit le texte affiché, il défile continuellement (il sort par la gauche, et revient par la droite)
 
Illustration : faire défiler le mot "bonjour"

---------------- (champ de texte)
bonjour   bonjour
onjour   bonjour  
njour   bonjour  
jour   bonjour   b
our   bonjour   bo
ur   bonjour   bon
 
...


 
1er problème : trouver le nombre de fois qu'il faut concaténer le texte d'origine pour qu'il fasse au minimum la taille de mon champ de texte + la taille de ma variable a afficher
A priori, c'est faisable étant donné que le champ de texte possède une taille fixe (X) et qu'on peut obtenir la taille en pixel de la variable (Y) (attention, on concatene les espaces à la variable a afficher).
Donc on a X+Y = n*Y, donc on retrouve le nombre de concaténation à faire (n)
 
2eme problème (et c'est la que j'ai un souci) : réussir à replacer correctement la chaine de caractere lorsque la fin est affichée dans le champs de défilement.
Si je reprend mon exmeple précédent, j'ai obtenu la chaine "bonjour   bonjour   bonjour" a faire défiler (au moins 2 "bonjour" affichés continuellement et le 3eme pour faire transition).
 

---------------- (champ de texte)
bonjour   bonjour   // Début
    1            2
 
jour   bonjour      //Fin (décalages a cause des espaces)
   2            3
...


Il faut donc, lorsque la fin est atteinte, se repositionner sur le début. Le problème est qu'il faut faire correspondre le caractere de fin du motif 3 avec le caractere de début du motif 1 (dans l'exemple cidessus, il faut se repositionner au pixel correspondant au j du motif 1).
 
Le truc est que je ne trouve pas de formule pour représenter ca.
Si qqun pouvait m'aider (en espérant que mon explication est assez claire)
 
(si qqun a un autre moyen de faire du défilement doux (sans utiliser la méthode qui consiste à combler un texte de taille inférieur au champ de défilement par des espaces au lieu de dédoubler le texte en question), je suis preneur)
 
Bizarrement, le calcul est simple pour un texte de taille supérieur au champ de défilement (il faut se repositionner sur le texte à "taille du motif - taille du champ) et pourtant je vois quand meme des décalages...
C'est mon calcul qui est totalement foireux ou c'est la méthode Flash qui donne la taille des variables texte dans un champ en pixel qui est foireuse?
 
Merci :)


Message édité par hop le fou le 16-12-2005 à 09:59:48
Reply

Marsh Posté le 15-12-2005 à 12:46:35   

Reply

Marsh Posté le 15-12-2005 à 13:49:41    

Comment récupères-tu la largeur de ton champs texte ? .. simplement avec _width ?

Reply

Marsh Posté le 15-12-2005 à 13:56:24    

Du champ de texte oui.
 
j'ai peut etre trouvé une formule :  
Taille Variable totale - Taille Champ - ((n - (Taille champ / Taille motif))* Taille Motif
 
Je vais l'essayer
 
EDIT : je crois que j'ai inversé qqchose la dedans...


Message édité par hop le fou le 15-12-2005 à 13:59:25
Reply

Marsh Posté le 15-12-2005 à 14:03:32    

faut t'il encore que la police est une chasse fixe (genre _typewriter je crois) non ?


---------------
D3
Reply

Marsh Posté le 15-12-2005 à 14:03:52    

Non, attends ..
La récupération de la taille d'un champs texte dynamique juste par _width n'a jamais et n'est toujours pas efficace ...
Essaye ça :

Code :
  1. var mtf:TextFormat = tonChampsTexte.getTextFormat();
  2. var vals:Object = mtf.getTextExtent(tonChampsTexte.text);
  3. trace(tonChampsTexte._width);
  4. trace(tonChampsTexte.textWidth);
  5. trace(vals.textFieldWidth);
  6. trace(vals.width);


 
Tu risques d'avoir une belle surprise ... dans le pire des cas, 4 valeurs différentes .. dans le meilleur, seulement 3 ..
 
A mon sens, la version TextFormat.getTextExtent() est la meilleure car elle tient compte de la géométrie réelle de la police ( récupérée dans le TextFormat ) ...
 
A tester ...  
 
 

Reply

Marsh Posté le 15-12-2005 à 14:09:57    

Ah oui mais non, je parlais de la taille du champ de texte (le contenant), pas de la taille de la variable que je veux afficher (le contenu)
 
Pour la taille de ma variable en pixel, j'ai bien utilisé TextExtent
 
Je reviens éditer dans 2 minutes pour mettre mes calculs dans le code
 
EDIT : voila ca donne ca, mais la derniere formule n'est pas encore bonne je pense...

Code :
  1. var motif = xmlObj.produits.comment.value+'    ';
  2. var taille_champ = this.commentaire._width;
  3.     var taille_motif = this.commentaire.getTextFormat().getTextExtent(motif);
  4.     var nb_concaten = Math.ceil((taille_champ + taille_motif) / taille_motif);
  5.     var commentaire;
  6.     for (var i=1; i<nb_concaten; i++)
  7.     {
  8.         commentaire += commentaire;
  9.     }
  10.     var taille_commentaire = this.commentaire.getTextFormat().getTextExtent(motif);
  11.     var repositionnement = taille_commentaire - taille_champ - (nb_concaten - (Math.ceil(taille_motif / taille_champ)))*taille_motif;


Message édité par hop le fou le 15-12-2005 à 14:12:45
Reply

Marsh Posté le 15-12-2005 à 14:16:42    

c'est vachement compliqué je trouve votre truc il serait pas plus simple de faire defiller en boucle son champs texte (technique du panoramique)
EDIT: enfin ca permet d'experimenter des nouveaux trucs ce qui n'est jamais un mal


Message édité par mechkurt le 15-12-2005 à 14:17:21

---------------
D3
Reply

Marsh Posté le 15-12-2005 à 14:23:37    

C'est quoi le principe? (chercher technique panoramique flash et ca me sort des références d'appareils photo...)

Reply

Marsh Posté le 15-12-2005 à 14:36:02    

tu crée deux occurences (identiques ou pas suivant l'effet rechérché) de texte et tu modifie leur _x toutes les frames, quand elle sont en dessous (ou au dessus dans le cas d'un defilement -> ) d'une certaine valeur tu leur rajoute la somme des deux texte._width


---------------
D3
Reply

Marsh Posté le 15-12-2005 à 14:57:02    

Euh, j'ai du mal a saisir le principe (l'interet de l'utilisation de deux champs de texte).
Sinon c'est bien la meme chose (le princip du défilement quoi) :  

Code :
  1. this.onEnterFrame = function() {
  2.         with (_root.commentaire) {
  3.            hscroll += 3;
  4.             if (hscroll == maxhscroll) {
  5.                 hscroll = _root.repositionnement;
  6.                 _root.myDebug.trace('Repositionnement');
  7.             };
  8.         }
  9.     }


Mais le problème c'est bien de savoir ou se repositionner...
 
EDIT : ya plein de conneries dans mon code 3 posts plus haut, je corrigerais ca quand j'aurais trouvé la bonne formule.


Message édité par hop le fou le 15-12-2005 à 14:57:37
Reply

Marsh Posté le 15-12-2005 à 14:57:02   

Reply

Marsh Posté le 15-12-2005 à 15:24:52    

tu fait un texte statique dans lequelle tu ecrit bonjour, clic droit dessus => creer symbole => clip tu colie colle ton clip pour en avoir deux identique sur ta scene, tu nomme le premier texte1_mc et le deuxieme je te laisse deviner
 
dans ta frame un truc de ce genre te donneras l'idee general:

Code :
  1. var largeur:Number = texte1_mc._width;
  2. var limite:Number = 300;
  3. texte1_mc.onEnterFrame = function() {
  4. texte1_mc._x--;
  5. if (texte1_mc._x<0) {
  6. texte1_mc._x+=largeur*2;
  7. }
  8. if (texte1_mc._x<limite) {
  9. texte2_mc._x=texte1_mc._x+largeur;
  10. } else {
  11. texte2_mc._x=texte1_mc._x-largeur;
  12. }
  13. }


a toi de comprendre a quoi sert limite ;)


---------------
D3
Reply

Marsh Posté le 15-12-2005 à 15:45:59    

Soit j'ai rien compris, soit tu as mal lu ce que je souhaite faire.
Ton cas ne prend pas en compte les variables plus grandes que le champ texte lui meme, vu que tu joues sur les coordonnées et non pas sur le texte lui meme. Prendre les 2 en compte compliquerais davantage le problème.
Ca ne prend pas en compte non plus les variables trop courtes (style le "bonjour" du dessus), puisque tu te limites à 2 champs...
Limite sert apparement a définir l'espace entre tes 2 champs qui défilent, mais bon, je ne pense pas que cette solution convienne a mon problème.
 
J'ai vraiment l'impression que la méthode de récupération de la taille d'une variable texte dans un champ est completement à l'ouest.
En partant d'un endroit quelconque sur la variable, si j'y soustrais la taille du motif, je ne retombe pas sur le meme caractere sur le motif précédent... comprend pas...

Reply

Marsh Posté le 15-12-2005 à 15:48:35    

a effectivement j'avais pas vu (oublié) que les texte était de taille variables et inconnu a l'avance


---------------
D3
Reply

Marsh Posté le 15-12-2005 à 16:04:41    

Normalement, ceci devrait fonctionner...

Code :
  1. var motif = xmlObj.produits.comment.value+'    ';
  2. var taille_champ = this.commentaire._width;
  3. var taille_motif = this.commentaire.getTextFormat().getTextExtent(motif).width;
  4. var nb_concaten = Math.ceil((taille_champ + taille_motif) / taille_motif);
  5. var commentaire = motif;
  6. for (var i=1; i<nb_concaten; i++)
  7. {
  8.     commentaire += motif;
  9. }
  10. var taille_commentaire = this.commentaire.getTextFormat().getTextExtent(commentaire).width;
  11. this.repositionnement = taille_commentaire - taille_champ - 1*taille_motif;
  12. this.commentaire.text = commentaire;


 
Mais ca ne fonctionne pas...
 
Dans la formule le "1" a été choisi arbitrairement, puisque je n'ai pas encore trouvé de combien de motif je pouvais "reculer" pour revenir au premier...
Mais meme la, je ne reviens sur le meme caractere du motif précédent...

Reply

Marsh Posté le 16-12-2005 à 09:36:44    

Tested & approved : la méthode getTextExtend, c'est du pipeau...
Ca renvoie n'importe quoi...
 
Je viens de remplir mon champ texte de 'i', au final il y a environ 100 pixels de différence entre la taille du champ et la taille du texte du champ (480 pour mon champ, 385 pour le texte)
 
Bon bah je vais essayer une autre méthode...
 

Citation :

# trace(tonChampsTexte._width);
# trace(tonChampsTexte.textWidth);
# trace(vals.textFieldWidth);
# trace(vals.width);


 
La 1ere ce n'est pas ce que je veux
La 2eme je ne connais pas et je vais essayer
La 3eme n'existe pas, l'objet obtenu par un getTextExtent ne possède que les attributs width et height, c'est tout
La 4eme, c'est celle que j'utilisais avant et qui donc est loin d'être précise...
 
Plus qu'a espérer que la 2eme méthode soit bonne...

Reply

Marsh Posté le 16-12-2005 à 09:59:13    

La 2eme méthode était la bonne. Comme ca fonctionne
 
Les calculs qui vont bien :

Code :
  1. // Remplissage de la zone de commentaires
  2. var motif = xmlObj.produits.comment.value+'    ';
  3. // Taille du champ de texte
  4. var taille_champ = this.commentaire._width;
  5. // Calcul de la taille du motif
  6. this.commentaire.text = motif;
  7. var taille_motif = this.commentaire.textWidth;
  8. // Concaténation du motif pour obtenir un texte plus grand que le champ + un motif
  9. var nb_concaten = Math.ceil((taille_champ + taille_motif) / taille_motif);
  10. var commentaire = motif;
  11. for (var i=1; i<nb_concaten; i++)
  12. {
  13.     commentaire += motif;
  14. }
  15. // Calcul de la taille du texte complet
  16. this.commentaire.text = commentaire;
  17. var taille_commentaire = this.commentaire.textWidth;
  18. // Calcul du repositionnement
  19. this.repositionnement = taille_commentaire - taille_champ - 1*taille_motif;
  20. this.commentaire.text = commentaire;


 
La méthode de défilement :

Code :
  1. this.onEnterFrame = function() {
  2.         with (_root.commentaire) {
  3.            hscroll += 3;
  4.             if (hscroll == maxhscroll) {
  5.                 hscroll = _root.repositionnement;
  6.             };
  7.         }
  8.     }


 
2 choses quand même :
- il subsiste un léger décalage lors du repositionnement (de l'ordre du pixel). Je suppose que c'est du au fait qu'on déplace le texte par bloc de pixels (ici 3). C'est rectifiable en ajoutant un +1 ou -1 au calcul
- le '1' dans le calcul du repositionnement peut etre amélioré je pense, il y a des cas ou on peut reculer de + de 1 motif, mais je n'y ai pas plus réfléchi que ca...

Reply

Marsh Posté le 16-12-2005 à 10:37:48    

hop le fou a écrit :


La 3eme n'existe pas, l'objet obtenu par un getTextExtent ne possède que les attributs width et height, c'est tout  


 
Hum ! .. t'es en Flash 5 ou inférieur ??? ;)

Citation :


TextFormat.getTextExtent()
Availability
Flash Player 6. The optional width parameter is supported in Flash Player 7.
[bla bla bla]
Returns
An object with the properties width, height, ascent, descent, textFieldHeight, textFieldWidth.


Message édité par Mr Mala le 16-12-2005 à 10:42:09
Reply

Marsh Posté le 16-12-2005 à 16:24:19    

Euh, non, moi j'ai ca :
 

Citation :

Disponibilité
Flash Player 6.
Usage
monObjetTextFormat.getTextExtent (texte)
Paramètres
texte Une chaîne.
Renvoie
Un objet avec les propriétés width et height.
Description
Méthode ; renvoie la taille de la chaîne de texte spécifiée dans le paramètre texte dans ce format
de caractère. La valeur renvoyée est un objet de la classe Object avec deux propriétés, width et
height. Le texte est considéré comme du texte ordinaire (pas HTML). Le texte est une ligne
de texte unique ; les retours chariot et les sauts de ligne sont ignorés, et le retour automatique du
texte à la ligne n’est pas appliqué.


 
Et j'ai testé dans le doute que ma doc soit pas bonne (Dictionnaire Actionscript de Macromedia), mais non, l'attribut textFieldHeight n'existe pas (testé avec Flash 7)
 
Bizarre ces différences de doc? :??:
 
EDIT : avec la doc en entier c'est encore mieux.


Message édité par hop le fou le 16-12-2005 à 16:25:51
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed