Comunidad de diseño web y desarrollo en internet online

Arrays de mc's - problemas

Citar            
MensajeEscrito el 05 Jul 2007 12:02 am
buenas
tengo este codigo

Código :

   for (var i:Number = 0; i < meteorito_array.length; i++) {
      for (var s:Number = 0; s < meteorito_array.length; s++) {
         if(i != s){
            if (meteorito_array[i].hitTest(meteorito_array[s])) {
               meteorito_array[i].removeMovieClip();
               meteorito_array.splice(i,1);
               meteorito_array[s].removeMovieClip();
               meteorito_array.splice(s,1);
            }
         }
      }
   }


lo que quiero hacer es revizar cada elemento del array entre si y ver si se tocan con hitTest pero comprobe q la cantidad de cuentas que tiene que hacer es MUCHA, si tengo solo 15 elementos, tiene uqe hacer (15^2)*30 (15*15*30) el 30 es de los frames por segundo osea mas de 6750 cuentas por segundo, habria alguna otra forma de hacerlo mas eficiente esto? porque la verdad se enlentece muchisimo.

desde ya muchas gracias

slds!

Por Benutti

188 de clabLevel

1 tutorial

 



Ultima edición por Benutti el 05 Jul 2007 02:28 am, editado 1 vez

NutT

msie
Citar            
MensajeEscrito el 05 Jul 2007 09:51 am
Hay una discusión útil sobre ese tema:
http://www.cristalab.com/foros/viewtopic.php?t=28259

Aparte de eso ralentizas el proceso al meter la longitud en cada paso por el for:
for (var i:Number = 0; i < meteorito_array.length; i++) {
mejor asignar y entrar al bucle:
long = meteorito_array.length;
for (var i:Number = 0; i <long ; i++) {

En cuanto a colisiones de múltiples objetos, todo depende de la precisión que desees.
Además la lógica de búsqueda que haces es redundante..
El bucle doble sería:

Código :

long = meteorito_array.length;
for (var i:Number = 0; i < long; i++) {
      for (var s = i+1; s < long; s++) {
            if (meteorito_array[i].hitTest(meteorito_array[s])) {
               meteorito_array[i].removeMovieClip();
               meteorito_array.splice(i,1);
               meteorito_array[s].removeMovieClip();
               meteorito_array.splice(s,1);
           }
     }
}

Quizás con esa simple variación sea suficiente ( es unas 80 veces más rápida que la que propones)

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 05 Jul 2007 05:33 pm
Benutti toma muy en cuenta las recomendaciones de Teseo, el es experto en hacer magia con pocas líneas de código.

Por otro lado, Teseo, en los bucles con Arrays, y donde eliminas elementos, es importante cuando eliminas uno de los elementos bajar el contador y el total, por que si no te estarías brincando uno de los elementos, y harías un desbordamiento de índice.

Ejemplo, SIN hacer el fix que propongo:

Código :

var arr:Array = ["uno","dos","tres","cuatro"];
var i:Number=0;
var Total:Number = arr.length;
for(i=0; i<Total; i++)
{
   trace(arr[i])
   if(arr[i] == "dos")
   {
      arr.splice(i,1);
   }
}


Con el fix que sugiero:

Código :

var arr:Array = ["uno","dos","tres","cuatro"];
var i:Number=0;
var Total:Number = arr.length;
for(i=0; i<Total; i++)
{
   trace(arr[i])
   if(arr[i] == "dos")
   {
      arr.splice(i,1);
      i--;
      Total--;
   }
}


Como vemos en mi ejemplo si cuenta todos los elementos y no se desborda, en el otro código, se desborda e ignora el tercer elemento.


Saludos :wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 05 Jul 2007 07:02 pm
Cierto!! no tuve en cuenta que usa .splice y al volver puede faltar un elemento. :crap:

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox

 

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