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 1 & ActionScript 2 Discussion :

Bug positionnement dans menu "accordéon" multiniveau


Sujet :

ActionScript 1 & ActionScript 2

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    BnA
    BnA est déconnecté
    Membre éclairé Avatar de BnA
    Inscrit en
    Mars 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 559
    Par défaut Bug positionnement dans menu "accordéon" multiniveau
    Bonjour à tous!!

    Tout d'abord, j'espère vraiment que vous réussirez à solutionner mon problème!!

    Voici tout d'abord le code AS2, si vous voulez voir l'engin en situation, j'ai joint le XML, le fla (MovieClip inclus) et le swf...

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    var menu_xml = new XML();
    menu_xml.load("xmlTest.xml");
    menu_xml.ignoreWhite = true;
    //
    menu_xml.onLoad = function() {
    	_global.nbrMenuFirstLevel = this.childNodes[0].childNodes.length;
    	_global.racine = this.childNodes[0];
     
    	for (i=0; i<nbrMenuFirstLevel; i++) {
    		_root.attachMovie("etiquette","menuItem"+i,i);
    		_root["menuItem"+i]._x = 8;
    		_root["menuItem"+i]._y = 30+(i*19);
    		_root["menuItem"+i].nomElement = racine.childNodes[i].attributes.title;
    		_root["menuItem"+i].derouleur.Enfants = racine.childNodes[i].childNodes;
    		_root["menuItem"+i].derouleur.niveau1 = _root["menuItem"+i];
    		_root["menuItem"+i].derouleur.profondeur = 1;
    		_root["menuItem"+i].derouleur.y = _root["menuItem"+i]._y
    		_root["menuItem"+i].derouleur.onPress = generateSubMenu;
    	}
    };
    //
    getProps = function (table, resultats, position, toExclude) {
    	for (prop in table) {
    		if (typeof(table[prop]) == "movieclip" && prop.substr(0, 8) == "menuItem") {
    			if (table[prop] != toExclude) {
    				trace(table+"."+prop+" Name:"+table[prop].nomElement+" H:"+table[prop].derouleur.y+" Position:"+position);
    				if ( table[prop].derouleur.y > position ) {
    					resultats.push(table[prop]);
    				} else {
    					getProps(table[prop], resultats, position);
    				}
    			}
    		}
    	}
    };
     
    replacerMenus = function (elt) {
    	var decalY = 0;
    	var resultats = [];
    	getProps(_root, resultats, elt.derouleur.y, elt);
     
    	for ( i=0; i<resultats.length; i++ ) {
    		resultats[i]._y += 19*elt.derouleur.Enfants.length;
    		resultats[i].derouleur.y += 19;
    	}
    	/*_global.destinationsMenus = [];
    	for (i=0; i<nbrMenuFirstLevel; i++) {
    		placeMenu = 30+decalY;
    		destinationsMenus.push(placeMenu);
    		decalY += _root["menuItem"+i]._height;
    	}
    	for (i=0; i<nbrMenuFirstLevel; i++) {
    		_root["menuItem"+i].numeroEntree = i;
    		_root["menuItem"+i].onEnterFrame = function() {
    			this._y += (destinationsMenus[this.numeroEntree]-this._y)*0.2;
    		};
    	}*/
    };
     
    generateSubMenu = function () {
    	if (this._currentframe == 1) {
    		this.gotoAndStop(2);
    		for (i=0; i<this.Enfants.length; i++) {
    			tempo = this.niveau1.attachMovie("etiquette", "menuItem"+i, i);
    			tempo._x = 10*this.profondeur;
    			tempo._y = 19+(i*19);
    			tempo.derouleur.profondeur = this.profondeur+1;
    			tempo.nomElement = this.Enfants[i].attributes.title;
    			tempo.derouleur.niveau1 = this.niveau1["menuItem"+i];
    			tempo.derouleur.Enfants = this.Enfants[i].childNodes;
    			tempo.derouleur.y = this.y+tempo._y
    			tempo.derouleur.onPress = generateSubMenu;
    		}
    		replacerMenus(this.niveau1);
    	} else {
    		this.gotoAndStop(1);
    		var resultats = [];
    		for (i=0; i<this.Enfants.length; i++) {
    			this.niveau1["menuItem"+i].removeMovieClip();
    		}
    		getProps(_root, resultats, this.y);
    		for ( i=0; i<resultats.length; i++ )
    			resultats[i].derouleur.y -= 19;
    	}
    	//
    };
    Je vous avouerai que ce n'est pas mon code le plus propre, mais bon, il faut que ça marche D'ABORD, l'optimisation vient après...

    Le problème étant somewhat difficult à expliquer (je ne vois pas comment faire pour que mon explication soit claire et compréhensible), je vous recommande vivement de downloader le swf et le xml pour comprendre le bug de fonctionnement (le fla pour des tests si vous voulez, il y a un MovieClip inclus (invisible sur la scène))...

    Vous voyez??

    - Le "dépliage" du 1er niveau fonctionne (éléments-fils visibles, et élément-frère descendu)
    - Le "repliage" de ce même 1er niveau pas. L'élément-frère de celui sur lequel on a cliqué continue à descendre au lieu de remonter à sa position initiale.
    - Le "dépliage" du 2ème niveau fonctionne(il n'y a pas d'enfant pour les 2 premiers noeuds de niveau 2), mais l'affichage des enfants du 3ème noeud de niveau 2 se fait beaucoup trop bas)
    - Le repliage du niveau 2 pose le même problème que pour le niveau 1.

    Et les mêmes problèmes surviennent pour les niveau 3 et 4.

    J'ai essayé de faire un code "récurssif" au maximum histoire de ne pas avoir à recoder un tel menu si la structure du XML venait à changer...

    Bref, je ne demande pas que mon menu soit 100% fonctionnel, mais j'aimerais que vous m'aidez à résoudre le problème de repliage. Pourquoi les éléments-frères ne remontent-ils pas correctement??

    Le reste, je chercherai par moi-même avant de faire éventuellement à nouveau appel à vous...

    Merci d'avance pour votre aide!!
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lien dans menu en accordéon
    Par @laulau@ dans le forum Flash
    Réponses: 1
    Dernier message: 21/08/2007, 17h07

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