SetInterval() pour diaporama qui ne lance l'action qu'une seule fois :(

Résolu
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 - 5 avril 2010 à 23:32
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 - 7 avril 2010 à 23:56
Bonsoir tout le monde,

je suis en train d'arriver au bout de la réalisation de mon diaporama perso, et il me reste un point à terminer : le mode "SlideShow" qui permet, en appuyant sur play, d'afficher les images les unes après les autres toutes les x secondes.
J'utilise donc un "setInterval" pour gérer cela, problème : mon setInterval ne lance l'affichage que d'une seule image, et les autres images ne suivent pas.
J'ai regardé du côté de la doc et je ne vois pas réellement où peut être mon erreur.

Voici mon code :
function SlideShow(){
removeMovieClip("monClip");
var clip:MovieClip = this._root.attachMovie("IDrebours","rebours",getNextHighestDepth()+1,{_x:904.9,_y:626.8});
var clip:MovieClip = this._root.attachMovie("IDmonClip","monClip",getNextHighestDepth()+1,{_x:600,_y:328.5});
function loadBitmapSmoothed(url:String, cible:MovieClip) { 
var bmc:MovieClip = cible.createEmptyMovieClip("bmc", cible.getNextHighestDepth()); 

var listener:Object = new Object();

listener.tmc = cible;

listener.onLoadProgress = function(mc:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void{
var pourcentage:Number = bytesLoaded/bytesTotal*100;
if(pourcentage<100){
_root.clipRoue._visible = true;
}
if(pourcentage == 100){
_root.clipRoue._visible = false;
Wash.start();
new Tween(monClip, "_alpha", Elastic.easeOut, 0, 100, 20, true);
mx.transitions.TransitionManager.start(monClip, {type:mx.transitions.Squeeze, direction:mx.transitions.Transition.IN, duration:1, easing:mx.transitions.easing.Bounce.easeOut});
}
}

listener.onLoadInit = function(mc:MovieClip){
mc._visible = false;
_root.monClip.clip2._x = _root.monClip.clip2._x-mc._width/2;
_root.monClip.clip2._y = _root.monClip.clip2._y-mc._height/2;
ZoomCalcul = new Array();
zoomTaux.text = "";

bitmap.dispose();
bitmap = new BitmapData(mc._width, mc._height, true);

this.tmc.attachBitmap(bitmap, this.tmc.getNextHighestDepth(),"auto",true); 
bitmap.draw(mc);
}	

var loader:MovieClipLoader = new MovieClipLoader(); 
loader.addListener(listener); 
loader.loadClip(url, bmc);
}
if(Pos == visuels_noms.length){
Pos = -1;
loadBitmapSmoothed(folder + visuels_noms[i, Pos+1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos+1];
Pos = Pos+1;
}else if(Pos !== visuels_noms.length){
loadBitmapSmoothed(folder + visuels_noms[i, Pos+1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos+1];
Pos = Pos+1;
}
if(rebours.compteur.text == 0){
removeMovieClip("rebours");
}
}

clipMenu.btn_play.onRelease = function(){
Diap = setInterval(SlideShow(), 6000);
}

clipMenu.btn_pause.onRelease = function(){
clearInterval(Diap);
removeMovieClip("rebours");
}


Si vous avez des suggestions je suis preneur :)

Merci,

BBFUNK01

6 réponses

BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
7 avril 2010 à 23:56
Hello,

bon et bien après avoir testé tout et n'importe quoi dans tous les sens j'ai enfin réussi à faire fonctionner le mode "SlideShow", je serai incapable d'expliquer pourquoi ça marche de cette manière car en fait j'ai dispatché le contenu initial de ma fonction "SlideShow()" en 2 autres fonctions que j'ai ensuite réintégré dans la fonction "SlideShow()"... il y a certainement une explication (...logique?), mais j'ai la flemme de la chercher :). En tout cas ça marche :
function Diaporama(){
function loadBitmapSmoothed(url:String, cible:MovieClip){ 
var bmc:MovieClip = cible.createEmptyMovieClip("bmc", cible.getNextHighestDepth());
trace("bmc");

var listener:Object = new Object();
trace("listener");

listener.tmc = cible;

listener.onLoadProgress = function(mc:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void{
var pourcentage:Number = bytesLoaded/bytesTotal*100;
if(pourcentage<100){
_root.clipRoue._visible = true;
}
if(pourcentage == 100){
trace("chargement");
_root.clipRoue._visible = false;
Wash.start();
new Tween(monClip, "_alpha", Elastic.easeOut, 0, 100, 20, true);
mx.transitions.TransitionManager.start(monClip, {type:mx.transitions.Squeeze, direction:mx.transitions.Transition.IN, duration:1, easing:mx.transitions.easing.Bounce.easeOut});
}
}

listener.onLoadInit = function(mc:MovieClip){
trace("init");
mc._visible = false;
_root.monClip.clip2._x = _root.monClip.clip2._x-mc._width/2;
_root.monClip.clip2._y = _root.monClip.clip2._y-mc._height/2;
ZoomCalcul = new Array();
zoomTaux.text = "";

bitmap.dispose();
bitmap = new BitmapData(mc._width, mc._height, true);

this.tmc.attachBitmap(bitmap, this.tmc.getNextHighestDepth(),"auto",true); 
bitmap.draw(mc);
trace("draw");
}	

var loader:MovieClipLoader = new MovieClipLoader(); 
loader.addListener(listener); 
loader.loadClip(url, bmc);
}
if(Pos == visuels_noms.length-1){
Pos = -1;
loadBitmapSmoothed(folder + visuels_noms[i, Pos+1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos+1];
trace(Pos);
Pos = Pos+1;
trace(Pos);
}else if(Pos !== visuels_noms.length){
loadBitmapSmoothed(folder + visuels_noms[i, Pos+1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos+1];
Pos = Pos+1;
trace(Pos);
}
}

function SlideShow(){
Nettoyer();
Diaporama();
}


clipMenu.btn_play.onRelease = function(){
Diap = setInterval(SlideShow, 6000);
clipMenu.btn_pause._visible = true;
clipMenu.btn_pause.enabled = true;
clipMenu.btn_play._visible = false;
clipMenu.btn_play.enabled = false;
}


BBFUNK01
3
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
6 avril 2010 à 14:19
Hello,
Diap = setInterval(SlideShow, 6000);


A+

-- Orange73 --

"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
6 avril 2010 à 21:54
Salut Orange73, merci pour ta réponse : effectivement ça fonctionne ainsi :
Diap = setInterval(SlideShow, 6000);

le seule souci c'est que les images ne se loadent pas, probablement parce qu'il faut que je réinitialise les variables des positions dans le xml, donc j'y travaille.

Sinonn si jamais t'as une idée pour ce problème-ci (problème bizarre d'ailleurs...);
j'ai également dans mon diaporama des commandes "précédent" et "suivant", pour gérer la boucle lorsque par exemple on clique sur "précédent" et que l'on est sur la 1ère image du xml, j'indique donc qu'il faut passer à la dernière image stockée dans le xml, comme ceci :
clipMenu.btn_prec.onRelease = function(){
clearInterval(Diap);
removeMovieClip("rebours");
removeMovieClip("contact");
removeMovieClip("informations");
clipMenu.btn_play._visible = true;
clipMenu.btn_play.enabled = true;
clipMenu.btn_pause._visible = false;
clipMenu.btn_pause.enabled = false;
if(Pos == 0){
Pos = visuels_noms.length;
}
removeMovieClip("monClip");
var clip:MovieClip = this._root.attachMovie("IDmonClip","monClip",getNextHighestDepth()+1,{_x:600,_y:328.5});
function loadBitmapSmoothed(url:String, cible:MovieClip) { 
var bmc:MovieClip = cible.createEmptyMovieClip("bmc", cible.getNextHighestDepth()); 

var listener:Object = new Object();

listener.tmc = cible;

listener.onLoadProgress = function(mc:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void{
var pourcentage:Number = bytesLoaded/bytesTotal*100;
if(pourcentage<100){
_root.clipRoue._visible = true;
}
if(pourcentage == 100){
_root.clipRoue._visible = false;
Wash.start();
new Tween(monClip, "_alpha", Elastic.easeOut, 0, 100, 20, true);
mx.transitions.TransitionManager.start(monClip, {type:mx.transitions.Squeeze, direction:mx.transitions.Transition.IN, duration:1, easing:mx.transitions.easing.Bounce.easeOut});
}
}

listener.onLoadInit = function(mc:MovieClip){
mc._visible = false;
_root.monClip.clip2._x = _root.monClip.clip2._x-mc._width/2;
_root.monClip.clip2._y = _root.monClip.clip2._y-mc._height/2;
ZoomCalcul = new Array();
zoomTaux.text = "";

bitmap.dispose();
bitmap = new BitmapData(mc._width, mc._height, true);

this.tmc.attachBitmap(bitmap, this.tmc.getNextHighestDepth(),"auto",true); 
bitmap.draw(mc);
}	

var loader:MovieClipLoader = new MovieClipLoader(); 
loader.addListener(listener); 
loader.loadClip(url, bmc);
}
loadBitmapSmoothed(folder + visuels_noms[i, Pos-1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos-1];
Pos = Pos-1;
}

... et ça marche nickel :)

J'ai donc fait l'inverse sur le bouton "suivant" :
clipMenu.btn_suiv.onRelease = function(){
clearInterval(Diap);
removeMovieClip("rebours");
removeMovieClip("contact");
removeMovieClip("informations");
clipMenu.btn_play._visible = true;
clipMenu.btn_play.enabled = true;
clipMenu.btn_pause._visible = false;
clipMenu.btn_pause.enabled = false;
removeMovieClip("monClip");
var clip:MovieClip = this._root.attachMovie("IDmonClip","monClip",getNextHighestDepth()+1,{_x:600,_y:328.5});
function loadBitmapSmoothed(url:String, cible:MovieClip) { 
var bmc:MovieClip = cible.createEmptyMovieClip("bmc", cible.getNextHighestDepth()); 

var listener:Object = new Object();

listener.tmc = cible;

listener.onLoadProgress = function(mc:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void{
var pourcentage:Number = bytesLoaded/bytesTotal*100;
if(pourcentage<100){
_root.clipRoue._visible = true;
}
if(pourcentage == 100){
_root.clipRoue._visible = false;
Wash.start();
new Tween(monClip, "_alpha", Elastic.easeOut, 0, 100, 20, true);
mx.transitions.TransitionManager.start(monClip, {type:mx.transitions.Squeeze, direction:mx.transitions.Transition.IN, duration:1, easing:mx.transitions.easing.Bounce.easeOut});
}
}

listener.onLoadInit = function(mc:MovieClip){
mc._visible = false;
_root.monClip.clip2._x = _root.monClip.clip2._x-mc._width/2;
_root.monClip.clip2._y = _root.monClip.clip2._y-mc._height/2;
ZoomCalcul = new Array();
zoomTaux.text = "";

bitmap.dispose();
bitmap = new BitmapData(mc._width, mc._height, true);

this.tmc.attachBitmap(bitmap, this.tmc.getNextHighestDepth(),"auto",true); 
bitmap.draw(mc);
}	

var loader:MovieClipLoader = new MovieClipLoader(); 
loader.addListener(listener); 
loader.loadClip(url, bmc);
}
if(Pos == visuels_noms.length){
Pos = -1;
loadBitmapSmoothed(folder + visuels_noms[i, Pos+1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos+1];
trace(Pos);
Pos = Pos+1;
trace(Pos);
}else if(Pos !== visuels_noms.length){
loadBitmapSmoothed(folder + visuels_noms[i, Pos+1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos+1];
Pos = Pos+1;
trace(Pos);
}
}

... là ça marche aussi, seulement lorsque l'on est sur la dernière image stockée dans le xml et que l'on clique sur le bouton, cela me met "undefined", et si on clique encore une fois, et bien c'est bon ça affiche la 1ère image stockée dans le xml, pourtant je réintialise bien la position dans mon xml :
if(Pos == visuels_noms.length){
Pos = -1;
loadBitmapSmoothed(folder + visuels_noms[i, Pos+1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos+1];
trace(Pos);
Pos = Pos+1;
trace(Pos);
}

Je mets "Pos = -1" car dans la fonction je loade "Pos+1", donc 0, donc la 1ère donnée de mon Array, bref bizarre tout ça.

Bon en tout cas ça se précise et j'espère avoir terminé bientôt.

Merci,

BBFUNK01
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
6 avril 2010 à 22:45
Je viens de trouver pour mon bouton "suivant", en fait il faut enlever 1 à la longueur du tableau (normal finalement vu que le tableau commence à 0 :) ):
if(Pos == visuels_noms.length-1){
Pos = -1;
loadBitmapSmoothed(folder + visuels_noms[i, Pos+1], monClip.clip2);
clipMenu.designation.text = visuels_titres[i, Pos+1];
trace(Pos);
Pos = Pos+1;
trace(Pos);
}


comme ça ça marche.

Pour mon setInterval en tout cas ma fonction LoadBitmapSmoothed() ne fonctionne pas :(, je n'ai que le texte dynamique qui est chargé suivant le xml, mais pas les images.

BBFUNK01
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
6 avril 2010 à 23:25
Bon et bien voici ma conclusion :

- quand je mets sur mon bouton "play" :
Diap = setInterval(SlideShow, 6000);

ça me lance un seul intervalle (donc une seule image).

- quand je mets sur mon bouton "play":
Diap = setInterval(SlideShow(), 6000);

ça me lance bien ma fonction SlideShow() en boucle, mais il n'y a que mon champ de texte dynamique qui affiche les noms de mes images, mes images ne sont pas loadées.

Bref, ça me laisse pantois tout ça :0

BBFUNK01
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
6 avril 2010 à 23:27
...euh...

j'ai inversé les fonctions et leurs résultats :) :
Diap = setInterval(SlideShow(), 6000);

ne me lance qu'un intervalle.

BBFUNK01
0
Rejoignez-nous