IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

Détecter la fin d'un swf


Sujet :

ActionScript 3

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut Détecter la fin d'un swf
    Bonjour,

    je bloque complètement, existe t'il une manière de détecter la fin d'un swf. Je m'explique : J'ai un doc maître qui charge des swf externes. Lorsque le swf chargé à fini son anim, j'aimerai que ça passe automatiquement au suivant. Mais comment faire comprendre au doc maître que le swf a terminé? Je précise que mes swf sont pour la plupart avec 1 image clé, car j'ai vu le addFrameScript, mais dans mon cas ça n'irait pas. Je cherche dans l'aide ou sur les forums mais je ne trouve pas de réponse. Faut il mettre une variable dans les swf qui serait détectée je ne sais trop comment par le doc maître ? Ou il y a t'il une manip spéciale ?

    Merci pour votre aide

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut Salut
    Je cherche à faire la même chose. et pour ce faire je propage un événement personnalisé (en bubble true) depuis le swf chargé.
    toutefois je bloque à l'étape d'après, à savoir unloadé ce swf ... je m'explique :
    Je prend soin de caster le content du loader en movie clip afin de le contrôler depuis le swf principal.

    Pourtant j'ai un problème au moment de ou je veux faire un unload(), la sortie me renvoie :
    ArgumentError: Error #2025: Le DisplayObject indiqué doit être un enfant de l'appelant.
    at flash.display::Loader/unload()
    at Loader_fla::MainTimeline/testFunc()

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
    var conteneurImage:Loader = new Loader();// création du conteneur de l'image ou du swf
    var image:URLRequest = new URLRequest("Introduction.swf");// url de l'image ou du swf à charger
    var myTimer:Timer = new Timer( 1, 1190/4 ); //création d'un Timer
    var externalMovie:MovieClip=new MovieClip(); // création d'un movie clip dans lequel on peut caster le DisplayObject chargé par le Loader
     
    conteneurImage.load(image);// chargement de l'image ou du swf dans le conteneur
     
    conteneurImage.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
    conteneurImage.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
    myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, playIntro);
    myTimer.addEventListener( TimerEvent.TIMER, onX );
     
     
     
     
     
    function onProgress(e:ProgressEvent):void {
      var loaded:Number = e.bytesLoaded / e.bytesTotal;
      var percent:int = loaded * 100;
      loadingText.text =  percent + "%";
      bar.scaleX = loaded;
    }
     
    function onComplete(event:Event):void {
     
      	myTimer.start();
     	externalMovie = MovieClip(conteneurImage.content); // cast 'DisplayObject' to 'MovieClip'
        addChild(externalMovie); // add your swf directly to the stage
        externalMovie.x = -1190; 
     
    	conteneurImage.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
    	conteneurImage.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
     
    }
     
    /*Fonction pour faire glisser le swf loadé depuis la gauche de l'écran*/
    function onX (pEvt:TimerEvent ):void
    {
    	externalMovie.x += 4; //x augmente
    }
     
    /*Lancement de la lecture du swf Loadé*/
    function playIntro(Evt:TimerEvent):void{
    	externalMovie.gotoAndPlay(2);
    	bar.scaleX=0;
    	boutBar.scaleX=0;
    	loadingText.scaleX=0;
    	this.chargeTXT.scaleX=0;
    }
     
     
     
    /*Test pour vider le Loader*/
    testClip.addEventListener(MouseEvent.CLICK,testFunc);
    function testFunc( evt : MouseEvent){
     
    	removeChild(externalMovie); 
    	externalMovie =new MovieClip();
    	conteneurImage.unload();
     
    }
    Là ou ça coince, c'est à la fin, quand je clique sur un bouton qui doit me retirer l'occurence du swf enfant (casté) ainsi que me purger l'objet loader (conteneurImage ici)...

    Je vous remercie d'avance pour toutes les esquisses de solutions que vous pourriez me suggérer ...


    Alors j'ai trouvé une solution à mon problème. Il s'agit enf ait d'effectuer le unload au moment opportun, à savoir juste après casté le swf chargé dans un movieclip, et surtout avant l'affichage d'un child dudit movieclip... Why ? Je ne sais pas ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    Sur mon doc j'ai un bouton stop qui lorsque je clique dessus me fait un unload sur mon chargeur et je n'ai pas de problèmes.

    Sinon, comment fait on pour communiquer avec un swf chargé ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Pour communiquer entre la scène et les swf chargé (avec des goto par exemple), il faut que ceux ci soit bien casté comme des movieclip après avoir été loadé sur la scène.
    Pour détecter la fin de mon swf chargé, j'ai mis sur la dernière frame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import MonEvt ;
    var e:MonEvt = new MonEvt( MonEvt.EVENE ) ;
    this.dispatchEvent(e);
    MonEvt est un évènement quelconque que je déclare dans un fichier as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package{
     
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.display.Sprite;
     
    public class MonEvt extends Event
    {
    	// ----o Constructor
     
    	public function MonEvt(type:String, bubbles:Boolean=true, cancelable:Boolean=false){
    		super(type, bubbles, cancelable) ;
    	}
     
    	// ----o Constants
     
    	static public const EVENE:String = "evene" ;
     
    	// ----o Public Methods
     
    }
    }
    Comme ça avec un écouter de MonEvt.EVENE sur la scène principale, je sais quand je suis arrivé à la dernière frame du swf chargé.

    Peux tu peut-être mettre le code de ta scène qui charge tes swf ? Ca m'intéresse de voir comment faire le unload depuis un bouton (stt au niveau du timing).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    je vais essayer ce que tu proposes, le problème c'est que mes swf sont en général en 1 image clé. Les affichages des clips gérés par as et avec des timer. De plus je n'ai pas fait de fichier as externe.

    Sinon je te mets le code (les developpeurs pro de flash vont devenir blanc !!!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    stop();
     
    var largeur:uint = stage.stageWidth;
    var hauteur:uint = stage.stageHeight;
     
    var chargeur:Loader = new Loader();
    var scenesSwf:Array = ["sceneTitre.swf","scene1.swf","scene2_3.swf","scene4.swf", "scene5.swf", "scene6.swf","sceneFin.swf"];
    var index:int = 0;
     
    var externalMovie:MovieClip = new MovieClip();
    externalMovie = MovieClip(chargeur.content);
     
    chargeur.scaleX = 0.75;
    chargeur.scaleY = 0.75;
     
    chargeur.x = 35;
    chargeur.y = 12.5;
     
    function sceneSuivante():void {
    	if (index<scenesSwf.length) {
    		chargeur.load( new URLRequest(scenesSwf[index]) );
    		addChild(chargeur);
    		index++;
    	}
    }
     
    sceneSuivante();
     
    var ombre:DropShadowFilter = new DropShadowFilter(4.0, 45, 0x000000, 0.3, 5, 5, 1, 1);
    var filtres:Array = [ombre];
     
    var signature:SignatureClp = new SignatureClp();
    signature.x = 620;
    signature.y = 467.5;
    signature.filters = filtres;
     
    var player:PlayerClp = new PlayerClp();
    player.x = 35;
    player.y = 462.5;
     
    addChild(player);
    addChild(signature);
     
    Player();
     
    function Player():void {
    	//===================================LECTURE====================================//
    	player.Lecture.addEventListener(MouseEvent.CLICK, auCliqueLecture);
    	function auCliqueLecture(event:MouseEvent):void {
    		//chargeur.load( new URLRequest(scenesSwf[index]) );
    		//addChild(chargeur);
    		sceneSuivante();
     
    	}
    	//===================================ARRET====================================//
    	player.Arret.addEventListener(MouseEvent.CLICK, auCliqueArret);
    	function auCliqueArret(event:MouseEvent):void {
    		chargeur.unload();
    		//removeChild(chargeur);
    		index = 0;
    	}
    	//===================================RETOUR====================================//
    	player.Retour.addEventListener(MouseEvent.CLICK, auCliqueRetour);
    	function auCliqueRetour(event:MouseEvent):void {
    		index-=2;
    		sceneSuivante();
    		//removeTempsSwicth();
    		trace(index);
    	}
    	//===================================AVANCE====================================//
    	player.Avance.addEventListener(MouseEvent.CLICK, auCliqueAvance);
    	function auCliqueAvance(event:MouseEvent):void {
    		sceneSuivante();
    		trace(index);
    		//removeTempsSwicth();
    	}
    }
    Merci pour ton aide, car je me galère vraiment. Pourtant c'est simple je veux faire un player sauf qu'au lieu que ce soit de la musique ce sont des swf !!!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    Super merci, ça fonctionne, j'étais vraiment bloqué !!

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Comment as tu fait pour te débloquer alors ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    Du coup j'ai créé un fichier .as externe qui contient la déclaration de l'évènement MonEvt. qui reprend ce que tu m'avais conseillé dans le message précédent.

    Ensuite sur chaque swf j'importe :
    puis en fonction de la structure soit avec un Timer, soit à la dernière image clé du clip qui termine (lorsqu'il y a interpolation) ou du scénario :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var e:MonEvt = new MonEvt( MonEvt.EVENE ) ;
    this.dispatchEvent(e);

    Enfin dans mon document main.swf j'écoute l'évènement avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    addEventListener(MonEvt.EVENE, changeScene);
     
    function changeScene(event:Event):void{
    	sceneSuivante();
    }
    qui appelle la fonction sceneSuivante() (voir plus haut)
    Du coup ça passe automatiquement à la prochaine.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/12/2005, 21h21
  2. [BufferedInputStream] Détecter la fin du stream
    Par pmartin8 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 02/06/2005, 15h57
  3. [Servlet] Comment détecter la fin d'une session HTTP
    Par cocula dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/04/2005, 17h27
  4. [Réseau] détecter la fin de lecture dans un flux entrant
    Par al85 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 30/03/2005, 21h06
  5. [TMediaPlayer] Détecter la fin de lecture
    Par ysr1 dans le forum C++Builder
    Réponses: 1
    Dernier message: 30/09/2004, 18h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo