Comunidad de diseño web y desarrollo en internet online

Problema con los eventos de un MC creado con XML

Citar            
MensajeEscrito el 09 Ene 2009 03:43 am
Hola,

Antes que nada, quiero agradecer a los clabers la ayuda que brindáis a toda la comunidad de programadores y diseñadores. Como recien llegado a Actionscript desde el mundo del diseño, me quito el sombrero ante la tremenda ayuda que esta web supone para los novatos como yo. Chapeau!

Y ahora, el problema en sí. Estoy intentando crear una videogalería dinámica, que cargue toda la información y rutas de los .flv a través de un XML. Básicamente, consiste de un reproductor y al lado un scroll lateral vertical con los thumbnails de los videos.

Hasta el momento, siguiendo infinidad de tutoriales y posts, todo ha ido bien: he creado un reproductor personalizado que carga los videos a traves de un NetStream, he creado varios MC que recogen los .jpegs que contiene un XML y los he colocado en el escenario.

Ahora bien, cuando intento dar a estos MC un evento de onPress para que reproduzcan el video correspondiente, resulta que todos los thumbnails enlazan al ultimo video del xml. x

He realizado varias búsquedas y encontrado posts con el mismo problema, pero tras intentar las varias soluciones propuestas no he conseguido nada.



Ahí va el codigo, lo comento para que esté más claro:

Código ActionScript :

//// cargo el XML

var thumbs_xml:XML= new XML();
thumbs_xml.ignoreWhite=true;

thumbs_xml.onLoad=function(){

   var thumbs:Array= this.firstChild.childNodes
   
        // creo el contenedor de los thumbnails: thumbs_mc
   var thumbs_mc:MovieClip =thumbGallery.thumbPanel.createEmptyMovieClip("allThumbs",this.getNextHighestDepth());
   thumbs_mc.setMask(thumbGallery.thumbPanel.maskMc);

   // inicio el bucle que creará los thumbnails y obtendrá los valores del Array del XML
   
         for (i=0; i<thumbs.length; i++){
      
      var jpeg:String = thumbs[i].attributes.url;  // recogo la variable url, el .jpeg
      var vid:String= thumbs[i].attributes.video;  //recogo la variable video, el .flv
      var y_distance:Number= 50*i;
      var y_total= y_distance+50;
      
      createThumb(jpeg); // llamo a la función que crea los MC que contendrán los .jpegs
           
                //// EL PRESS/////
      thumbs_mc.onPress=function(){
         ns.play(vid);   /// llamo a la función play del NetStream, y le paso el valor de la ruta del video
      }
      }
      function createThumb(ruta:String){
      
                 ///creo un MovieClip vacio que contendrá el jpeg  img_thumbnail
                var img_thumbnail:MovieClip=thumbs_mc.createEmptyMovieClip("img(i+1),thumbs_mc.getNextHighestDepth());
      img_thumbnail._y= y_distance;
          
             //para cargar la miniatura definimos un objeto MovieClipLoader y un objeto detector de eventos
      var mi_mcl:MovieClipLoader = new MovieClipLoader();
      var miListener:Object = new Object();
      mi_mcl.addListener(miListener);
         

         // cargamos la imagen
         mi_mcl.loadClip(jpeg,img_thumbnail);
         
      }
}

////cargo el xml
thumbs_xml.load("thumbs_videos_local.xml");


-----------------------------------------------------------------
el xml dice así:

Código XML :

<?xml version="1.0" encoding"ISO-8859-1"?>

<thumbs> 
<thumb url="thumbs/thumb_1.jpg" video="videos/nervo_flash_zune_03.flv"/>
<thumb url="thumbs/thumb_2.jpg" video="videos/nervo_flash_zune_04.flv"/>
</thumbs>

---------------------------------------------------------------

Creo haber entendido que el problema no es del rollOver en sí, si no de que el bucle for, por su ejecución casi inmediata, sólo guarda el último valor "i", por lo tanto el último valor del XML. En el momento de crear los thumbnails no hay problema, pero supongo que cuando el onPress llega a la variable "i" ésta ya ha sido reemplazada por otro valor. O yo que sé...

Otro problema que tengo es que el onPress sólo puedo hacerlo sobre thumbs_mc,el contenedor con los mc de los thumbnails, y no sobre los diferentes thumbnails. El problema creo que viene de la misma parte, ya que cuando intento hacer un trace de la ruta de los mc con los thumbnails, me sale undifined. Seguramente se debe también al valor de "i" tras el bucle for.

He intentado crear variables generales qur recojan el valor de i, pero nada, no lo consigo. También he leído algo de la funcion Init del MovieClip Loader, y tampoco.

Creo que la solución va por ahí, pero sin vuestra ayuda lo veo crudo. Si alguien tiene una idea de lo que pasa, por favor ilustradme!!


Muchas gracias de antemano,

Toni

Por tonidomi

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Ene 2009 05:01 am
Edite un poco de tu comentario ya que veo te tomaste una molestia para resaltar coloreando todo tu código y facilitar un poco la comprensión del mismo, pero hubiera bastado con agregar el BBcode [as], y [xml] respectivamente. Gracias de todos modos! Ahora mismo hecho un vistazo para ver si puedo ayudarte en el tema.
:wink:

Por M@U

BOFH

6210 de clabLevel

34 tutoriales
5 articulos

Genero:Masculino   Héroes Bastard Operators From Hell Editores

Bate jubilado de Cristalab

firefox
Citar            
MensajeEscrito el 09 Ene 2009 05:18 am
Bien, a rápido vistazo creo que tu error esta aquí:

tonidomi escribió:

[...]

Código ActionScript :

var jpeg:String = thumbs[i].attributes.url;  // recogo la variable url, el .jpeg
var vid:String= thumbs[i].attributes.video;  //recogo la variable video, el .flv


Es por que almacenas las ubicaciones de los videos en un string, peor aun, no los anexas al contenido de la cadena solo reemplazas en cada ciclo de for() su contenido anterior. Por eso al final solo tienes la cadena del ultimo valor.

Prueba mejor guardando los datos en un Array de la siguiente forma:

Código ActionScript :

// Declaras el array fuera del bucle
var vid:Array = new Array();
 . . .
// Dentro de for() reemplazas la linea de conflicto por algo como esto:
var vid[i] = thumbs[i].attributes.video;
De esta manera puedes acceder a TODOS los videos y no solo a uno. El mismo caso para el String "jpeg".

Prueba de ello es usar trace(vid); y te devolverá toda la información, o bien si quieres acceder solamente a una ubicación vid[2].

Saludos!

Por M@U

BOFH

6210 de clabLevel

34 tutoriales
5 articulos

Genero:Masculino   Héroes Bastard Operators From Hell Editores

Bate jubilado de Cristalab

firefox
Citar            
MensajeEscrito el 09 Ene 2009 12:42 pm
Gracias por la respuesta M@U!

he implementado tu código, y ahora sí que puedo conservar el valor de los videos i los jpeg dentro de los Arrays. Es más,también he creado otro Array en el que conserva las rutas de los movieclips que contienen los .jpegs, para poder asignarles un estado onPress más tarde.

gracias por el consejo del BBCode ;)

Código ActionScript :


var mcArray:Array=new Array;

/// y dentro de la funcion createThumbs

mcArray.push(img_thumbnail);



así, mcArray[0] me devuelve _level0.thumbGallery.thumbPanel.allThumbs.img0, etc...


Pero ahora me encuentro con dos problemas:

1- Cuando intento asignar un estado onPress a mcArray[0], por ejemplo,no hace nada. Es raro, porque sobre thumbs_mc (_level0.thumbGallery.thumbPanel.allThumbs) sí que funciona.

2-Aún solucionando el problema anterior, no tengo muy claro como asignar la ruta del video a cada mc con thumbnail. Debería hacer otro bucle for dentro del bucle existente que dijera algo así?

Código ActionScript :


        var vid:Array= new Array;
   var jpeg:Array= new Array;
   var mcArray:Array=new Array; 

for (i=0; i<thumbs.length; i++){
      
      jpeg[i] = thumbs[i].attributes.url;
      vid[i]= thumbs[i].attributes.video;
      var y_distance:Number= 50*i;
      var y_total= y_distance+50;
      
      createThumb(jpeg[i]); //la funcion createThumbs
      
                for(j=0; j<mcArray;j++){
                            mcArray[j].onPress=function(){
                                 ns.play(vid[j]);
                            }
                }
}      
         
      function createThumb(ruta:String){
      var img_thumbnail:MovieClip=thumbs_mc.createEmptyMovieClip("img"+i,thumbs_mc.getNextHighestDepth());
         img_thumbnail._y= y_distance;
         mcArray.push(img_thumbnail); /// aquí hago el push para obtener las diferentes rutas de img_thumbnail
         //para cargar la miniatura definimos un objeto MovieClipLoader
         // y un objeto detector de eventos
         var mi_mcl:MovieClipLoader = new MovieClipLoader();
         var miListener:Object = new Object();
         mi_mcl.addListener(miListener);
         // cargamos la imagen
         mi_mcl.loadClip(jpeg[i],img_thumbnail);   
      }
      



creo que debería ser así, pero creo que no llega a entrar al bucle for... y no sé porqué...


alguna idea?

Toni

Por tonidomi

1 de clabLevel



 

firefox

 

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