Forums Développement Multimédia

Aller au contenu

Gérer la vitesse de défilement d'un texte qui s'écrit lettre par lettre

AS3 Flash CODE Actionscript

4 réponses à ce sujet

#1 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 26 April 2013 - 16:44 PM

Bonjour,

Je souhaiterai un coup de main sur un autre de mes projets ... ne trouvant pas de solution qui marche je viens vers vous ^^...

bon voila c'est une sorte d'info bulle avec un petit bonhomme qui parle pour expliquer qqch ...

donc en faite j'ai mon petit bonhomme avec sa bouche (bouche_anim) qui est animée .... et le texte qui s'écrit lettre par lettre à coté ...

quand le texte a fini de s'écrire la bouche arrête de s'animer et redevient un "smile"

Mais maintenant on me demande de calé du son dessus ... le problème c'est que mon texte défile trop vite ... donc : le texte est fini, la bouche du bonhomme s'arrête mais la voix continu ...

l'affiche des lettre se fait par un enter_frame...(seul solution que j'ai réussi à faire marché :roll:/>

Je souhaiterai donc savoir comment créer un delay entre chaque lettre ... pour retarder l'ensemble ... et que le son + le texte + la bouche soient synchro ....

ou une autre solution pour tout synchro

l'idéal serait d'avoir une variable qui me permettrait d'ajuster le timing (car j'ai plusieur info bulle ^^)


Voilà mon code :


//Fonction texte ecrit lettre par lettre \n\n
var texte0 = "Lors de la saisie de vos informations : ..... et il y a le reste de mon texte je vous l'épargne"


var blancs = "           ";
texte0 += blancs;
var longueur = texte0.length;
var n = 0;
/*var slow_timer;*/
bouche_anim.visible=false;



function ecriretxt1( e:Event ):void
{
ecrire();
function ecrire()
{ bouche_anim.visible=true;
bouche_anim.play();
smile.visible=false;
if(n != longueur) {
var texte1 = texte0.substr(0, n)
affichage.text = texte1;
n++;
/*//test ralentissement
slow_timer = setTimeout(slow,5000);
slow();
function slow () {
//nothing
3+6
}*/



}
//lire en boucle
//else {n = 0;}

//A la fin  stop l'anim bouche
else {bouche_anim.stop()
bouche_anim.visible=false;
smile.visible=true;}
}
}
stage.addEventListener(Event.ENTER_FRAME, ecriretxt1 );

 


Pour info j'ai testé setTimeout ... mais ça marche pas ...

Merci d'avance,

Bonne fin de journée

#2 çayjb

    dadaaaa

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2770 messages

Posté 27 April 2013 - 07:35 AM

Salut Gouj,

setTimeout est une bonne solution pour ce que tu veux faire.
Tu as ausi la classe Timer pour remplacer ton ENTER_FRAME :


function ecrire(e:TimerEvent):void
{
         //executé toutes les 5 secondes
         trace(e.currentTarget.currentCount); //incrémenté à chaque déclenchement
}

var timer:Timer = new Timer(5000);
timer.addEventListener(TimerEvent.TIMER, ecrire);
timer.start();
 

Pour ton problème avec setTimeout, et d'autres que tu rencontre peut-être, dur à dire exactement sans voir le test exact que tu as fais, mais ton code est très mal organisé, avec des imbrications de fonctions inutiles par exemple qui me font te conseiller de travailler les bases, mets toi sur des tutos sympa, ça ne manque pas sur mediabox, personnalise les, essaye de comprendre à chaque fois pourquoi comme ça et pas autrement.
Avec une bonne compréhension général des mécanismes de base de l'AS3 tu évitera le plus gros des soucis qui te freinent quand tu code.

Ah et bien sur l'outil indispensable à toujorus avoir ovuert dans un onglet ;) : http://help.adobe.co...pt/3/index.html

#3 Krevare

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 923 messages

Posté 27 April 2013 - 15:43 PM

Hello :)

Sinon tu peux faire une recherche avec les termes "Lip sync" sur google, j'ai trouvé ce genre de choses qui pourraient t'intéresser au moins pour l'anim bouche / son.
Reste à caler l'apparition des lettres dessus :)
http://www.pixelenvi...lash-using-as3/

Bon week end :)

Fred.

#4 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 27 April 2013 - 23:43 PM

Merci beaucoup pour tes conseils çayjb !

le texte est plus lent avec la classe Timer

et Krevare pour ton lien "lipsync"

bonne soirée (et/ou nuit)

#5 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 29 April 2013 - 12:33 PM

Bonjour,

je reviens vers vous car j'ai encore un petit souci :

J'ai ajusté le défilement avec la classe "timer" (une vitesse de 42 milliseconde)

- Quand je test mon anim sur mon flash player de debug (avec ctrl+enter) le défilement est synchro avec la voix ...

- je test donc mon anim sur mon serveur puis sur un ordi avec IE et la c'est, problème, plus synchro ( le texte défile trop lentement ) sur la première lecture, en revanche si je relance la lecture elle est de nouveau synchro...

j'ai l'impression que lors de la première lecture le timer est plus lent ... alors que rien dans mon AS3 ne lui donne cet "ordre".



stop();

zone_karl.removeEventListener(MouseEvent.MOUSE_OVER, fl_MouseOverHandler);


//Fonction texte ecrit lettre par lettre \n\n
var texte0 = "Lors de la saisie de vos informations : \n\nEcrivez en MAJUSCULE, ............."
var blancs = "                  ";
texte0 += blancs;
var longueur = texte0.length;
var n = 0;



bouche_anim.visible=false;
//bouche_anim.play()

var timer:Timer = new Timer(42);

timer.addEventListener(TimerEvent.TIMER, ecriretxt1);
timer.start();



function ecriretxt1( e:TimerEvent):void
        {      
                                        son.play();
                                        bouche_anim.play()
                                        bouche_anim.visible=true;
                                        smile.visible=false;
                                       
                                        if(n != longueur) {
                                                var texte1 = texte0.substr(0, n)
                                                affichage.text = texte1;
                                                n++;
                                       
                                        }
                                        //lire en boucle
                                        //else {n = 0;}
                               
                                        //A la fin  stop l'anim bouche
                                        else {
                                                        bouche_anim.visible=false;
                                                        smile.visible=true;
                                                        son.stop();
                                                       
                                                        bouche_anim.stop();
                                                       
                                                        timer.stop();
                                                        gotoAndStop(1);
                                        }
               
        }
       
       
 



Si vous pouvez m'aider à comprendre d'où proviens ce problème sur la première lecture ...

Merci d'avance



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP