Foros del Web » Creando para Internet » Flash y Actionscript »

Restar indice a un array

Estas en el tema de Restar indice a un array en el foro de Flash y Actionscript en Foros del Web. Buenas, sigo con la galería de imágenes, esta vez me interesa guardar en una array la anchura de cada imagen para después poder posicionar cada ...
  #1 (permalink)  
Antiguo 23/04/2009, 10:29
 
Fecha de Ingreso: enero-2009
Mensajes: 24
Antigüedad: 15 años, 3 meses
Puntos: 0
Restar indice a un array

Buenas, sigo con la galería de imágenes, esta vez me interesa guardar en una array la anchura de cada imagen para después poder posicionar cada imagen dependiendo del ancho de la anterior, sería así:


Código PHP:
var anchos:Array = new Array();
....

//Creo las imagenes:

for (04i++){
   
crearImagenes(i);
}

function 
crearImagenes(num:Number){
    ...
    
listener.onLoadInit = function(target_mc){
        
anchos[num] = target_mc._width;
        
//Y AHORA PARA SABER EL ANCHO DEL ANTERIOR
        
trace(anchos[num 1]);
        
//ME DICE UNDEFINED DE CADA ELEMENTO DEL ARRAY
   
};

No lo entiendo me debería decir "undefined" cuando sea anchos[-1], para el resto debería de mostrarmelo.

Sin embargo:

Código PHP:
var i:Number;
var 
mi_array:Array = new Array();

mi_array[0] = "Cero";
mi_array[1] = "Uno";
mi_array[2] = "Dos";
mi_array[3] = "Tres";

for (
04i++){
   
trace(mi_array[i-1]);

Imprime:

undefined
Cero
Uno
Dos

He intentado buscarle la lógica pero no lo entiendo, espero que puedan ayudarme.
  #2 (permalink)  
Antiguo 23/04/2009, 11:36
Avatar de Ludwingg  
Fecha de Ingreso: diciembre-2002
Ubicación: San Salvador
Mensajes: 951
Antigüedad: 21 años, 4 meses
Puntos: 5
Respuesta: Restar indice a un array

Creo que el problema es que la variable i en un inicio equivale a cero, entonces cuando hace el trace de i-1, o sea 0-1 (cero menos uno), este equivale a -1, por eso te lanza undefined...

En este momento no tengo el flash, por lo tanto no puedo probar, pero te sugiero que agregues un if para verificar cuando i equivale a cero, ya que antes de el no hay ningun valor, asi que no debería tomarlo en cuenta:

Código:
for (i=0; i<mi_array.length; i++) {
   if (i != 0) {
      trace(mi_array[i-1]);
   }
}
  #3 (permalink)  
Antiguo 23/04/2009, 11:44
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Respuesta: Restar indice a un array

Hola RM13 !

Por lo que veo, hay alguna variable que no puede ser leída en el ámbito de onLoadInit, puede ser anchos o target_mc._width, prueba con el depurador para ver si esas variables están definidas ahí.

Un saludote !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #4 (permalink)  
Antiguo 23/04/2009, 16:18
 
Fecha de Ingreso: enero-2009
Mensajes: 24
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Restar indice a un array

Ludwingg gracias por tu ayuda, sé que porque me lanza el primer undefined lo que no entiendo es por que si guardo la anchura de cada imagen en el array, al hacer el trace, me las imprime perfectamente, pero cuando hago un trace del array, restandole uno a cada indice, no logra reconocerlo.

jahepi, la verdad es que lee las dos porque por ejemplo:

Cita:
function crearImagenes(num:Number){
...
listener.onLoadInit = function(target_mc){
anchos[num] = target_mc._width;
trace(anchos[num]);
};
}
Imprime correctamente el ancho de cada imagen, en cambio si intentas restarle un indice al array ya no reconoce, y como he realizado en el segundo ejemplo de manera mas sencilla reconoce perfectamente al restarle el indice, esto se escapa a mi comprensión jeje, un saludo y gracias por vuestra ayuda.

Última edición por RM13; 23/04/2009 a las 16:26
  #5 (permalink)  
Antiguo 23/04/2009, 18:25
Avatar de Lynxcraft  
Fecha de Ingreso: noviembre-2007
Ubicación: yecla murcia
Mensajes: 1.346
Antigüedad: 16 años, 5 meses
Puntos: 51
Respuesta: Restar indice a un array

Código PHP:
var anchos:Array = new Array();
//....

//Creo las imagenes:

for (var i:Number 04i++){
   
crearImagenes(i);
}

function 
crearImagenes(num:Number){
   
// ...
    
listener.onLoadInit = function(target_mc){
        
anchos.push(target_mc._width);
        
//Y AHORA PARA SABER EL ANCHO DEL ANTERIOR
        
if(anchos[num 1]==undefined){
        
trace('Espera que cargue el otro dato ');
        }else{
            
trace(anchos[num 1]);
        } 
        
//ME DICE UNDEFINED DE CADA ELEMENTO DEL ARRAY
   
};

te explico como va el asunto el hecho que un array almacena sus valores con un indice en pesado por cero, como es logico si restas su indice y el resultado de este es menor a 0 o de por si el array no contiene nada te devuelve undefined
__________________
Sobran las ideas cuando faltan ganas de trabajar en ellas
Lynxcraft
  #6 (permalink)  
Antiguo 24/04/2009, 05:38
 
Fecha de Ingreso: enero-2009
Mensajes: 24
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Restar indice a un array

Utilizando:

Código PHP:
anchos.push(target_mc._width);
        if(
anchos[num 1]==undefined){
               
trace('Espera que cargue el otro dato ');
        }else{
               
trace(anchos[num 1]);
        } 
Espera que cargue el otro dato
anchos[1]: undefined
anchos[0]: 270
Espera que cargue el otro dato.

No logro entender muy bien lo que sucede y todavia no me ha quedado muy claro lo siguiente, no sé si es lo que me habéis explicado:

Vamos a ver tengo 4 imágenes (probando con 4, después van a ser muchas más):

Nombre Dimensiones
---------- --------------------
0.jpg 480 x 360
1.jpg 270 x 360
2.jpg 270 x 360
3.jpg 270 x 360

//Tengo el bucle
Código PHP:
for(04i++){
    
crearGrandes(i);

La función es la siguiente:

Código PHP:
function crearGrandes(num:Number){
     var 
fotoP:MovieClip lienzo_grandes.createEmptyMovieClip("fotoP_" numlienzo_grandes.getNextHighestDepth());
     var 
contenedorP:MovieClip fotoP.createEmptyMovieClip("contenedorP"1);
     var 
mclP:MovieClipLoader = new MovieClipLoader();
     var 
listenerP:Object = new Object();

     
mclP.addListener(listenerP);
     
mclP.loadClip("imagenes/galeria/grandes/" ".jpg"contenedorP);

      
listenerP.onLoadInit = function(target_mc:MovieClip) {
      
//No entiendo lo siguiente, si yo hago:
          //Primera iteración, num = 0;
          
anchos[num] = target_mc._width  // anchos[0] = 480
          
trace(anchos[num 1]); // anchos[-1] = undefined, bien.
           
...
           
//Posiciono cada imagen con _x e _y;
           
...
           
//Segunda iteración, num  = 1;
           
anchos[num] = target_mc._width // anchos[1] = 270;
          
trace(anchos[num 1]); // anchos [0] = 480;
          //cuando devuelve: anchos[0] = undefined;  
       
};

Si no encuentran solución, ¿se les ocurriría una forma más sencilla de poder conseguir el ancho de la imagen anterior?, gracias por vuestra ayuda de verdad y perdonen mi ignorancia llevo 1 mes y poco con esto todavía tengo mucho que aprender :).
  #7 (permalink)  
Antiguo 24/04/2009, 09:12
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Respuesta: Restar indice a un array

Hola RM13 !

El problema se encuentra en la parte donde añades el listener.

Los eventos se ejecutan de manera asincrónica, esto quiere decir, cuando se llame a la función crearGrandes, el método onLoadInit no se llamará inmediatamente, se ejecutará hasta que la imagen sea cargada completamente, entonces no tienes un control total en el orden de ejecución, puede ser que primero sea completada la imagen 2 y luego la imagen 3 y por último la imagen 0, así que el vector no te será de utilidad para saber el ancho anterior.

Lo que te recomiendo es que vayas cargando imagen por imagen, primero cargas la imagen 0, cuando esta sea completada, pasas a la siguiente imagen y así sucesívamente, en esta situación si que podrías utilizar el vector para ir almacenando los anchos de cada una de las imágenes para saber el ancho anterior porque tendrías un control total en el orden de carga.

Un saludote !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #8 (permalink)  
Antiguo 24/04/2009, 10:48
 
Fecha de Ingreso: enero-2009
Mensajes: 24
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Restar indice a un array

Buenas de nuevo, siento deciros que sigue sin funcionar y empiezo a pensar en tirar la toalla e intentar otra cosa, jeje ya llevo un par de días con esto y no le veo solución .
Al fin he comprendido lo que me has explicado, de hecho yo posicionaba las imagenes en el onLoadInit, y comenzaba posicionando la ultima y terminaba en la primera no entendía porqué ahora ya lo entiendo, de hecho las he posicionado en el onLoadComplete y comienzo por la primera y termina por la última .

Bien sobre lo que me recomendabas de hacer, he intentado lo siguiente, con igual resultado:

Cita:
var cargados:Number;
var total:Number;

listenerP.onLoadProgress = function(bytesLoaded:Number, bytesTotal:Number){
cargados = bytesLoaded;
total = bytesTotal;
};

listenerP.onLoadInit = function(target_mc:MovieClip) {
if (cargados == total){
anchos[num] = target_mc._width;
}

};

listenerP.onLoadComplete = function(target_mc:MovieClip){
trace("anchos[" + num + "] = " + anchos[num - 1]); // Devuelve los undefined
// Y aqui posiciono de acuerdo con anchos[num - 1])
};
Parece un rompecabezas, me quieren hacer la puñeta jeje, solo reconoce los anchos en el onLoadInit.
En onLoadProgress y onLoadComplete valen 0.

No sé si es exactamente a lo que te referías que hiciera, ¿sabrias ponerme un ejemplo?, la verdad me interesa que sea así porque también tengo pensado meter unos preloaders en el onLoadProgress.

Gracias de nuevo y repito perdonen mi ignorancia llevo muy poquito con esto jeje, un saludo.
  #9 (permalink)  
Antiguo 24/04/2009, 11:41
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Respuesta: Restar indice a un array

Cita:
Iniciado por RM13 Ver Mensaje
Buenas de nuevo, siento deciros que sigue sin funcionar y empiezo a pensar en tirar la toalla e intentar otra cosa, jeje ya llevo un par de días con esto y no le veo solución .
Al fin he comprendido lo que me has explicado, de hecho yo posicionaba las imagenes en el onLoadInit, y comenzaba posicionando la ultima y terminaba en la primera no entendía porqué ahora ya lo entiendo, de hecho las he posicionado en el onLoadComplete y comienzo por la primera y termina por la última .

Bien sobre lo que me recomendabas de hacer, he intentado lo siguiente, con igual resultado:


Parece un rompecabezas, me quieren hacer la puñeta jeje, solo reconoce los anchos en el onLoadInit.
En onLoadProgress y onLoadComplete valen 0.

No sé si es exactamente a lo que te referías que hiciera, ¿sabrias ponerme un ejemplo?, la verdad me interesa que sea así porque también tengo pensado meter unos preloaders en el onLoadProgress.

Gracias de nuevo y repito perdonen mi ignorancia llevo muy poquito con esto jeje, un saludo.
Te hago una pequeña modificación al código para que se haga una por una:

Código actionscript:
Ver original
  1. var anchos:Array = new Array();
  2. var counter:Number = 0;
  3. var MAX_LIMIT:Number = 3;
  4. crearGrandes(counter);
  5.  
  6. function crearGrandes(num:Number) {
  7.     var fotoP:MovieClip = lienzo_grandes.createEmptyMovieClip("fotoP_"+counter, lienzo_grandes.getNextHighestDepth());
  8.     var contenedorP:MovieClip = fotoP.createEmptyMovieClip("contenedorP", 1);
  9.     var mclP:MovieClipLoader = new MovieClipLoader();
  10.     var listenerP:Object = new Object();
  11.  
  12.     mclP.addListener(listenerP);
  13.     mclP.loadClip("grandes/"+counter+".jpg",contenedorP);
  14.  
  15.     listenerP.onLoadInit = function(target_mc:MovieClip) {
  16.         anchos[counter] = target_mc._width;
  17.         trace(anchos[counter - 1]);
  18.         counter++;
  19.         if(counter <= MAX_LIMIT) {
  20.             crearGrandes(counter);
  21.         }
  22.     };
  23. }

La variable counter es solamente un contador para ir incrementándola hasta llegar al límite que es almacenado en la constante MAX_LIMIT, cada vez que entra al método onLoadInit incrementa el contador y ve si no ha llegado al limite para no seguir llamando a la función cargarGrandes.

Un saludote !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #10 (permalink)  
Antiguo 27/04/2009, 04:34
 
Fecha de Ingreso: enero-2009
Mensajes: 24
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Restar indice a un array

Rebuenas!, siento no haber podido contestar antes, no he tocado el ordenador en todo el fin de semana, funciona 100% y sin modificar mi código apenas !, eres un fenómeno, 16 millones de gracias, un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:27.