Comunidad de diseño web y desarrollo en internet online

Borrar un elemento especifico de array

Citar            
MensajeEscrito el 22 Feb 2010 04:30 am
Hola, mientras le movia a mi jueguito me tope con que si borro un MC que esta dentro de un array se me echan a perder mis otros MCs como que se borra todo el array y como mis "edificios" estan en mi array pues ya no funciona nada, intente usando pop, splice, pero no, con splice me borra todo y con pop me borra el ultimo y pues no es el que quiero borra :I.

Código :

onEnterFrame = function () {
   trace(num);
   for (i=0; i<num.length; i++) {
      num[i].onPress = function() {
         _root.attachMovie("menu2", "menu2", a+1);
            _root.menu2.cerrar.onRollOver = function() {
            _root.menu2.cin.text = "demoler edificio?";
         };
         _root.menu2.cerrar.onPress = function() {
            removeMovieClip(num[num.length-1]);
            num.pop(num[num.length-1])
         };
      };
   }
};


Creo que mi error esta en no saber referirme al num[i] que estoy presionando, no puedo ponerle this porque me referiria a cerrar U_U. Ayuda porfi :)
Gracias

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 22 Feb 2010 07:21 am
Pues corta el array desde el principio al elemento, y desde el elemento al final, y luego uneles (Concat)

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

firefox
Citar            
MensajeEscrito el 22 Feb 2010 06:15 pm
:o, es que el problema era que no sabia como referirme al "elemento", pero ya lo resolvi, ta facil -_-

Código :

 num[i].onPress = function() {
clip = this
Y
removeMovieClip(clip)

U_U, Gracias

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 22 Feb 2010 06:24 pm
Ah pero quedan muchas comitas, probare con lo que dices, ahora que ya se como referirme U_U

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 22 Feb 2010 07:11 pm
Bueno, segun lo que tengo entendido de lo que dices es esto:

Código :

cosa1 = num.slice(0, clip)
cosa2 = num.slice(clip,-1)
num.concat(cosa1,cosa2)

Mas o menos, no?
Donde clip es igual a this que vendria siendo el MC que presione.
Mi problema ahora son las comitas, cuando borro el MC con mi codigo

Código :

_root.menu2.cerrar.onPress = function() {
         removeMovieClip(clip);
         };

El array num me queda asi:
_level0.e2,_level0.e3,,_level0.e5
_level0.e2,_level0.e3,,
_level0.e2,_level0.e3,,
_level0.e2,,,
Tengo idea que lo que tu dices si funcionaria, corto de 0 al elemento antes de clip y del elemento despues de clip hasta el ultimo, entonces no dejaria comas, pero como :I?
Gracias

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 22 Feb 2010 07:43 pm
Hola,
una idea: si vas a usar a menudo ese borrado de un elemento de un array, puedes añadir un método nuevo a la clase Array (aunque no sea muy recomendable hacer este tipo de cosas):

Código ActionScript :

//Creamos el nuevo método para la clase Array:
Array.prototype.deleteElement = function(index:Number):Array
{
   return this.slice(0, index).concat(this.slice(index + 1));
}

//Ahora podemos usarlo como si fuese un método nativo:
var arr:Array = [ m0, m1, m2, m3, m4, m5 ];
trace(arr);
trace(arr.deleteElement(2)); //Borra el elemento 2

Si sólo vas a usar la función una vez, mejor hacerlo como dice Hernán:

Código ActionScript :

var arr:Array = [ m0, m1, m2, m3, m4, m5 ];
arr = arr.slice(0, 2).concat(arr.slice(3)); //Borra el elemento 2
trace(arr);

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Feb 2010 06:33 am
=/! No puedo adaptarlo a mi codigo :I miren lo que hago:

Código :

num = num.slice(0, clip).concat(num.slice(clip+1));

Lo que me di cuenta despues es que estoy hablando del elemento y no el numero, quiza por eso no funcione(o toy haciendo una tonteria), creo que es lo que necesito, saber el numero del que estoy agarrando, saben como? :I
Y el otro

Código :

Array.prototype.deleteElement = function(index:Number):Array  {
            return this.slice(0, index).concat(this.slice(index+1));
         };
         trace(num);
         trace(num.deleteElement(this));

La verdad en este no hice nada(nadamas sustitui arr por num)si funciona, me elimina el 3 elemento, pero, no se que significa la mitad :I, no sabria como. Si no es mucha la molestia, me explicarian este codigo? :cry:
Gracias

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 23 Feb 2010 01:23 pm

el davo29 escribió:

Lo que me di cuenta despues es que estoy hablando del elemento y no el numero, quiza por eso no funcione(o toy haciendo una tonteria), creo que es lo que necesito, saber el numero del que estoy agarrando, saben como?

xD Acabas de toparte con una de las grandes lagunas de AS2, y es que por extraño que parezca, la clase Array NO TIENE UN MÉTODO PARA BUSCAR UN ELEMENTO. Eso se solucinó en AS3 con la inclusión de "indexOf", pero si quieres hacer una búsqueda en AS2 tienes 2 opciones:
1. Si el tamaño del array no es muy grande (por ejemplo 10 elementos), puedes recorrer el array con un for para comprobar si alguno de los elementos es el que buscas.
2. Si tu array es muy grande (por ejemplo 1000 elementos), lo mejor es implementar una búsqueda binaria (piensa que si estás buscando el elemento que está en la posición 999, con un bucle for tendrías que hacer 999 comparaciones, mientras que con una búsqueda binaria sólo te harían falta 10, aunque te haga falta más memoria). Y ya si tu array tuviese 1 millón de elementos, con el bucle for en el peor de los casos harías 1 millón de comparaciones, mientras que con la busqueda binaria serían tan sólo 20.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Feb 2010 05:58 pm
:o, no espero llegar a 1millon pero si van a ser mas de 10, U_U, como es la busqueda binaria, es el codigo primero que me dijiste? y aunque no, me lo puedes explicar, es que me dio curiosidad lo que se puede hacer y queda bien pro U_U. Porfa
Gracias Gracias :)

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 23 Feb 2010 07:42 pm
Hombre, estéticamente queda más o menos "pro", pero lo suyo sería crear una clase que extienda a Array e incluir ese método.
La busqueda binaria consistiría en crear un array auxiliar que sea una copia del original, pero ordenado e indexado, y para buscar el elemento se haría por mitades comparando si el valor buscado es mayor o menor que el seleccionado, pero ya te digo que depende de los elementos que tenga tu array (¿cuantos tiene el que vas a usar? Si son muchos, creo que por ahí tengo un código con búsqueda binaria en AS2).
Para buscar con un simple bucle, el código sería este:

Código ActionScript :

Array.prototype.deleteObject = function(object:Object):Array
{
   for (var i:Number = 0; i < this.length; i++)
   {
      if (this[i] == object)
      {
         return this.slice(0, i).concat(this.slice(i + 1));
      }
   }
   return this;
}
var arr:Array = [m0, m1, m2, m3, m4, m5];
trace(arr);
trace(arr.deleteObject(m1));

Y la explicación más o menos sería esta:

Código ActionScript :

//Con Array.prototype podemos añadir un nuevo método a la clase Array
//en este caso se llamará deleteObject y será una función que acepte
//un parámetro "object", que será el elemento que queremos buscar
Array.prototype.deleteObject = function(object:Object):Array
{
   //con this haces referencia al propio array,
   //(cuando lo crees contendrá los 6 movieclips)
   //luego con este for recorremos todos esos elementos
   for (var i:Number = 0; i < this.length; i++)
   {
      //En caso de que el elemento sea igual al elemento "object"
      //que estamos buscando, entonces es que ese elemento está
      //en la posición "i" del array
      if (this[i] == object)
      {
         //slice(0, i): devuelve un array que contiene desde el elemento 0 hasta i (sin incluirlo)
         //slice(i + 1): al pasarle un sólo parámetro, devuelve desde el elemento i + 1 hasta el final
         //a slice(0, i) le concatenamos slice(i + 1)
         return this.slice(0, i).concat(this.slice(i + 1));
      }
   }
   //Si nuestro array no contiene ese elemento, devuelve el propio array
   return this;
}

//Ahora podemos usarlo como si fuese un método nativo:
var arr:Array = [m0, m1, m2, m3, m4, m5];
trace(arr.deleteObject(m1));

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Feb 2010 11:31 pm
Oh gracias, =) por seguir el post isidoro, tambien gracias Hernan :)

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

firefox
Citar            
MensajeEscrito el 24 Feb 2010 06:33 am
Me estuve buscandole un rato y no puedo =/, tu ejemplo esta claro y lo entiendo, pero solo funciona en los traces, si lo pongo de otra forma no funciona, por ejemplo tu lo pones con un trace:

Código :

trace(arr.deleteObject(m1))//si se borra, pero en  el trace

Con este se comprueba que lo modifica una vez, o no se como explicarlo o_0

Código :

Array.prototype.deleteObject = function(object:Object):Array  {
   for (var i:Number = 0; i<this.length; i++) {
      if (this[i] == object) {
         return this.slice(0, i).concat(this.slice(i+1));
      }
   }
   return this;
};
var arr:Array = [m0, m1, m2, m3, m4, m5];
trace(arr);
trace(arr.deleteObject(m0));
trace(arr);

De la manera que no funciona

Código :

Array.prototype.deleteObject = function(object:Object):Array  {
   for (var i:Number = 0; i<this.length; i++) {
      if (this[i] == object) {
         return this.slice(0, i).concat(this.slice(i+1));
      }
   }
   return this;
};
var arr:Array = [m0, m1, m2, m3, m4, m5];
arr.deleteObject(m0);
trace(arr);

Intente acomodando el codiguillo en todos lados(en mi codigo, los de arriba son aparte), dentro del press, en el enterFrame, en todos lados =I, pero como lo dije aca arriba se modifica muy extrañamente, como si arr fuera un array y arr.deleteObject, fuera otro U_U.
Y mi array, se supone que va a ser una ciudadsita, se van a guardar los edificios, a lo mas unos 200 creo, si logro terminar mi jueguito U_U. Por si quieres pasarme el codigo binario que dices :o.
Si gustas seguir ayudandome(que te lo agradezco :)) podrias checar si es cierto eso que digo del trace, o a la mejor estare haciendo algo mal :(.
Gracias tyty

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8
Citar            
MensajeEscrito el 24 Feb 2010 07:43 am
deleteObject no modifica el array, sino que devuelve una copia sin el elemento, de modo que tienes que poner:

Código ActionScript :

arr = arr.deleteObject(m0);

Buscaré a ver si encuentro el código binario

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Feb 2010 08:59 am
Lo he encontrado. Lo he modificado un poco para que tu ejemplo, espero que funcione (nota: si no recuerdo mal, creo que todas las instancias de tus clips tienen que tener nombres diferentes):
Primero creas una clase llamada ArrayHash:

Código ActionScript :

class ArrayHash
{
   private var hashTable:Array;
   
   public function ArrayHash(array:Array)
   {
      hashTable = new Array(array.length);
      for (var i:Number = 0; i < array.length; i++)
      {
         hashTable[i] = new Array(2);
         hashTable[i][0] = array[i]._name;
         hashTable[i][1] = i;
      }
      hashTable.sortOn(0);
   }
   
   public function searchIndex(object:Object):Number
   {
      return binarySearch(0, hashTable.length -1, object._name);
   }
   
   private function binarySearch(lo:Number, hi:Number, name:String):Number
   {
      var middle:Number = Math.round((lo + hi) / 2);
      if (name == hashTable[middle][0]) return hashTable[middle][1];
      else if (name < hashTable[middle][0]) hi = middle - 1;
      else if (name > hashTable[middle][0]) lo = middle + 1;
      if (middle == lo) return -1;
      return binarySearch(lo, hi, name);
   }
}


Y para usarlo:

Código ActionScript :

import ArrayHash;

Array.prototype.deleteElement = function(index:Number):Array
{
   if (index < 0) return this;
   return this.slice(0, index).concat(this.slice(index + 1));
}

var arr:Array = [ mc2, mc0, mc3, mc5, mc4, mc1 ];
var arrayHash:ArrayHash = new ArrayHash(arr);
arr = arr.deleteElement(arrayHash.searchIndex(mc3));

trace(arr);

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Feb 2010 06:15 pm
:0!!, Gracias gracias,no se me habia ocurrido eso, es que pense que no pasaba nada sino estaba en el trace y me puse de tercon con eso nunca e me vendria a la imaginacion que podia hacer eso de arr = arrdeleteoject.
Graciass :)!
Ah y el ultimo codigo no supe como importarlo, medecia que lo pusiera en as externo, cree un archivo de AS externo y lo llame ArrayHash, y en el codigo de mi jueguito le puse de todo, import el #include, con comillas sin comillas, el ArrayHas.as esta en mis archivos donde tengo mi jueguito no se cual pudo ser el error, pero ya con el arr = arr, ya tengo lo que queria, voy a estudiar el codiguito ultimo, porque esta bien pro U_U asi voy a apantallar gente :0 xD.
Gracias :D :) :) :) =) :) :) :D

Por el davo29

253 de clabLevel



Genero:Masculino  

Chihuahua :D!

msie8

 

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