Comunidad de diseño web y desarrollo en internet online

Problema al intentar eliminar item de array

Citar            
MensajeEscrito el 30 Ago 2008 09:03 pm
Hola a todos,
estoy haciendo un pequeño carrito de la compra. Tengo varios productos que al selecionar cada uno te da la opción de añadirlo al carrito. Una vez en el carrito cada producto tiene un botón que te permite eliminarlo del carrito. Bien; el problema es que ese botón que elimina cada elemento, en lugar de eliminar el producto al que corresponde me elimina el primer producto, es decir, el primer item del array.

He probado con delete, shift, splice... Tengo una variable que es la que cambia en cada createEmptyMovieClip, pero cuando intento decirle al script que es la entrada de esa variable la que quiero eliminar sólo elimina la primera.


Código :

stop();
fotosy = 0;
textosy = 36;
borrary = 15;
altofotos = 65;
cancely = 10;
cancelx = 310;
cancelar = "elementos/cancel.png";
for (i=0; i<fotos.length; i++) {
   if (fotos[i] == find) {
      fotos.splice(i,2);
   }
   cargaimagen();
   cargatexto();
   cargapapelera();
}
function cargaimagen() {
   item = this.createEmptyMovieClip(i, getNextHighestDepth());
   var numfoto = fotos[i];
   item.createEmptyMovieClip("contenedor",getNextHighestDepth());
   item.contenedor.loadMovie("elementos/mini_"+numfoto+".jpg",getNextHighestDepth());
   item._y = fotosy;
   fotosy += altofotos;
}
function cargatexto() {
   texto_cont = this.createTextField(i, getNextHighestDepth(), 100, textosy, 60, 60);
   var texto = textos[i];
   texto_cont.text = texto;
   textosy += altofotos;
}
function cargapapelera() {
   item.createEmptyMovieClip("contenedor2",getNextHighestDepth());
   item.contenedor2.loadMovie("elementos/cancel.png",getNextHighestDepth());
         item.onRelease = function() {
         play();
         fotos.shift(numfoto);
   }
   item.contenedor2._y = cancely;
   item.contenedor2._x = cancelx;
}


No sé qué hago mal. Ayuda por favor.

Por Barri

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Ago 2008 09:13 pm
Este código que posteas, donde lo tienes situado?
Cual es el código o función que ejecuta cada una de las imágenes al ser removida del carrito?
Quién es la variable "find"?, no veo donde se declara ni donde toma valor.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 31 Ago 2008 06:29 am
Hola,

1.
este código lo tengo en el fotograma 2 de un mc. En el fotograma 1 tengo la declaración de las matrices. Cuando la película comienza declara las matrices, después se para en el fotograma 2 (que es el que tiene el código posteado) y cuando haces click en uno de los mc creados dinámicamente se ejecuta (en teoría) el código que elimina el item y la película pasa al fotograma 3 que tiene un gotAndStop (2).

2.
El código que se ejecuta al eliminar la imagen es todo el código que he posteado, porque cuando presionas una imagen se ejecuta este código:

item.onRelease = function() {
//esto lleva la película al fotograma 3 donde está el gotAndStop(2) que vuelve a leer los array y crea tantos mc como campos hay en el array.
play();
//esto tiene que eliminar el item del array que corresponde a cada mc creado. La variable numfoto me da el número que después utilizaré para eliminar uno mc u otro.
fotos.shift(numfoto);
}

3.

if (fotos[i] == find) {
fotos.splice(i,2);
}

Esta condición lo que hace es borrar los campos del array que estan "undefined" para que no haya espacios en blanco cuando se vuelvan a cargar los mc.

No sé si he sido claro. Gracias por tu interés.

Por Barri

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 31 Ago 2008 12:01 pm
Muy complicado y de seguro propenso a muchos herrores, mira aquí tienes un ejemplo con unos prototypes que he creado, donde hay "x" movies en la escena con nombre de instancia "mov0", "mov1", "mov2", etc... también hay en la escena un MovieClip llamado carrito, si arrastro los movies y los sitúo encima de carrito se añade el valor de cada movie (guardado en el arreglo valores) al arreglo que contiene que movies se han añadido al carrito (added), si lo saco fuera de este se elimina el valor del arreglo:

Código ActionScript :

//---Arreglo con el valor de cada movie
var valores:Array = new Array("azul", "rojo", "amarillo", "verde", "marron", "rosa");

//---Arreglo que guarda los valores añadidos al carrito
var added:Array = new Array();

//---Acciones de los movies
for(var i:Number = 0; i < valores.length; i++){
   
   this["mov" + i].numero = i;   
   this["mov" + i].onPress = function():Void{      
      this.startDrag();
      this.swapDepths(_root.getNextHighestDepth());
   }
   
   this["mov" + i].onRelease = function():Void{      
      stopDrag();
      
      if(this.hitTest(_root.carrito)){         
         added.addToArray(valores[this.numero]);         
      }else{         
         added.deleteToArray(valores[this.numero]);         
      }
      
      trace(added);
      
   }
   
}

//---Prototype de añadir
Array.prototype.addToArray = function(valor):Void{
   
   if(this.indexOf(valor) < 0){
      
      this.push(valor);
      
   }
   
}

//---Prototype de eliminar
Array.prototype.deleteToArray = function(valor):Void{
   
   var index:Number = this.indexOf(valor);
   
   if(index >= 0){
      
      this.splice(index, 1);
      
   }
   
}

//---Prototype de indexOf
Array.prototype.indexOf = function(search):Number{ 
    
   var total:Number = this.length; 
   var index:Number = -1; 
   var item:Number = 0; 
   var finded:Boolean = false; 
    
   while(item < total && !finded){
       
      if(this[item] == search){           
         index = item; 
         finded = true;           
      }else{           
         item++;           
      }        
   } 
    
   return index; 
    
} 


Cada vez que se suelta un movie he mandado a hacer un trace del arreglo added para que notes si se ha añadido o se ha eliminado.

Para tu trabajo puedes usar los protitypes que he creado:

addToArray añade un valor mandado como parámetro a un arreglo si este valor no se encuentra contenido en el arreglo.
deleteToArray elimina un valor enviado como parámetro de un arreglo si es que se encuentra.
Y ambos prototypes utilizan el prototype indexOf para saber si el valor se encuentra o no en el arreglo.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 31 Ago 2008 03:20 pm
Ahora mismo lo pruebo. Gracias.

Por Barri

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 31 Ago 2008 10:41 pm
Hola,

lo estoy intentando adaptar para que cree los clips dinámincamente (esto lo he conseguido), pero no consigo asignar acciones a los clips. No lo entiendo porque tienen el mismo nombre de instancia que el nombre de los clips de tu código.

Código :

stop();
fotosy = 0;
textosy = 36;
borrary = 15;
altofotos = 65;
var valores:Array = new Array("1","2","3","4","5","6","7","8","9","10","11");
var added:Array = new Array();
for (var i:Number = 0; i<valores.length; i++) {
   var numfoto = valores[i];
   this.createEmptyMovieClip("mov"+i, getNextHighestDepth());
   this["mov"+i].loadMovie("elementos/mini_"+numfoto+".jpg",getNextHighestDepth());
   this["mov"+i]._y = fotosy;
   fotosy += altofotos;
   this["mov"+i].numero = i;
   this["mov"+i].onRelease = function():Void  {
      added.deleteToArray(valores[this.numero]);
      trace(added);
   };
}
//---Prototype de añadir 
Array.prototype.addToArray = function(valor):Void  {
   if (this.indexOf(valor)<0) {
      this.push(valor);
   }
};
//---Prototype de eliminar 
Array.prototype.deleteToArray = function(valor):Void  {
   var index:Number = this.indexOf(valor);
   if (index>=0) {
      this.splice(index,1);
   }
};

//---Prototype de indexOf 
Array.prototype.indexOf = function(search):Number  {
   var total:Number = this.length;
   var index:Number = -1;
   var item:Number = 0;
   var finded:Boolean = false;

   while (item<total && !finded) {
      if (this[item] == search) {
         index = item;
         finded = true;
      } else {
         item++;
      }
   }
   return index;
};


¿qué hago mal?

Por Barri

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 31 Ago 2008 11:43 pm
Ya he solucionado el último problema.

Código :

for (var i:Number = 0; i<valores.length; i++) {
   var numfoto = valores[i];
   var mc = this.createEmptyMovieClip("mc"+i, i);
   mc.createEmptyMovieClip("mov"+i,1);
   mc.onRelease = function() {
      trace("hecho");
   };
   mc["mov"+i].loadMovie("elementos/mini_"+numfoto+".jpg",getNextHighestDepth());
   mc["mov"+i]._y = fotosy;
   fotosy += altofotos;
   mc["mov"+i].numero = i;



}


Sigo adaptando. A ver lo que pasa...

Por Barri

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Sep 2008 02:39 am
No soy capaz de encontrar la variable

Código :

this["mov" + i].numero = i;


Como he tenido que crear un mc (llamado mc) dentro de otro (this), ha cambiado la ruta. Intento con esta

Código :

this.mc["mov" + i].numero = i; 


y cuando hago un trace me saca undefined.

Por Barri

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Sep 2008 11:36 am
Lo primero que preguntas es por qué no puedes asignar acciones a los clips, bueno como estás usando loadMovie, el el momento de leer el clip está vacío por lo tanto no puedes asignar las acciones en ese momento ya que cuando leea el nuevo contenido las perderá, lo más recomendable es utilizar movieClipLoader.loadClip en vez de MovieClip.loadMovie, y así puedes saber cuando la imagen se ha cargado y entonces darle acciones.

Veo que lo has resuelto creando movieClips contenedores y dándole las acciones a estos y leyendo las imágenes dentro de otros movieClips que se encuentran dentro de los primeros, de esta forma el movieClip contenedor no pierde las acciones.

Ahora por qué la variable te da undefined, porque no creaste un movieClip llamado mc, lo que nombraste mc fue a la variable que representa a cada movieClip dentro de tu ciclo, según tu código:

Código ActionScript :

var mc = this.createEmptyMovieClip("mc"+i, i);


Creaste "n" movieClips con nombre de instancia "mc0", "mc1", "mc2", etc... por lo que el camino a la variable debería ser:

Código ActionScript :

this["mc" + unNumero]["mov" + unNumero].numero; 


Ahora, todo esto es muy complicado. Una manera más sencilla es que a la hora de crear los movies:

Código ActionScript :

mc.createEmptyMovieClip("mov"+i,1);


No tienes que diferenciarlos en nombre, ya que los clips "mc0", "mc1", "mc2", etc... tendrán dentro un solo movieClip, por lo que la sintaxis podría ser esta:

Código ActionScript :

for (var i:Number = 0; i<valores.length; i++) {

   var numfoto = valores[i];

   var mc:MovieClip = this.createEmptyMovieClip("mc"+i, i);

   //---Creo un movieClip de nombre "mov" dentro de cada clip   
   var mov:MovieClip = mc.createEmptyMovieClip("mov", 1);

   mc.onRelease = function():Void{

      trace(this.numero);

   };

   mc.mov.loadMovie("elementos/mini_"+numfoto+".jpg"); //Esta instrucción no lleva depth
   mc._y = fotosy;
   fotosy += altofotos;

   mc.numero = i;

}


El problema es que la variable la debes crear dentro de "mc0", "mc1", "mc2", etc... que son los clips que tienen las acciones, no dentro de los movies, así podrías capturarla como this.numero cuando presiones los movies.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 01 Sep 2008 12:24 pm
Gracias. Con esta última indicación me va perfecto. Ahora voy a intentar que se reordenen automáticamente los item del carrito.

Ya te cuento cómo me ha ido.

Por Barri

18 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Jun 2009 04:15 pm
:( soy nuevo en esto del AS
siempre lo he hecho manual jeje y espero no molestarlos con mis preguntas

estoy tratando de crear mediante AS, una serie de movies que almacenen un respectivo SWF cada uno.. y mediantele le menu pues e manden llamar y tengan sus animaciones de entrada y salida. todo normal, no?
entonces necesito tener acceso a las movies para mediante variables banderas pues saber cuando aplicarle la animacion de salida..

segun este post.. tomando partes jeje

Código ActionScript :

for (var i:Number = 1; i<4; i++) { 
  
   var mc:MovieClip = this.createEmptyMovieClip("mc"+i, i); 
 
   //---Creo un movieClip de nombre "mov" dentro de cada clip    
   var mov:MovieClip = mc.createEmptyMovieClip("mov", 1); 
 
   mc._x = 350;
   mc._y = i * 150;


} 


todo bien.. funciona, crea movicelips..y dentro de ellas movies para ahi almacenar las swf ( o eso entiendo jaja)
lo que todavía no entiendo es el nombre de las movies, como pode acceder a ellas fuera del ciclo.. y cargar los SWF fuera del mismo, es decir quitando la linea:

Código ActionScript :

mc.mov.loadMovie("mov"+i+".swf"); 


y haciendo algo asi fuera del ciclo

Código ActionScript :

_root.mc.mov.loadMovie(mov1.swfif);


pero obvio en al linea de arriba esta el error ya que no sé como está el hilo..

ojala puedan ayduarme..GRACIAS!!! :oops: :oops:

Por Julinho

5 de clabLevel



 

México

firefox
Citar            
MensajeEscrito el 25 Jun 2009 05:59 pm
jaja ya pude cargar la movies desde afuera de esta manera..

Código ActionScript :

mc1.mov.loadMovie("mov1.swf");
mc2.mov.loadMovie("mov2.swf");
mc3.mov.loadMovie("mov3.swf");



ahora bien, sigo sin poder accesar a las varibles que hay en mov1.swf. en mov1.swf tengo una movie principal que tiene una variable que se llama pos_y cómo puedo accesar a ella para asignarle un valor..??

=) :( :oops:

Por Julinho

5 de clabLevel



 

México

firefox
Citar            
MensajeEscrito el 25 Jun 2009 07:33 pm
@Julinho, este hilo no era específico de tu problema, deberías para la próxima buscar uno que se relacionara con lo que quieres o hacer un hilo nuevo y si quieres dar como referencia este.

En cuanto a tu problema puedes acceder a la variable "pos_y" que hay en el movie "mov1.swf" de esta manera:

Código ActionScript :

mc1.mov.pos_y;


Sólo debes estar seguro que el movie ya ha sido cargado y por lo tanto la variable declarada.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 25 Jun 2009 09:56 pm
Ok disculpa jeje...
probé como me dices no acceso.. :(

abriré un post nuevo para poder tratar ahi el tema =) saludos!!!

Por Julinho

5 de clabLevel



 

México

firefox

 

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