Forums Développement Multimédia

Aller au contenu

Faire attendre une méthode

AS3 Debutant CODE Actionscript

15 réponses à ce sujet

#1 reveurduciel

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 16 January 2013 - 02:39 AM

Bonjour à vous.
Pour fabriquer un dialogue pour un jeu, je me sers d'un tutorial très intéressant que j'ai trouvé sur ce site :
http://active.tutspl...your-next-game/

En gros, l'objet RPGText permet d'afficher un dialogue à l'écran.
Le problème, c'est que si je lance deux dialogue l'un à la suite de l'autre, seulement le deuxième est retenu.

package {
       
        import flash.display.MovieClip;

        public class Main extends MovieClip {
       
                // CONSTRUCTOR
                public function Main() {
                        var textBlocks:Array = new Array(
                                        ["Kid",         "Look, a robot!"],
                                        ["Abe",         "BLEEP-BLOOP. I am an Autonomous Botanical Engineer. You can call me ABE."],
                                        ["Kid",         "Hi Abe. Meet Frosty the Snowman."],
                                        ["Frosty",      "Happy Birthday!"],
                                        ["Abe",         "BEEP-BIP. Hello, Frosty."],
                                        ["Abe",         "Does this frog belong to you?"],
                                        ["Frog",        "Ribbit..."],
                                        ["Kid",         "No I've never seen him before. Aren't you cold frog?"],
                                        ["Frog",        "Ribbit..."]
                                                                           );                                            
                        var textBlocks2:Array = new Array(
                                        ["Kid",         "BOOOOOOO!"]
                        );
                                                                       
                        rpgText.textBlocks = textBlocks;
                        rpgText.startText();
                        rpgText.textBlocks = textBlocks2;
                        rpgText.startText();
                }
               
        }

}

Dans cet exemple, si je lance le programme, seulement le dialogue "Boooo!" apparaitra.

Je cherche donc une façon de pouvoir faire "attendre" la méthode pour que
                        rpgText.textBlocks = textBlocks;
                        rpgText.startText();
                        rpgText.textBlocks = textBlocks2;
                        rpgText.startText();


Affiche d'abord l'ensemble des dialogues du premier bloc de texte, puis ensuite les seconds.

Le package de rpgText est le suivant:

package {
       
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.display.MovieClip;

        import flash.media.Sound;

        public class RPGText extends MovieClip {
               
                private const SPEAKER:int = 0;
                private const TEXT:int = 1;
               
                private var _currentTextBlockIndex:int=0;
                private var _currentTextBlock:String;
                private var _textBlocks:Array;
                private var _typingSound:Sound = new TypingSound();
               
                // CONSTRUCTOR
                public function RPGText() {
               
                }
               
                public function set textBlocks(txt:Array):void {
                        _textBlocks = txt;
                }
               
                public function startText():void {
                        _currentTextBlock = _textBlocks[_currentTextBlockIndex][TEXT];
                        charIcon.gotoAndStop(_textBlocks[_currentTextBlockIndex][SPEAKER]);
                        addEventListener(Event.ENTER_FRAME, updateText);
                        addEventListener(MouseEvent.CLICK, fillText);
                }
               
                private function updateText(e:Event):void {
                        if(txt.text.length < _currentTextBlock.length){
                                txt.text = _currentTextBlock.substr(0, txt.text.length+1);
                                _typingSound.play();
                        } else {
                                removeEventListener(Event.ENTER_FRAME, updateText);
                                fillText();
                        }
                }
               
                private function fillText(e:MouseEvent = null):void {
                        txt.text = _currentTextBlock;
                        if(_currentTextBlockIndex < _textBlocks.length-1){
                                addEventListener(MouseEvent.CLICK, nextTextBlock);
                        }
                }
               
                private function nextTextBlock(e:MouseEvent):void {
                        removeEventListener(MouseEvent.CLICK, nextTextBlock);
                        txt.text = ""; // clear the text
                        _currentTextBlockIndex++;
                        _currentTextBlock = _textBlocks[_currentTextBlockIndex][TEXT]; // set the text
                        charIcon.gotoAndStop(_textBlocks[_currentTextBlockIndex][SPEAKER]); // set the character icon
                        addEventListener(Event.ENTER_FRAME, updateText); // start updating the text
                        addEventListener(MouseEvent.CLICK, fillText);
                }
               
        }

}

J'ai pensé ajouter après cette ligne de code quelque chose du genre :



private function fillText(e:MouseEvent = null):void {
                        txt.text = _currentTextBlock;
                        if(_currentTextBlockIndex < _textBlocks.length-1){
                                addEventListener(MouseEvent.CLICK, nextTextBlock)
else{
finDeDialogue = 1;
}

 

Mais je ne vois pas comment je pourrais arrêter le déroulement normal des choses avec ça.

Un peu d'aide serait grandement apprécié :mrgreen:

Fichier(s) joint(s)

  • Fichier joint  RPGText.fla   294.5 Ko   1 téléchargement(s)
  • Fichier joint  Main.as   631 octets   1 téléchargement(s)
  • Fichier joint  RPGText.as   1.78 Ko   3 téléchargement(s)


#2 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 16 January 2013 - 03:26 AM

Bienvenue sur ce forum,

Tu pourrais peut-être ajouter une méthode à la classe:


// Ajoute des blocs de texte à la suite des blocs existants
public function addTextBlocks(txt:Array):void {
        if (_textBlocks == null) {
                // Si les blocs de texte n'étaient pas encore définis, les initialiser
                _textBlocks = txt;
        } else {
                // Sinon ajouter les nouveaux blocs de texte à la suite des précédents
                _textBlocks = _textBlocks.concat(txt);
        }
}
 

Puis l'utiliser ainsi:

rpgText.textBlocks = textBlocks;
rpgText.addTextBlocks(textBlocks2);
rpgText.startText();
 

Sinon, sans modifier la classe, tu pourrais simplement faire:

rpgText.textBlocks = textBlocks.concat(textBlocks2);
rpgText.startText();


#3 reveurduciel

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 16 January 2013 - 04:00 AM

Bonjour lilive et merci pour ton acceuil :mrgreen:

J'aime beaucoup ton idée mais elle a un petit problème.
En effet j'utilise la fonction pour afficher du texte dans le cadre de dialogue de mon jeu, et entre chaque dialogue il peut y avoir un choix de l'utilisateur, de la musique et des sons, une animation.

Par exemple, imaginons quelque chose du genre:

var textBlocks:Array = new Array(['Reveur','Attention une bombe'],['Lilive','Où ça ?'])
var textBlocks2:Array = new Array(['Reveur','Cette Bombe là'])

rpgText.textBlocks = textBlocks;
rpgText.startText();
bruitdebome.play();
ecran,vibrer();
bombeanimation.visible = true ;
rpgText.textBlocks = textBlocks2;
rpgText.startText();

Avec cet exemple, grâce à ton aide effectivement, je vais garder et afficher l'ensemble des dialogues, mais la musique et les animations vont débuter dès que j'aurai afficher le premier mot, et non entre les deux dialogues :cry:

#4 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 16 January 2013 - 04:03 AM

J'ai regardé la classe d'un peu plus près et j'ai vu une faiblesse, qu'on met en évidence en ajoutant deux trace en début des fonctions:
private function fillText(e:MouseEvent = null):void {
        trace("fillText");
et
private function nextTextBlock(e:MouseEvent):void {
        trace("nextTextBlock");
On s'aperçoit alors qu'il arrive que fillText soit appelé 2 fois de suite, quand on clique, alors que normalement les appels de fillText devraient s'alterner avec les appels de nextTextBlock.
Cela n'a pas l'air de faire disfonctionner la classe, mais c'est plutôt un coup de chance je crois.

Version avec trace, pour mettre en évidence le bug:
Fichier joint  RPGText.as   1.83 Ko   0 téléchargement(s)

Voici un correctif, ainsi que la fonction que j'ai ajoutée, et l'exemple d'utilisation:
Fichier joint  RPGText.as   2.26 Ko   0 téléchargement(s)
Fichier joint  Main.as   608 octets   0 téléchargement(s)


[edit] Je vois que nos posts se croisent. Je me penche là-dessus.

#5 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 04:10 AM

Sur le même site il y'a un tuto sur le Command Pattern c'est vachement interessant dans ce cas d'avoir ce genre de jeux de classes sous la main.

#6 reveurduciel

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 16 January 2013 - 04:21 AM

Je vais aller voir le tuto :)
Et je regarde les traces aussi ^^

Je pense que le problème vient du fait qu'à partir du moment où toute les instructions de la méthode ne peuvent avancer que grâce aux événements, la méthode elle même n'a plus rien à faire, elle s'ennuie et passe à l'instructions suivante.

En effet, si on regarde comment l'auteur a fait, dès le début:

         public function startText():void {
                        _currentTextBlock = _textBlocks[_currentTextBlockIndex][TEXT];
                        charIcon.gotoAndStop(_textBlocks[_currentTextBlockIndex][SPEAKER]);
                        addEventListener(Event.ENTER_FRAME, updateText);
                        addEventListener(MouseEvent.CLICK, fillText);
                }
Il n'y a plus d'instruction. Si je remplacais

addEventListener(Event.ENTER_FRAME, updateText);

par

updateText();

Déjà là, ça donne une instructions au programme de continuer sur sa lancée au lieu de passer aux prochaines instructions. Ce que j'aimais par contre dans l'objet c'était:

         private function fillText(e:MouseEvent = null):void {
                        txt.text = _currentTextBlock;
                        if(_currentTextBlockIndex < _textBlocks.length-1){
                                addEventListener(MouseEvent.CLICK, nextTextBlock);
                        }
                }

ça obligeait l'attente d'un clic pour continuer, utile pour les lecteurs plus lent qui pouvaient prendre leur temps.



Edit: Hum... la substitution ne fonctionne pas bien, je fais d'autre test :(

Modifié par Krevare, 16 January 2013 - 12:18 PM.
Ajout des balises de codes


#7 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 16 January 2013 - 04:45 AM

Voir le messagereveurduciel, le 16 January 2013 - 04:00 AM, dit :

var textBlocks:Array = new Array(['Reveur','Attention une bombe'],['Lilive','Où ça ?'])
var textBlocks2:Array = new Array(['Reveur','Cette Bombe là'])
Héhé ;)

Voir le messagereveurduciel, le 16 January 2013 - 04:00 AM, dit :

Avec cet exemple, grâce à ton aide effectivement, je vais garder et afficher l'ensemble des dialogues, mais la musique et les animations vont débuter dès que j'aurai afficher le premier mot, et non entre les deux dialogues :cry:
Le problème de gestion des enchainements ne va pas se poser que pour les textes. Dans ton exemple, tu peux avoir envie d'attendre que ecran.vibrer() soit terminé avant de lancer l'affichage du 2e dialogue.
Tu vas devoir choisir une façon de t'organiser pour pouvoir lancer les animations les unes après les autres.

Je connais deux solutions de base. La première est de créer des évènements personnalisés, de façon à pouvoir coder:
   rpgText.textBlocks = textBlocks;
        rpgText.addEventListener(GameEvent.DIALOG_END, apresLeDialogue1);
        rpgText.startText();
       
}

private function apresLeDialogue1(e:GameEvent):void {
        rpgText.removeEventListener(GameEvent.DIALOG_END, apresLeDialogue1);
        // Ici la suite du déroulement du jeu                 
        // ...
        // ...
        // ...
}
Il faut coder un événement personnalisé GameEvent.DIALOG_END pour que ça marche, et que cet évènement soit diffusé quand le texte a fini de s'afficher:
private function fillText(e:MouseEvent = null):void {
        removeEventListener(MouseEvent.CLICK, fillText);
        removeEventListener(Event.ENTER_FRAME, updateText);
        txt.text = _currentTextBlock;
        if(_currentTextBlockIndex < _textBlocks.length-1){
                addEventListener(MouseEvent.CLICK, nextTextBlock);
        } else {
         // Si la dernière réplique a été affichée, diffuser l'évènement
         dispatchEvent(new GameEvent(GameEvent.DIALOG_END));
        }
}
Tu trouveras pleins d'exemples et de tutos sur le sujet des événements personalisés.


La deuxième façon de faire et d'utiliser ce qu'on appelle des callback. Exemple d'utilisation:
        rpgText.textBlocks = textBlocks;
        rpgText.onComplete = apresLeDialogue1;
        rpgText.startText();
}

private function apresLeDialogue1():void {
        // Ici la suite du déroulement du jeu                 
        // ...
}
Là aussi il faut modifier la classe pour lui ajouter une propriété onComplete à qui on affecte la fonction qui doit être appelée quand le dialogue est terminé.
Pour ça aussi tu trouveras des exemples sur le net. L'approche par évènement à il me semble plus la côte que les callback chez les développeurs.

Tu vas peut-être devoir penser à ceci pour d'autres éléments de ton jeu, et pas que la classe en question. Je ne sais pas ce dont parle Goabonga, mais j'imagine que c'est justement un façon standard de s'y prendre pour gérer le déroulement dans un jeu ou une application quelconque, moins basique que les évènements persos et les callback. Tu aurais le lien exact goabonga? Je ne l'ai pas trouvé.

Bref, c'est un vaste sujet, et selon ton expérience tu pourrais trouver cela un peu ardu. Le site où tu as trouvé ce tutoriel m'a l'air très bien, mais concernant cette classe, comme il le dit lui-même en conclusion, il reste plein de choses à faire pour pouvoir l'utiliser dans un jeu. Par exemple:
- pouvoir faire apparaitre et disparaitre la zone de dialogue
- pouvoir lancer un nouveau dialoque
- et donc avoir la possibilité d'être informé de la fin du dialogue, c'est ce que tu cherches justement à trouver.

#8 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7008 messages

Posté 16 January 2013 - 11:04 AM

Salut,

Personnellement, je passerai par une classe "EventManager" qui se chargerai de lancer des actions en fonction d'un tableau regroupant des séquences d'événements. Chaque action lancée par le manager possède un événement perso déclenché à la fin de l'action (c'est ce que préconise Lilive), le manager attend d'avoir le signal de la fin de l'action avant de passer à la suivante.

En procédural, c'est un peu ce que j'ai mis en place dans l'exercice du Blackjack ici : http://forums.mediab...ice_-_blackjack

Grossièrement voilà la construction :
// Premier tour de jeu
function donner(e:MouseEvent):void{
        tour.push("donne banque");
        tour.push("donne joueur");
        tour.push("donne banque");
        tour.push("donne joueur");
        tour.push("stoppe donne");
        lanceTour();
}

// commencer le tour
function lanceTour():void{
        temps = new Timer(500);
        temps.addEventListener(TimerEvent.TIMER, actions);
        temps.start();
}

// Gestion du tour
function actions(e:TimerEvent):void{
        var action:String = tour.shift();
        if (action == "donne banque")   donne("banque");
        if (action == "donne joueur")   donne("joueur");
        if (action == "montre carte")   montreCarte();
        if (action == "banque joue")     banqueJoue();
        if (action == "stoppe donne")   joueurJoue();
}

La mécanique est la suivante :

Quand j'en ai besoin je pousse une séquence de "tâches" dans un tableau "tour".
Ici par exemple la fonction "donner" se charge de créer le premier tour de jeu.

J'utilise un timer pour cadencer les "tâches" à mener.
Mais on peut remplacer ça par le déclenchement d'un événement perso par exemple "fin de la tâche".

La fonction "actions" est en fait le manager.
Il regarde les "tâches" à mener dans le tableau (appelons le "planning"), dans l'ordre.
Il prend en compte uniquement la première "tâche" placée dans le "planning".
Selon la "tâche" à lancer, il déclenche la fonction correspondante et la retire en même temps du "planning".
Puis attend une instruction (ici le passage du timer) pour lancer la suivante.

Il te faut donc, comme le dit Lilive, un événement perso déclenché à la fin de tes "tâches".
C'est lui qui signale au manager qu'il doit lancer la "tâche" suivante.

Pour gérer une séquence il te suffit donc de remplir le "planning".

Avec des classes, cela donnerai une classe "manager" qui gère un "planning".
Et un événement perso dans chaque type de "tâche" à accomplir, qui signale que l'action est terminée.
Quand une "tâche" est terminée, le "manager" est prévenu et regarde le "planning".
Si il reste des "tâches" dans le "planning" il passe à la "tâche" suivante.
Si le "planning" est vide il ne fait rien et peut éventuellement le signaler, par exemple pour relancer la phase de jeu.

Le "manager" peut aussi bien gérer l'enchaînement d'un dialogue (texte1, texte2, texte3,...), que l'enchaînement d'une série de "tâches" (dialogues, anim, dialogue, son, dialogue, anim, ...), tout dépend de ce que tu lui passe dans le "planning".

Les "tâches" peuvent s'enchaîner toutes seules via un événement perso remonté en fin de "tâche", ou via une action du joueur comme un clic sur un bouton, le tout c'est que le "manager" soit prévenu.

Je me trompe peut-être mais c'est là dessus que je serais parti, si ça peut aider.... welcome ;-)

#9 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 12:34 PM

Non tu ne te trompes pas :)
Mais regardes ce code :

package {
import flash.display.Sprite;
import flash.events.Event;
public class App extends Sprite {
  public function App() {
   var data : Array = ['blablabl 1', 'blablabl 2', 'blablabl 3', 'blablabl 4'];
   var serial:Command = new SerialCommand(
        new TraceCommand(data[0]),
        new WaitCommand(1000),
        new TraceCommand(data[1]),
        new WaitCommand(1000),
        new TraceCommand(data[2]),
        new WaitCommand(1000),
        new TraceCommand(data[3]),
        new WaitCommand(1000)
   );
   serial.addEventListener(Event.COMPLETE, handleCommandComplete);
   serial.exec();
 
  }
  private function handleCommandComplete(event : Event) : void {
   trace(this,'handleCommandComplete',event);
  }
}
}
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.TimerEvent;
import flash.utils.Timer;
class Command extends EventDispatcher {
public function exec() : void {
  trace(this, 'exec');
}
final protected function complete() : void {
  dispatchEvent(new Event(Event.COMPLETE));
}
}
class TraceCommand extends Command {
private var _data : Array;
public function TraceCommand(...data) : void {
  _data = data;
}
override public function exec() : void {
  super.exec();
  trace.apply(this, _data);
  complete();
}
}
class SerialCommand extends Command {
private var _commands : Array;
public function SerialCommand(...commands) : void {
  _commands = commands;
}
override public function exec() : void {
  super.exec();
  if (_commands.length > 0) {
   (_commands[0] as Command).addEventListener(Event.COMPLETE, handleCommandComplete);
   (_commands[0] as Command).exec();
  } else {
   complete();
  }
}
protected function handleCommandComplete(event : Event) : void {
  (_commands[0] as Command).removeEventListener(Event.COMPLETE, handleCommandComplete);
  _commands.shift();
  exec();
}
}
class WaitCommand extends Command {
private var _delay : int = 0;
private var _timer : Timer;
public function WaitCommand(delay : int) : void {
  _delay = delay;
}
override public function exec() : void {
  super.exec();
  _timer = new Timer(_delay);
  _timer.addEventListener(TimerEvent.TIMER, handleTimerComplete);
  _timer.start();
}
protected function handleTimerComplete(event : TimerEvent) : void {
  _timer.stop();
  _timer.addEventListener(TimerEvent.TIMER, handleTimerComplete);
  _timer = null;
  complete();
}
}
 


C'est hyper pratique, non ?

#10 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 16 January 2013 - 13:04 PM

protected function handleTimerComplete(event : TimerEvent) : void {
  _timer.stop();
  _timer.addEventListener(TimerEvent.TIMER, handleTimerComplete); // <<<<<<<<<< ici ?
  _timer = null;
  complete();
}
Si j'ai bien suivi, plutôt un removeEventListener qu'un addEventListener dans cette dernière fonction ?
Sinon, c'est que j'ai tout raté…
:D Et ça se pourrait bien.


Spoiler


#11 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 14:03 PM

merci pour la correction :) ( il me faudrait un dldler-debug sur mon éditeur ).
Bon dans un cas comme celui la on ne voit pas forcement l'utilité du truc, mais c'est vraiment pratique.

#12 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 16 January 2013 - 14:18 PM

Par contre, je vois bien l'utilité du truc pour un vieux projet sur lequel j'avais suivi dada…
http://forums.mediab...imations-flash/
(Faudrait que je m'y replonge, j'ai fait un peu de progrès depuis…)

#13 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 16 January 2013 - 14:26 PM

Ouai, à l'epoque j'avais penser mixer le fluent avec les commands ce qui pourrait être bien pratique (mais les fluent c'est galère à maintenir).

( Faudrait s'organiser un projet, et faire de Lilive notre Evangile )

#14 reveurduciel

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 17 January 2013 - 04:19 AM

Wow, beaucoup de réponse, je vais lire vos réponses attentivement sur les deux sujets et tenter de proposer une version modifiée :mrgreen:

#15 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 17 January 2013 - 05:44 AM

heu pour le fun ;)


package {
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
public class App extends Sprite {
  public function App() {
   if (stage) init();
   else addEventListener(Event.ADDED_TO_STAGE, init);
  }
  protected function init(event : Event = null) : void {
   if (event) removeEventListener(Event.ADDED_TO_STAGE, init);
   stage.scaleMode = StageScaleMode.NO_SCALE;
   stage.align = StageAlign.TOP_LEFT;
   var data : Array = [// chapitre
   [["Kid", "Look, a robot!"], ["Abe", "BLEEP-BLOOP. I am an Autonomous Botanical Engineer. You can call me ABE."], ["Kid", "Hi Abe. Meet Frosty the Snowman."], ["Frosty", "Happy Birthday!"], ["Abe", "BEEP-BIP. Hello, Frosty."], ["Abe", "Does this frog belong to you?"], ["Frog", "Ribbit..."], ["Kid", "No I've never seen him before. Aren't you cold frog?"], ["Frog", "Ribbit..."]],
   // chapitre
   [["Kid", "Look, a robot!"], ["Abe", "BLEEP-BLOOP. I am an Autonomous Botanical Engineer. You can call me ABE."], ["Kid", "Hi Abe. Meet Frosty the Snowman."], ["Frosty", "Happy Birthday!"], ["Abe", "BEEP-BIP. Hello, Frosty."], ["Abe", "Does this frog belong to you?"], ["Frog", "Ribbit..."], ["Kid", "No I've never seen him before. Aren't you cold frog?"], ["Frog", "Ribbit..."]]];
   var textfield : TextField = new TextField();
   textfield.autoSize = TextFieldAutoSize.CENTER;
   textfield.multiline = true;
   textfield.defaultTextFormat = new TextFormat('Verdana', 9);
   textfield.x = stage.stageWidth * .5;
   textfield.y = stage.stageHeight * .5;
   var commands : Array = [];
   // on ajoute le textfield sur la scene
   commands.push(new AddChildCommand(this, textfield));
   commands.push(new SetTextCommand(textfield, 'GOABONGA'));
   commands.push(new WaitCommand(3000));
   commands.push(new SetTextCommand(textfield, ''));
   commands.push(new WaitCommand(1000));
   for (var i : int = 100; i > 0;i--) {
    commands.push(new SetTextCommand(textfield, String(i)));
    commands.push(new WaitCommand(30));
   }
   commands.push(new WaitCommand(1000));
   for (var c : int = 0 ; c < data.length ; c++) {
    // chapitre
    for (var p : int = 0 ; p < (data[c] as Array).length ; p++) {
         // phrase
         commands.push(new SetTextCommand(textfield, data[c][p][0]+' :: '+data[c][p][1]));
         commands.push(new WaitCommand(2000));
         commands.push(new SetTextCommand(textfield, ''));
    }
   }
   new SerialCommand(commands).exec();
  }
}
}
 

j'aime bien le concept :)



- Afficher le SWF -
Fichier joint  App.swf   3.28 Ko   7 téléchargement(s)

Fichier joint  commands.zip   10.56 Ko   1 téléchargement(s)

#16 reveurduciel

    Ceinture Blanche

  • Members
  • Pip
  • 7 messages

Posté 18 January 2013 - 15:56 PM

Un petit message pour vous dire que je suis encore très pris au travail aujourd'hui, mais que j'apprécie énormément votre aide. Demain samedi je vais tout lire à tête reposée et qui sait, peut-être vous montrer un petit démo :)



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