Comunidad de diseño web y desarrollo en internet online

Menu de arbol XML. Como poner link a botones dinámicos

Citar            
MensajeEscrito el 12 Jul 2011 07:52 am
Hola, antes de nada, debo decir que no soy programador pero me toca programar por circunstacias de mi curro, con lo que no tenga apenas idea de metodología :(

Tengo un problema con este menú que se genera dinámicamente leyendo de un XML. Todos los botones salen bien pero el enlace los sub-botones no funciona del todo bien, aunque si carga bien los textos.
Si desplegamos el "Topic One" y pulsamos en los botones no cargan los swf a los que llamo, pero si pulsamos en el "Topic Two" y luego en los botones del primero, entonces si cargan los swf pero no correctamente. He colocado un trace tanto fuera como dentro de la función (lineas 85 y 91) y devuelven indices que no se corresponden con los botones. Parece que, al asignar los botones, usa el último valor de J. No se como arreglar esto para que cada botón pille el link que le coresponde

La instrucciones para asignar entre las líneas 85 y 95. Pongo aquí el código y adjunto los archivos.

[url=http://dl.dropbox.com/u/3606883/menuxml.zip][/url]

Muchísimas gracias por la ayuda

Código ActionScript :

var test:Number = 56;
var mainTab:Array = new Array();
var subTabArr:Array = new Array();
var subTabEnla:Array = new Array();
var total:Number = 0;
var menuXml:XML = new XML();

menuXml.ignoreWhite = true;
mask_clip._visible=0
function xmlLoaded(sucess) {
   init();
   if (sucess) {
      var rootNode = this.firstChild;
      total = rootNode.childNodes.length;
      var count:Number = 0;
      var subcount:Number = 0;
      for (thisNode=rootNode.firstChild; thisNode != null; thisNode=thisNode.nextSibling) {
         mainTab[count] = thisNode.attributes.label;
         subcount = 0;
         subTabArr[count] = new Array();
         subTabEnla[count] = new Array();
         for (subNode=thisNode.firstChild; subNode != null; subNode=subNode.nextSibling) {
            subTabArr[count][subcount] = subNode.attributes.label;
            subTabEnla[count][subcount] = subNode.attributes.link;
            // trace ("nombre " + subTabArr[count][subcount]);
            //trace ("enlace " + subTabEnla[count][subcount]);
            subcount++;
         }
         count++;
      }
      createTabMenu();
   } else {
      trace("Failed to load Xml");
   }
}
menuXml.onLoad = xmlLoaded;
menuXml.load("scroll.xml");






function createTabMenu(){
   _root.Scroll_visible(false);
   this.createEmptyMovieClip("menuTab",10);
   menuTab.setMask(_root.mask_clip)
   menuTab._x = 20;
   x=menuTab._y = 50;
   for(i=0; i<total; i++){
      var tab = menuTab.attachMovie("mainTab","mainTab"+i,i,{_y:i*28});
      trace("TAB: "+tab);
      tab.label_txt.text = mainTab[i];
      tab.a=i;
      tab.open = false;

      tab.over_btn.onRelease = function()
      {
         trace ("Main tab pulsado");
         if(menuTab._height<=mask_clip._height)
         {   
            menuTab._y=x
            _root.ScrollBar._visible=0
         }
         else
         {
            _root.ScrollBar._visible=1
         
         }         
      }
      tab.over_btn.onPress = function()
      {
         ScrollBar.targetMc=menuTab
         var currNum = this._parent.a;
         
         if(this._parent.open==false){
            
            this._parent.open=true;
            for(j=0;j<subTabArr[currNum].length;j++){
               var subTab = this._parent.attachMovie("subTab","subTab"+j,j,{_y:j*28+28});
               //trace (subTab);
               // _level0.menuTab.mainTab6.subTab0.semaforo.gotoAndStop(2);
               subTab.label_txt.text = subTabArr[currNum][j];
               //trace ("subTabArr[currNum][j] " + subTabArr[currNum][j]);
               trace ("Out: ["+currNum+"]["+j+"]" + subTabEnla[currNum][j]);
               
                  subTab.over_btn.onRelease = function()
                  {                     
                     //trace("el boton es: " + subTab.over_btn);
                     //trace ("test dentro " + test);
                     trace ("In: ["+currNum+"]["+j+"] " + subTabEnla[currNum][j]);
                     
                     loadMovieNum(subTabEnla[currNum][j],1);
                     //trace ("sub tab pulsado");
                                          
                  }
            }
         
            for(k=currNum+1; k<total; k++){
               menuTab["mainTab"+k]._y=menuTab["mainTab"+(k-1)]._y+menuTab["mainTab"+(k-1)]._height;
            }
            if(menuTab._height<=mask_clip._height)
            {    
            _root.Scroll_visible(false);
               menuTab._y=x
            }else{   
               _root.Scroll_visible(true);
            }
         }
         else
         {
            this._parent.open=false;
            for(j=0;j<subTabArr[currNum].length;j++){
               removeMovieClip(menuTab["mainTab"+currNum]["subTab"+j]);
            }
            for(k=currNum+1; k<total; k++){
               menuTab["mainTab"+k]._y=menuTab["mainTab"+(k-1)]._y+menuTab["mainTab"+(k-1)]._height;
               if(menuTab._height<=mask_clip._height)
            { 
               _root.Scroll_visible(false);
               menuTab._y=x
               }else{
               _root.Scroll_visible(true);
            
            }
            }

         }
      }
   }
}



//----------------------------------------------------------------------
mx.events.EventDispatcher.initialize(this);
var _nInterval:Number;
var _nOffset:Number;

var dispatchEvent:Function;
 
    stab.onPress = function():Void {
      
     _nOffset = this._ymouse;
      _nInterval = setInterval(scroll, 10);
    
    };
    stab.onRelease = function():Void {
      
      clearInterval(this._parent._nInterval);
     
    };
    stab.onReleaseOutside = stab.onRelease;
   
    up.onPress = function():Void {
      
      this._parent._nInterval = setInterval(nudge, 10,-1);
    };
   
    up.onRelease = function():Void {
     clearInterval(_nInterval);
    };
    up.onReleaseOutside = up.onRelease; 
    down.onPress = function():Void {
      this._parent._nInterval = setInterval(nudge, 10,1);
    };
    down.onRelease = function():Void {
      
      clearInterval(_nInterval);
    };
    down.onReleaseOutside = down.onRelease;


   function arrange():Void {
      
   if(stab._y<sbar._y)
   {
      stab._y=sbar._y
   }
   if(stab._y>(sbar._y+sbar._height-stab._height))
   {
      stab._y=sbar._y+sbar._height-stab._height
   }
   stab._y=sbar._y
  }

 
 var initContentPos:Number =0
 var moveVal:Number=0;
 
 function scroll():Void {

    var nY:Number = _ymouse - _nOffset;
    var nUpper:Number = sbar._y;
    var nLower:Number = down._y - stab._height;
   
      if(nY > nUpper && nY < nLower) {
          stab._y = _ymouse -_nOffset;
      
      }
      else if(nY < nUpper) {
        stab._y = nUpper;
      }
      else if(nY > nLower) {
        stab._y = nLower;
      }
   
    dispatchScrollEvent();
    updateAfterEvent();
  }
 
   function nudge(nIncrement:Number):Void {

    var nUpper:Number = sbar._y;
    var nLower:Number = down._y - stab._height;
    stab._y += nIncrement;
    if(stab._y < nUpper) {
      stab._y = nUpper;
    }
    else if(stab._y > nLower) {
      stab._y = nLower;
    }
    dispatchScrollEvent();
    updateAfterEvent()
  }

   function dispatchScrollEvent():Void {
   moveVal= (menuTab._height-300)/(sbar._height-stab._height);
   menuTab._y = Math.round((sbar._y-stab._y)*moveVal+50);
  }

  function Scroll_visible(flag)
  {
   sbar._visible=flag;  
   stab._visible=flag; 
   up._visible=flag; 
   down._visible=flag; 
     }
   //  Scroll_visible(true);

Por juanjoharo

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Jul 2011 05:29 pm
El j se sobreescribe en el loop, se lo tienes que pasar al MC, por ejemplo así>

attachMovie("subTab","subTab"+j,j,{_y:j*28+28, nr:j}

Luego encima la accion se la das al hijo, no al clip que attachaste, entonces la tiene que buscar en parent

Código ActionScript :

subTab.over_btn.onRelease = function() 
                  {                      
                     //trace("el boton es: " + subTab.over_btn); 
                     //trace ("test dentro " + test); 
                     trace ("In: ["+currNum+"]["+this._parent.nr+"] " + subTabEnla[currNum][j]); 
                      
                     loadMovieNum(subTabEnla[currNum][this._parent.nr],1); 
                     //trace ("sub tab pulsado"); 
                                           
                  } 



Si no va con this._parent.nr, prueba con this.nr, el scope en AS2 es bastante tricky

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 14 Jul 2011 07:01 am
Muchísmas gracias!!!! Funciona!!!

Al final lo había resuelto asignando la función on realease al mc que contenía el botón, el cual si tenía un nombre distinto cada vez, recogiendo su número del ultimo caracter del nombre...

:D

subTab.onRelease = function()
{
var lastDigit:Number = Number(this._name.charAt(this._name.length-1));
trace ("mi numero es " + lastDigit);
this.semaforo.gotoAndStop(2);
loadMovieNum(subTabEnla[currNum][lastDigit],1);

}

Por juanjoharo

8 de clabLevel



 

msie8

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.