IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> [RESOLU] [Flash AS2 FP7] mettre certains mots en couleur dans un texte dynamique
Options
ccciolll
posté 6 Jun 2014, 15:06
Message #1


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 262
Inscrit : 10 Mar 2005
Membre no 34 861



Bonjour, je suis contraint de construire une belle grosse usine à gaz suite à une demande bien spécifique

En gros, on me fournit une liste de mots.

Ensuite, sur l'animation flash, les utilisateurs saisissent leur infos et chaque fois que l'un des mots apparaît il doit apparaître en italique au lieu de roman.

Je ne suis pas DU TOUT programmeur, j'ai juste eu une formation sur flash d'une durée de 3 jours il y a 10 ans de cela, je dois me débrouiller avec des bouts de code piqués par ci par là en essayant de comprendre leur logique.
Je suis contraint d'utiliser ActionScript2 et FalshPlayer7.
Voici le code que j'ai développé pour y parvenir.

La variable fournie par l'utilisateur est c_fonction; Là, je remplace l'utilisateur et j'ai tapé dans c_fonction : xaxexixoxu
Ici j'ai utilisé de la couleur plutôt que de l'italique (raisonner juste sur une figure fausse) pour plus de simplicité, car changer la typo je sais le faire aussi bien que changer la couleur. Mais c'est plus lisible un changement de couleur à l'écran le temps de tester.

Précisons aussi que vfon c'est la variable du champ qui va afficher le texte (en bas de mon swf), tfon c'est le nomp de ce champ, et latrace c'est la variable d'une autre champ que j'ai mis en haut du swf pour tenter de comprendre où mon code a merdé (et ça m'a bien servi à identifier ce merdage…)

Code
// ---------------------------------------------
// fonction qui teste si un champ est défini ou pas
// ---------------------------------------------
function champ_defini(qui)
    {
        var defini = true;
        if ((eval(qui)== undefined) || (eval(qui) == "") ){ defini = false; }
        return defini;
    }
    


// Mots à rechercher

Mot1 = "xe";
Mot2 = "xo";

// chercher le Mot1 dans le champ c_fonction
// si on le touve, placer une balise $ avant et une balise § après
// sinon le laisser tel quel

if (c_fonction.indexOf(Mot1) != -1)
    {
    xfonctionMot1 = c_fonction.split(Mot1)[0];
    xfonctionMot1 += "$" + Mot1 + "§";
    xfonctionMot1 += c_fonction.split(Mot1)[1];
    }
    else
    {
    xfonctionMot1 = c_fonction;
    }
    
// Même chose avec un Mot2
    
if (xfonctionMot1.indexOf(Mot2) != -1)
    {
    xfonctionMot2 = xfonctionMot1.split(Mot2)[0];
    xfonctionMot2 += "$" + Mot2 + "§";
    xfonctionMot2 += xfonctionMot1.split(Mot2)[1];
    }
    else
    {
    xfonctionMot2 = xfonctionMot1;
    }

xfonctionBalise = xfonctionMot2;


// définir les textFormat (genre de feuille de style)
var Mot:TextFormat = new TextFormat();
Mot.color = 0xffbb3b;

// découper l'ensemble, en fonction des balises, en variables "normales" et "spéciales"

if(champ_defini("xfonctionBalise"))
    {
    xfonctionNormal1 = xfonctionBalise.split('$')[0]
    xfonctionSuite1 = xfonctionBalise.split('$')[1]
    
    if(champ_defini("xfonctionSuite1"))
        {
        xfonctionSpecial1 = xfonctionSuite1.split('§')[0]
        xfonctionSuite2 = xfonctionSuite1.split('§')[1]
        
        if(champ_defini("xfonctionSuite2"))
            {
            xfonctionNormal2 = xfonctionSuite2.split('$')[0]
            xfonctionSuite3 = xfonctionSuite2.split('$')[1]
    
            if(champ_defini("xfonctionSuite3"))
                {
                xfonctionSpecial2 = xfonctionSuite3.split('§')[0]
                xfonctionNormal3 = xfonctionSuite3.split('§')[1]
                }
            }
        
        }
    
    }


// remplir le bloc texte avec les textes normaux et spéciaux
// et définir à chaque fois un point de coupe "var" entre chaque élément

vfon = "";

if(champ_defini("xfonctionNormal1"))
    {
    vfon += xfonctionNormal1;
    }

if(champ_defini("xfonctionSpecial1"))
    {
    var S11:Number = tfon.length;
    vfon += xfonctionSpecial1;
    var S12:Number = tfon.length;
    }
    
if(champ_defini("xfonctionNormal2"))
    {
    vfon += xfonctionNormal2;
    }
    
if(champ_defini("xfonctionSpecial2"))
    {
    var S21:Number = tfon.length;
    vfon += xfonctionSpecial2;
    var S22:Number = tfon.length
    }
    
if(champ_defini("xfonctionNormal3"))
    {
    vfon += xfonctionNormal3;
    }


// appliquer les textFormat entre chaque point de coupe
tfon.setTextFormat(S11, S12, Mot);
tfon.setTextFormat(S21, S22, Mot);



// TRACE
latrace = "c_fonction=" + c_fonction + "\r";
latrace += "xfonctionMot1=" + xfonctionMot1 + "\r";
latrace += "xfonctionMot2=" + xfonctionMot2 + "\r";
latrace += "xfonctionBalise=" + xfonctionBalise + "\r";
latrace += "xfonctionNormal1=" + xfonctionNormal1 + "\r";
latrace += "xfonctionSuite1=" + xfonctionSuite1 + "\r";
latrace += "xfonctionSpecial1=" + xfonctionSpecial1 + "\r";
latrace += "xfonctionSuite2=" + xfonctionSuite2 + "\r";
latrace += "xfonctionNormal2=" + xfonctionNormal2 + "\r";
latrace += "xfonctionSuite3=" + xfonctionSuite3 + "\r";
latrace += "xfonctionNormal3=" + xfonctionNormal3 + "\r";

    
// --------------------------------------
stop();


Voilà voilà, et le résultat obtenu



Voilà, de xaxexixoxu envoyé dans le swf, j'obtiens xaxexi alors que je souhaitait obtenir xaxexixoxu

Manifestement, le souci se pose à l'étape
xfonctionSuite1 = xfonctionBalise.split('$')[1]
où je m'attendais à obtenir xfonctionSuite1 = xe§xi$xo§xu mais n'obtiens que xfonctionSuite1 = xe§xi
Donc il coupe comme je lui demande après la première balise $. Ça c'est bien.
Mais, bien que je ne lui ai pas demandé, il considère qu'il peut squeezer tout ce qui se trouve après la seconde balise $.
Et ça c'est pas bon du tout !


J'ai d'abord pensé à varier un peu plus mes balises piour éviter qu'il tombe plusieurs fois sur la même, mais non. Si j'ai fait des balises c'est pas juste pour rigoler (sinon je passais direct à l'étape remplissage après avoir repéré les mots sans avoir besoin de baliser). Si j'ai fait des balises c'est parce que je ne sais pas dans quel ordre les mots apparaîtront.

Dans mon exemple, il faut que xaxexixoxu soit aussi bien traité que xuxoxixexa ou que xaxe ou que xuxexoxu ou xuxixuxi, etc…
Dans tous les cas, je veux que xe et xo soient repérés et mis dans une fonte (enfin une couleur dans min exemple) différente.

Et pour faire " simple " j'ai décidé qu'il n'y aurait jamais plus de 2 mots "spéciaux" différents à la fois dans le champ c_fonction (sinon le programme serait encore plus long).

Bon, donc mon problème est "simple", commet faire pour que, quand je coupe après la première balise $, il prenne TOUT le reste et non pas seulement "le reste jusqu'à la prochaine balise $".

EDIT : une solution a été trouvée ici

Ce message a été modifié par ccciolll - 13 Jun 2014, 11:51.


--------------------
En famille
Hackintosh : intel core i5 3570K "Ivy Bridge" - Memoire 1*8 Go DDR3 1333 Mhz (1 empl. vide) - DD SSD 256 Go - Carte Mère Gigabyte GA-Z77N-WIFI > Codec ALC892 - late 2012 - AMD HD 6870 - OSX Sierra 10.12.6 + Ubuntu 16.04
MacMini3,1 : 2.0 Ghz core 2 duo "Penryn" - early 2009 - A1283 - RAM : 2* 4 Go DDR3 1333 Mhz - DD 320 Go 5400 rpm - MacOS X 10.11.6 El Capitan
PowerMac7,3 : G5 2 Ghz - early 2005- A1047 - RAM : 2*512 Mo DDR pc3200 400 Mhz (2 empl. vides) - DD 80 Go 7200 rpm - MacOS X 10.5.8 Leopard
--
Au travail
MacPro1,1 : 2x2.66 Ghz Dual Core intel Xeon "Woodcrest" - Mac Pro - mid 2006 - A1186 - MacOS X 10.6.8 Snow Leopard
iMac12,1 : 2,5 Ghz Intel Core i5 "Sandy Bridge"- 21,5 inch - mid 2011 - A1311 - Mac OSX 10.7.5 Lion

Apple, Paye tes impôts !
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 27th April 2024 - 06:12