Forums Développement Multimédia

Aller au contenu

déclaration d'une variable dans une boucle

CODE Actionscript

30 réponses à ce sujet

#1 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 21 June 2012 - 20:41 PM

bonjour à tous,
je débute en as3 et suis un peu perdu sur certains points…
j'ai besoin de faire :

var nomvideo1:String = nomvideo1;
var nomvideo2:String = nomvideo2;
var nomvideo3:String = nomvideo3;
var nomvideo4:String = nomvideo4;
var nomvideo5:String = nomvideo5;
var nomvideo6:String = nomvideo6;
var nomvideo7:String = nomvideo7;
var nomvideo8:String = nomvideo8;

et j'aimerai le faire dans une boucle for… en fait j'ai plein de choses que je vais avoir à dupliquer 8 fois et j'avoue ne pas avoir compris la soluce… apparement il faut passer par un tableau, mais je suis un peu dépassé.
Si quelqu'un veut bien me mettre sur la voie…
merci d'avance
bonne journée

Thomas

#2 DaveD

  • Members
  • PipPipPipPipPipPipPipPip
  • 2453 messages

Posté 21 June 2012 - 22:13 PM

Salut,

C'est peut être ce que tu cherches à faire

var i:int=0;
var nomvideo:Array = new Array();
//Chargement du tableau
for(i=1;i<9;i++) {
        nomvideo[i] = "nomvideo"+i.toString();
}
//Dechargement du tableau
for(i=1;i<9;i++) {
        trace("Indice i="+i+" nomvideo="+nomvideo[i]);
}
 


#3 Alcarion

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 22 June 2012 - 01:55 AM

ou même :

for(var i:int=1;i<9;i++)
{
this["nomvideo"+i] = "nomvideo"+i.toString();
}

for(var j:int=1;j<9;j++)
{
trace("Indice i="+j+" nomvideo="+ this["nomvideo"+j]);
}


?

#4 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 09:24 AM

merci pour vos réponses !
ça ne fonctionne pas mais ça me permet de comprendre l'utilisation d'un tableau dans la boucle for.
En fait je voulais déclarer mes variables nomvideo1, nomvideo2, etc… avec la boucle. Quand j'utilise votre code, ça me renvoie "accès à la propriété non définie nomvideo1" (8x)…
je vais continuer à chercher autour de ça…

dans le même ordre d'idée, j'essaie de poser 8 vidéos sur la scène, du coup j'ai fait :






var videocontainer1:MovieClip = new MovieClip  ;
var videocontainer2:MovieClip = new MovieClip  ;
var videocontainer3:MovieClip = new MovieClip  ;
var videocontainer4:MovieClip = new MovieClip  ;
var videocontainer5:MovieClip = new MovieClip  ;
var videocontainer6:MovieClip = new MovieClip  ;
var videocontainer7:MovieClip = new MovieClip  ;
var videocontainer8:MovieClip = new MovieClip  ;
var video1:FLVPlayback = new FLVPlayback();
var video2:FLVPlayback = new FLVPlayback();
var video3:FLVPlayback = new FLVPlayback();
var video4:FLVPlayback = new FLVPlayback();
var video5:FLVPlayback = new FLVPlayback();
var video6:FLVPlayback = new FLVPlayback();
var video7:FLVPlayback = new FLVPlayback();
var video8:FLVPlayback = new FLVPlayback();

var i:int=0;
var video:Array = new Array();
var nomvideo:Array = new Array();
var videocontainer:Array = new Array();
//Chargement du tableau
for(i=1;i<9;i++) {
                 video[i] = "video"+i;
nomvideo[i] = "nomvideo"+i;
videocontainer[i] = "videocontainer"+i;
}
for(i=1;i<9;i++) {
trace("VIDEOS/" + nomvideo[i] + ".flv");
video[i].source = "VIDEOS/" + nomvideo[i] + ".flv";
video[i].width = 330.5;
video[i].height = 186.7;
addChild(videocontainer[i]);
videocontainer[i].addChild(video[i]);

}

mais ça me renvoie " Impossible de créer la propriété source sur String."



T

#5 Badwolf

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 667 messages

Posté 22 June 2012 - 09:40 AM

C'est normal, dans ton tableau vidéo, tu as stocké des chaînes de caractères (String) et donc la propriété "source" est inconnue.

Ce sont des objets que tu devrais stocker à la place.
Haoooooooooooooooooooooooooooooooooooooooooooooou !!!

#6 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 09:58 AM

Bonjour tomtom

Peut tu nous décrire juste en français mais de façon précise ce que tu tentes de faire avec le code ci-dessus ?
Juste parce que j'ai un peu de mal, et en plus c'est une bonne pratique quand on découvre la prog (ou un langage).

Parce que là, tu est en train d'essayer de réussir à te gâcher la vie pour longtemps :-)
Si on pouvait te montrer comment travailler sans se servir des noms des objets auxquels tu colles un nombre, ça serait une bonne chose pour toi.

#7 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 10:00 AM

suis un peu dépassé…
dans mon idée, je donne à "source" une chaine de caractère (le chemin vers mon flv)…

#8 Badwolf

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 667 messages

Posté 22 June 2012 - 10:05 AM

Voir le messagetomtom, le 22 June 2012 - 10:00 AM, dit :

suis un peu dépassé…
dans mon idée, je donne à "source" une chaine de caractère (le chemin vers mon flv)…

for(i=1;i<9;i++) {
                 video[i] = "video"+i;
}
 

avec ce code tu ne stockes pas dans ton tableau les variables video1, video2 ... mais du texte "video1" , "video2" , tu aurais écrit "toto" ou "coincoin" que ça reviendrait au même.
Haoooooooooooooooooooooooooooooooooooooooooooooou !!!

#9 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 10:07 AM

croisement de post…

je cherche à mettre 8 vidéos sur ma scène, avec 8 composant flvplayback, pour faire comme une sorte de mur d'écran ou splitscreen.
Ces 8 vidéos vont :
- Toutes les vidéos bouclent sur une première boucle quand je ne fais rien ;
- chacune boucle sur une seconde boucle au survol de la souris ;
- quand je clique, la vidéo se joue

J'ai mis en place des cuepoint pour définir mes endroits où ça boucle.
J'arrive à faire tout ça en duppliquant 8 fois mes variables, mes listerner, mes fonctions, etc… (pas terminé tout à fait mais je m'en débrouille petit à petit).

Par contre je trouve un peu idiot de tout faire en 8 fois, je me disais que si je pouvais utiliser des boucles se serait un peu plus court, propre, gérable…

voilou…
T

#10 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 10:11 AM

Citation

avec ce code tu ne stockes pas dans ton tableau les variables video1, video2 ... mais du texte "video1" , "video2" , tu aurais écrit "toto" ou "coincoin" que ça reviendrait au même.

ok, je comprends maintenant, mais je ne sais pas comment corriger…

désolé ce sont mes premiers pas en as3, j'écume les tutoriaux, mais le passage à la pratique révèle les lacunes…
:-)

#11 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 10:49 AM

Bon bon…

je le redis autrement, et tu me dis si je me trompe :

Tu veux 8 objets sur ta scène.
Ces 8 objets ont un fonctionnement identique.
Ces huits objets sont différents par la video qu'ils affichent.
Ces huits objets sont différents par leur position (? sans doute ?)

Si je ne suis pas loin : en se rapprochant d'une écriture code :

pour chaque objet voulu :
  - créer une vidéo
  - créer un conteneur
  - positionner le conteneur en fonction de son rang
  - afficher la video dans le conteneur > déclencher boucle 1
  - écouter le survol du conteneur > déclencher boucle 2 de la video
  - écouter la fin du survol > déclencher la boucle 1 de la video
  - écouter le clic sur le conteneur > déclencher la boucle 3 de la video
fin du pour chaque objet voulu
J'attends que tu me dises si tu me suis, que tu corriges si besoin… et si tu vois vers où ça mène tu peux même tenter un bout de code :)
je repasse de temps en temps et je suis assez dispo entre 12h30 et 14h

PS : ne pas être désolé de débuter. Tout le monde y est passé. Tu t'en sors bien pour l'instant : écoute, réflexion et engagement, j'aime bien les débutants comme ça…

#12 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 11:10 AM

oui c'est tout à fait ça…

je te mets ce que je fais pour l'instant pour chacune de mes vidéos :
c'est pas terminé, je n'ai pas fais la seconde boucle





var nomvideo1:String = nomvideo1;
// là je récupère le nom de ma vidéo que j'ai stocké en externe dans un fichier txt
// CRéATION DES CONTAINERS ET ASSIGNATION DES VIDéOS
var video1:FLVPlayback = new FLVPlayback();
video1.source = "VIDEOS/" + nomvideo1 + ".flv";
video1.width = 330.5;
video1.height = 186.7;
var videocontainer1:MovieClip = new MovieClip  ;
addChild(videocontainer1);
videocontainer1.addChild(video1);
videocontainer1.x = 0;
video1.addASCuePoint(1, "cp1");
video1.addASCuePoint(8, "cp2");
// J'éCOUTE MES CUEPOINTS
video1.addEventListener(MetadataEvent.CUE_POINT, boucle);
// J'éCOUTE MON SURVOL
videocontainer2.addEventListener(MouseEvent.MOUSE_OVER,bouclesurvol);
videocontainer2.addEventListener(MouseEvent.MOUSE_OUT, finbouclesurvol);
var survol:Boolean;
// MES FONCTIONS
// POUR éCOUTER MES CUEPOINTS :
function boucle(eventObject:MetadataEvent):void
{
trace(eventObject.currentTarget.name);
trace("Cue point name is: " + eventObject.info.name);
switch (eventObject.info.name)
{
  case "cp1" :
  eventObject.currentTarget.seek(0);
   trace("LOOP");
}
}
// LANCER BOUCLE 2 AU SURVOL
function bouclesurvol(event:MouseEvent):void
{
survol = true;
trace(video2.name);
trace(event.currentTarget.name);
trace(event.target.name);
video2.seek(video2.findCuePoint("cp1","actionscript").time);
}
function finbouclesurvol(event:MouseEvent):void
{
survol = false;
video2.seek(0);
trace("survol terminé");
}

 


+ un truc que je ne comprends pas , dans ma fonction "bouclesurvol", je trace event.currentTarget.name et event.target.name et j'obtiens la même chose (mon conteneur et non ma vidéo…)



merci pour tout !

T

#13 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 11:34 AM

Alors, première réaction.

C'est très bien d'avoir voulu utiliser target et currentTarget pour diférencier tes objets. Tu as juste pas de chance, les videos ne sont pas typées interactiveObject et ne sont pas sensiles à la souris. C'est le conteneur qui est sensible, dans la zone de la video.
Il faut que tu fasses autrement.

Ça va être un peu long, mais à mon avis, Ça vaut le coup que j'y ailles par étapes.
Je reviens sur mon pseudo code…


pour chaque objet voulu :
  …
 

Déjà, rien que cette première ligne, je vais prendre le temps.
Tu veux donc des objets spécialisés.
Le mieux c'est d'utiliser une "fabrique" à objets. Quand on évolue, on se sert des classes pour Ça.
Quand on débute, on peut se servir d'une fonction.

La fonction ne fait pas que centraliser du code que l'on veut exécuter plusieurs fois.
Elle sait aussi renvoyer un objet.
C'est pour cela que l'on type les fonctions.
Quand elles ne renvoient rien, on type void :
function maFonction():void {
  // ici du code
}


Quand elles renvoient quelque chose, on type la fonction avec le type de l'objet retourné.
toi, tu voudrais clairement des objets de type MovieClip. Ça donnerait Ça :

function creer_movieClip():MovieClip {
  var mc:MovieClip = new MovieClip();
  // Ici du code pour spécialiser le movieclip
  // puis …
  return mc;
}

C'est l'instruction return qui va envoyer le mc créé par retour de courrier.
Du coup, on utilise la fonction comme ceci :
var un_mc_specialise:MovieClip = creer_movieClip();

Est-ce que jusque là je ne t'ai pas perdu ?
Est-ce que tu vois ou je veux en venir ?

2e point, juste pour avancer un peu plus :
une fonction prend aussi un paramètre en entrée.
C'est utile quand on veut obtenir un objet avec une particularité qui le différencie :
Exemple :


function creer_movieClip(parametre:String):MovieClip {
  var mc:MovieClip = new MovieClip();
  // Ici du code pour spécialiser le movieclip
  mc.name=parametre;
  // puis …
  return mc;
}
var un_mc_specialise:MovieClip = creer_movieClip("truc");
trace (un_mc_specialise.name); //trace : truc


#14 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 11:42 AM

ok, super,

est-ce que l'idée ça va être de boucler "var un_mc_specialise:MovieClip = creer_movieClip("truc");" pour créer autant de conteneur , puis de faire pareil pour chaque étape :
- déclarer la source de mon composant vidéo
- mettre mon composant vidéo dans mon conteneur



ça m'ouvre des perspective mais ça reste un peu flou…

#15 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 11:58 AM

Il y a toujours des variantes, chacun ces habitudes.

La mienne, ça serait de faire :

var id:int=0;
addChild(visionneuse(nomvideo1,id++);
addChild(visionneuse(nomvideo2,id++);
addChild(visionneuse(nomvideo3,id++);
addChild(visionneuse(nomvideo4,id++);
addChild(visionneuse(nomvideo5,id++);
addChild(visionneuse(nomvideo6,id++);
addChild(visionneuse(nomvideo7,id++);
addChild(visionneuse(nomvideo8,id++);
function visionneuse($url:String,$id:int):MovieClip {
  var mc:MovieClip=new MovieClip();
  // à suivre, tout le code de spécialisation du mc
  return mc;
}
 

ça paraît tentant de vouloir encore faire une boucle pour les 8 premières lignes, mais je n'y vois pas d'avantage.
Surtout que moi, je ne me sers jamais de noms incrémentés. Je préfère faire :

addChild(visionneuse(alain,id++);
addChild(visionneuse(bernard,id++);
addChild(visionneuse(charles,id++);
addChild(visionneuse(david,id++);
addChild(visionneuse(etienne,id++);
addChild(visionneuse(fabrice,id++);
addChild(visionneuse(gael,id++);
addChild(visionneuse(henri,id++);
 
Le gros avantage que j'y vois, c'est que je sais de quelle video je parlerais.
Et si je veux afficher david avant charles, je copie la ligne, je la recolle au dessus. Pas d'autre modification, ni des noms de fichier, ni du code.
:)
Pour la gestion des Movies, je ne vais pas pouvoir t'aider concrètement, mais tu as l'air au point.
Reste, la gestion des événements…

#16 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 12:15 PM

Voilà.

je n'ai pas tout retranscrit (j'ai surtout ôté ce que je ne comprends pas. Ça ne veut pas dire que ce n'est pas bon, juste qu'il faut que tu fasses attention aux noms des variables et tout cela.


var id:int = 0;
addChild (visionneuse(nomvideo1,id++));
addChild (visionneuse(nomvideo2,id++));
addChild (visionneuse(nomvideo3,id++));
addChild (visionneuse(nomvideo4,id++));
addChild (visionneuse(nomvideo5,id++));
addChild (visionneuse(nomvideo6,id++));
addChild (visionneuse(nomvideo7,id++));
addChild (visionneuse(nomvideo8,id++));

// POUR CRéER UN MOVIECLIP SPéCIALISé DANS L'AFFICHAGE D'UNE VIDEO :
function visionneuse ($url:String,$id:int):MovieClip {
  // je m'occupe déjà de la vidéo :
  var video:FLVPlayback = new FLVPlayback();
  video.source = "VIDEOS/" + $url + ".flv";
  video.width = 330.5;
  video.height = 186.7;
  video.addASCuePoint (1, "cp1");
  video.addASCuePoint (8, "cp2");
  video.addEventListener (MetadataEvent.CUE_POINT, boucle);
  // je m'occupe du conteneur :
  var mc:MovieClip=new MovieClip();
  mc.x = 330.5 * $id;// ??? ou bien tu veux qu'elles se superposent ?
  mc.addChild (video); // <<<<< J'inscrit la video à la liste d'affichage
  mc.video = video; // je stock un lien vers la video dans une propriété
  mc.addEventListener (MouseEvent.MOUSE_OVER,bouclesurvol);
  mc.addEventListener (MouseEvent.MOUSE_OUT, finbouclesurvol);
  return mc;
}

// POUR éCOUTER MES CUEPOINTS :
function boucle (eventObject:MetadataEvent):void {
  // le code
}

// LANCER BOUCLE 2 AU SURVOL
function bouclesurvol (event:MouseEvent):void {
  var mc:MovieClip=MovieClip(event.target);
  mc.video.seek (mc.video.findCuePoint("cp1","actionscript").time);
  trace ("début du survol");
}

function finbouclesurvol (event:MouseEvent):void {
  var mc:MovieClip=MovieClip(event.target);
  mc.video.seek (0);
  trace ("survol terminé");
}
 

La petite astuce qui permet de retrouver la vidéo, utilise le fait que les MovieClips sont dynamiques. Cela veut dire qu'on peut leur "inventer" des propriétés à la volée. Du coup, dans la fonction qui crée le mc, je rajoute une propriété "video" que je renseigne avec la video afficher.
Il faut bien comprendre qu'avoir une propriété "video" et afficher "video" sont 2 choses différentes. Mais Ça ne duplique pas la vidéo.
La propriété est un lien vers la vidéo.
L'affichage avec addChild est une inscription à la liste d'affichage de l'objet. Flash gère ensuite cette liste d'affichage pour montrer ou non les objets inscrits.

Si tu as des questions, n'hésite pas…

#17 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 12:24 PM

wouaou, j'étais en train d'écrire, je décortique ton code et je te dis où j'en suis…


oula, ça y 'est suis largué…


var id:int=0;
addChild(visionneuse(nomvideo1,id++);
addChild(visionneuse(nomvideo2,id++);
addChild(visionneuse(nomvideo3,id++);
addChild(visionneuse(nomvideo4,id++);
addChild(visionneuse(nomvideo5,id++);
addChild(visionneuse(nomvideo6,id++);
addChild(visionneuse(nomvideo7,id++);
addChild(visionneuse(nomvideo8,id++);
function visionneuse($url:String,$id:int):MovieClip {
  var mc:MovieClip=new MovieClip();
  // à suivre, tout le code de spécialisation du mc
  return mc;
}
 

je ne comprends pas l'écriture de tes addchild (moi j'en suis resté à :

addChild(visionneuse1);
visionneuse1.addChild(nomvideo1);
 


#18 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 12:40 PM

visionneuse est une fonction…
… une fonction qui renvoie un mc.
Si le nom de la fonction t'embrouille, tu peux l'appeler autrement. par exemple : creer_une_visionneuse()
Si tu as besoin de le décomposer, tu peux le lire ainsi :


var une_visionneuse:MovieClip; // je déclare une variable


une_visionneuse = creer_une_visionneuse (nomvideo1); // je crée une visionneuse, je la stock dans ma variable
addChild(une_visionneuse); // j'affiche la visionneuse stockée dans la variable



une_visionneuse = creer_une_visionneuse (nomvideo2); // je crée une visionneuse, je la stock dans ma variable
addChild(une_visionneuse); // j'affiche la visionneuse stockée dans la variable



une_visionneuse = creer_une_visionneuse (nomvideo3); // je crée une visionneuse, je la stock dans ma variable
addChild(une_visionneuse); // j'affiche la visionneuse stockée dans la variable



// POUR CRéER UN MOVIECLIP SPéCIALISé DANS L'AFFICHAGE D'UNE VIDEO :
function visionneuse ($url:String,$id:int):MovieClip {
  // …
}

 


Et oui, j'utilise toujours la même variable 'une_visionneuse' parce que je ne confonds pas la variable qui est un lien et l'objet lui même.
J'ai juste besoin du lien le temps d'écrire mon addChild, donc je peux m'en reservir ensuite… pas besoin de déclarer une variable pour chaque vidéo. Sauf qi j'ai besoin d'y revenir plus tard. Hors là, tout se passe en interne ensuite. :)

Quand au :
visionneuse1.adchild(nomvideo1);

Il est fait à l'intérieur de la fonction. De façon anonyme on peut dire.

#19 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 12:44 PM

PS : j'oubliais :
j'ai introduit une variable id qui peut te perturber aussi.
A mon avis tu en auras besoin, pour afficher dans un emplacement précis… mais sinon, tu peux l'oublier.

#20 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 12:49 PM

bon, c'est un peu la révolution dans ma tête, disons que j'ai tendance à raisonner encore en termes de ciblage AS2…

j'étais en train d'écrire que je ne comprenais pas les premières lignes, mais tu viens de poster l'explication…

je comprends en gros tout le principe, ça fonctionne, sauf pour MetadataEvent qui ne passe pas ("ce type est introuvable ou n'est pas une constante de compilation").


T

#21 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 12:52 PM

j'ai trouvé :
import fl.video.*;

merci pour tout, j'avance, j'imagine que je vais avoir d'autres questions… c'est vraiment une autre manière de penser les choses qu'en AS1/2 (où j'étais déjà un peu bancal…)

T

#22 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 12:54 PM

je ne connais pas MetadataEvent
je l'ai repiqué sur ton code.

je suppose qu'il s'agit d'un type dévénement dédié aux vidéo et que tu dois faire quelquechose comme :
import fl.video


Ah !
Du coup, il peut y avoir interaction entre ma variable video et le nom du package.
Remplace tous mes video par film, par exemple.


Sinon, j'aurais bien une autre approche à te proposer (je pense que c'est la notion d'objet qui te perturbe) mais ça pourrait aussi ajouter à la confusion. a toi de me dire…

Modifié par dldler, 22 June 2012 - 12:56 PM.
rectification


#23 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 12:56 PM

Voir le messagetomtom, le 22 June 2012 - 12:52 PM, dit :

j'ai trouvé :
import fl.video.*;

Vu.
Si ça fonctionne comme ça, c'est très bien, ne touche à rien.

#24 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 12:58 PM

oui c'est la notion d'objet avec laquelle je ne suis pas encore à l'aise…
oui, oui, partant pour une autre méthode, c'est toujours intéressant de voir différentes approches pour apprendre

#25 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 13:41 PM

L'autre idée, c'est de faire 8 fois la même chose, à l'intérieur d'une boucle for, donc.
Dans une boucle for, on incrémente généralement un compteur, que l'on appelle "i" par convention.

8 fois, la même chose, ce n'est pas tout à fait ce que tu veux.
Il y a des subtilités. Il faut donc se débrouiller avec notre seul signe distinctif "i" pour retrouver chaque subtilité.
Le principe le plus simple, c'est de ranger les subtilités dans un tableau.
toi, tes subtilités, ce sont les urls.

On ferait donc un tableau comme ça :
var urls:Array = [nomvideo1,nomvideo2,nomvideo3,nomvideo4,nomvideo5,nomvideo6,nomvideo7,nomvideo8];

for (var i:int=0; i<urls.length; i++) {
// je dois maintenant me débrouiller avec "i" pour faire tout pareil;
}

Pour le code à l'intérieur de la boucle for, ça va ressembler beaucoup )à la version précédente. la différence sera qu'avant, on avait la subtilité dans le paramètre. Maintenant, on l'a à l'indice "i" de notre tableau.

var urls:Array = [nomvideo1,nomvideo2,nomvideo3,nomvideo4,nomvideo5,nomvideo6,nomvideo7,nomvideo8];

for (var i:int=0; i<urls.length; i++) {
  // je m'occupe déjà de la vidéo :
  var video:FLVPlayback = new FLVPlayback();
  video.source = "VIDEOS/" + urls[i] + ".flv";
  video.width = 330.5;
  video.height = 186.7;
  video.addASCuePoint (1, "cp1");
  video.addASCuePoint (8, "cp2");
  video.addEventListener (MetadataEvent.CUE_POINT, boucle);
  // je m'occupe du conteneur :
  var mc:MovieClip=new MovieClip();
  mc.x = 330.5 * i;// ??? ou bien tu veux qu'elles se superposent ?
  mc.addChild (video);// <<<<< J'inscrit la video à la liste d'affichage
  mc.video = video;// je stock un lien vers la video dans une propriété
  mc.addEventListener (MouseEvent.MOUSE_OVER,bouclesurvol);
  mc.addEventListener (MouseEvent.MOUSE_OUT, finbouclesurvol);
  addChild (mc);
}

// POUR éCOUTER MES CUEPOINTS :
function boucle (eventObject:MetadataEvent):void {
  // le code
}

// LANCER BOUCLE 2 AU SURVOL
function bouclesurvol (event:MouseEvent):void {
  var mc:MovieClip = MovieClip(event.target);
  mc.video.seek (mc.video.findCuePoint("cp1","actionscript").time);
  trace ("début du survol");
}

function finbouclesurvol (event:MouseEvent):void {
  var mc:MovieClip = MovieClip(event.target);
  mc.video.seek (0);
  trace ("survol terminé");
}


#26 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 14:06 PM

oui, je comprends très bien…c'est plus simple en fait en fait ce qui est dure à piger pour moi c'est la notion d'objet et de propriétés et de ne plus penser en ciblant chaque instance…
je vais potasser tout ça
Merci bcp pour le coup de main en tous cas !!

#27 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 14:08 PM

Voir le messagetomtom, le 22 June 2012 - 14:06 PM, dit :

ne plus penser en ciblant chaque instance…

C'est ça.
Maintenant que tu l'as vu, ça va rouler tout seul.

Bonne continuation.

#28 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 14:16 PM

aaaarghhh
chassez le naturel, il revient au galop !!

je souhaite faire en sorte que :
quand je clique sur un film, il continue de jouer mais les autres s'arrêtent.

mais comment je peux dire "tout le monde stoppe sauf celui sur lequel je viens de cliquer" ?

#29 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 14:26 PM

:-D

une variable : tu y stockes la video cliquée (ou plutôt les conteneurs, ça serait plus souple).
tu stoppes les autres.

Pour ça, du coup, il va falloir que tu gardes un lien vers toutes les videos (ou tous les conteneurs, ça serait à mon avis plus souple).
Pour garder un lien vers une série d'objets, rien de mieux qu'un tableau.

je vais essayer de ne pas trop te mâcher le code, à mon avis tu devrait t'en sortir.

étape un :
//déclarer tes variables en début de code :
var visionneuses:Array=[];
var visionneuse_en_cours:MovieClip;

étape 2 : ça va se passer dans la boucle for, il faut que tu ranges le mc créé dans le tableau visionneuses*.
Pour ça, sert toi du compteur "i" :-)

étape 3 : dans la fonction associée au clic,
- tu stockes la visionneuse cliquée dans la variable visionneuse_en_cours
puis :
tu parcours toutes les visionneuses de ton tableau.
- si la visionneuse "i" est égale à la visionneuse cliquée
- alors
- - - jouer la boucle 3
- sinon
- - - mettre sur pause
- fin du si

* pour parcourir une série dans un tableau, tu peux utiliser un comteur, comme déjà vu, ou t'intéresser à la commande :
for each (… in …) {

#30 tomtom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 268 messages

Posté 22 June 2012 - 14:45 PM

ok.
j'ai fait un truc mais je pense que c'est un peu cracra :

dans ma fonction visionneuse j'ai ajouté :

mc.addChild(film);
// <<<<< J'inscrit la video à la liste d'affichage;
mc.mavideo = film;// je stock un lien vers la video dans une propriété
visionneuses.push(mc.mavideo);
 

puis dans ma fonction quand je clique :


function jouefilm(event:MouseEvent):void
{
filmencours = true;
for (var i:uint = 0; i<3; i++)
{
visionneuses[i].pause();
}
var mc:MovieClip = MovieClip(event.target);
mc.mavideo.play();
}
 

ce qui fonctionne, mais c'est un peu nul d'arrêter tout le monde et de relancer celui sur lequel je viens de cliquer, non?

+ dans mon tableau je stocke les noms d'instances… c'est mal docteur ?

t

#31 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 22 June 2012 - 15:22 PM

Voir le messagetomtom, le 22 June 2012 - 14:45 PM, dit :

ok.
j'ai fait un truc mais je pense que c'est un peu cracra :

Le plus important c'est : "j'ai fait un truc" :-) ça montre au moins que tu sais ou tu es





Voir le messagetomtom, le 22 June 2012 - 14:45 PM, dit :


mc.addChild(film); // <<<<< J'inscrit la video à la liste d'affichage;
mc.mavideo = film;// <<<<< je stock un lien vers la video dans une propriété
visionneuses.push(mc.mavideo);
 


function jouefilm(event:MouseEvent):void
{
filmencours = true;
for (var i:uint = 0; i<3; i++)
{
visionneuses[i].pause();
}
var mc:MovieClip = MovieClip(event.target);
mc.mavideo.play();
}
 
OK. ça, c'est bon



Voir le messagetomtom, le 22 June 2012 - 14:45 PM, dit :

ce qui fonctionne, mais c'est un peu nul d'arrêter tout le monde et de relancer celui sur lequel je viens de cliquer, non?

Exact. C'est tellement instantané que ce n'est pas trop grave.
Par contre pour la pureté et l'élégance, tu peux faire un test avec un if/else…

je te le fais en meêm temps que la boucle for each :


function jouefilm(event:MouseEvent):void
{
  filmencours = true; // Est-ce bien utile ?
  visionneuse_en_cours = MovieClip(event.target);
  for each (var mc:MovieClip in visionneuses )
  {
        if (mc==visionneuse_en_cours) mc.mavideo.play();
        else mc.mavideo.pause();
  }
}
 




Voir le messagetomtom, le 22 June 2012 - 14:45 PM, dit :

+ dans mon tableau je stocke les noms d'instances… c'est mal docteur ?
Si c'est vrai, oui. C'est très mal. Tu dois stocker les instances et pas leur nom.
Mais je ne sais pas de quel code tu parles. pas de celui-ci en tous cas… ici tu stockes bien les instances.

[EDIT] : je rectifie : ce code fonctionne si tu stockes les mc dans le tableau plutôt que les vidéos.
soit : visionneuses.push(mc);



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