Comunidad de diseño web y desarrollo en internet online

AS3 como duplicar objetos?

Citar            
MensajeEscrito el 23 Nov 2010 10:45 pm
Holas.

Vieras que tengo un problemilla, básicamente no se como duplicar MovieClips u Objectos, Y como así?
En as2 creo que se utilizaba duplicateMovieClip, creo que para as3 ya no tenemos esta opción. Sinceramente
no me preocupa el contenido o las propiedades del objecto, si no mas bien la forma en que se debe programar.
Una forma en que pensaba que podría ser, abarca el siguiente código
Supongamos que este fragmento se encuentra dentro de un EventListener del Stage, que dice cuando, este, cambia
su dimensión..

Código ActionScript :

for (var i:int = 0; i <= 10; i++)
{
   newBox = new Box;                     //Crea el objeto
   listOfMovieClips.push(newBox);     //agrega el objeto a un array
   addChild(newBox);                      //agrega el objeto al stage
   newBox.x = newBox.width * i;      //ubica el ojeto
   //trace(newBox.name);               //me dice el nombre
   removeChild(newBox);                //quita el objeto del stage, pero no lo elimima
}

Y cual es problema?...
1. Diay que la instancia del objeto no se elimina, osea que de golpe se crean como 100 instancias que no se pueden borrar, aunque trate de "desasociarlas", en teoría el GarbageRocolector debería funcar, pero no estoy seguro..
2. Que no puedo borrarlas manualmente con código porque todavía no existen, se crean cuando programa esta ejecutando.
3. Dejelas asi ni se nota.. no puedo, porque el programa va incrementando la memoria.. nada mas.. de 10 en 10 megas..
4. OK, vaya poniendo de 1 en 1, los nuevos objectos, declarados.. no puedo, porque es dimanico.. ademas necesito poder borrar los objetos tambien...
5. Me contradigo..Creo que as3, no permite borrar objetos, entonces necesito clonar un montón, pero no tengo suficiente chakra para lograrlo :lol: :lol:
6. Creo que necesito ayuda del Hokage!!..
porque? termino hablando de un manga, si era una conversación de AS3..
Por alguna razón mientras escribía lo que trato de hacer, me acorde del parecido :cool: :cool: :lol:
que haces?
Estoy tratando de hacer un mosaico con imagenes tipo XML, osea vectores.. por lo que me cuesta tratar de utilizar Bitmap, y bitmadata.. y eso??? . que al final el vector es tipo el objeto que implementa, y no tipo bitmap que es el se requiere... tonces lo agregue a un Sprite... sip, ya he visto bitmaps en MC o sprites pero no puedo incluir un sprite dentro de un bitmat.... no le veo salida

hey..agradezco Sugerencias, ayudas..

Saludos Cordiales,

Fred :)

Por chino2040

54 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 Nov 2010 08:36 am
Pues veamos..

Primero que nada, no tiene sentido hacer addChild y removeChild en el mismo bucle. Si quieres eliminar yo usaría una sentencia antes que limpie el escenario para luego volver a crearlo (Si realmente lo necesitas y no puedes meramente modificar los objetos ya creados). Algo como:

Código ActionScript :

private var num:uint = listOfMovieClips.length;
private var contenedor:Sprite = new Sprite();
private var newBox:Box;
private var listOfMovieClips:Array = [];
if(num > 1)
{
   for (var j:uint = 0; j <= num; j++) 
   {
   contenedor.removeChild(listOfMovieClips[j]);   
   }
   listOfMovieClips = [];
}
for (var i:uint = 0; i <= 10; i++) 
{ 
   
   newBox = new Box();
   listOfMovieClips.push(newBox);
   contenedor.addChild(newBox);
   newBox.x = newBox.width * i;
 }
 newBox = null;


También tienes como opción usar try/catch, numChildren para evaluar cantidad de "hijos" en un contenedor, etc.
Además yo usaría un container, no directo el stage.

Más allá de eso, el GB se hará disponible del objeto cuando este pierda toda referencia a objetos o el DisplayObject. En otras palabras, en tú caso, cuando no esta en contenedor o dentro del Array. SIN EMBARGO, no es un proceso automático, el GB lo hará cuando determine es bueno y necesita la memoria.

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 24 Nov 2010 01:42 pm
Gracias Hernan, me disculpo por no especificar bien. el codigo que utilize es solo para demostrar que no funcaba el GR, y sip es mas razonable poner el objeto dentro un container o sprite en este caso. Vieras que tambien hice lo de ponerlo null, de igual forma para quitarle la referencia, pero sigue sumandole memoria. Ahora as3 no puede quitarlos..

Gracias por el ejemplo... este es el que me esta sirviendo ahora...
Increible lo resolviste!!
100000000000000000000 AMAZING!!!!
:D :D :D :D :D :D :D :D :D :D

Por chino2040

54 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 Nov 2010 09:47 pm
puedes forzarla

propiead=null
System.gc lanzado cuando tu quieras

claro que hay algo que pasa.....descubrelo por ti mismo VERAS LA VERDAD

Por xcom

Claber

530 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Nov 2010 09:54 pm
¿...que solo funciona en modo debugger tal vez? ;)

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

opera
Citar            
MensajeEscrito el 25 Nov 2010 10:44 pm
Nop, siguiendo el consejo de Hernan con respecto a utilizar numChildren, me fue mas facil determinar como funcaba el recolector de basura, y parece que esta en todas! Ya puede duplicar los MC y luego quitarlos a placer!, aunque si note algo, parace que flash le asigna un unico ID a todos las instancias que creas... lo jodido pienso yo, es accesarlas por este medio en tiempo de ejecucion... pero igual no es importante...
100's por los consejos!

incluyo las lineas que utilice para valerme de testearlas, nada del otro mundo

saludos cordiales!

Código ActionScript :

package tester
{
   import nl.demonsters.debugger.MonsterDebugger;
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.events.MouseEvent;

   public class Main extends Sprite
   {
      private var debugger:MonsterDebugger;
      private var box:Sprite;
      private var container:Sprite = new Sprite();
      private var cont:int = 0;

      public function Main():void
      {
         if (stage) init();
         else addEventListener(Event.ADDED_TO_STAGE, init);
      }

      private function init(e:Event = null):void
      {
         debugger = new MonsterDebugger(this);
         removeEventListener(Event.ADDED_TO_STAGE, init);
         // entry point
         stage.addEventListener(MouseEvent.MOUSE_MOVE, attachMovieclip);
         stage.addEventListener(MouseEvent.CLICK, clearContainer);
      }
      private function attachMovieclip(e:MouseEvent):void
      {
         box = new Sprite();
         box.graphics.beginFill(0x45C0ED);
         box.graphics.drawCircle(0, 0, 10);
         box.x = e.stageX - (box.width/2);
         box.y = e.stageY - (box.height/2);
         container.addChild(box);
         addChild(container);
      }
      private function clearContainer(e:MouseEvent):void
      {
         var num:int = container.numChildren-1;
         //trace(container.numChildren);
            for (var i:int = 0; i <= num ; i++) {
               container.removeChildAt(0);
            }
      }
   }
}

Por chino2040

54 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Nov 2010 10:55 pm
Mi comentario estaba relacionado con lo dicho por xcom y forzar el garbageCollector en modo debugger, nos fuimos un poco del tema :)

System.gc

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 26 Nov 2010 02:50 am

Lukánicos escribió:

Mi comentario estaba relacionado con lo dicho por xcom y forzar el garbageCollector en modo debugger, nos fuimos un poco del tema :)

System.gc


ehhh, no en realidad esta bien, no sabia de la existencia de esta referencia.
ademas, mejor porque asi puedo tener mas controlado el funcionamiento de la aplicacion...
Nota positiva, los voy a tener en cuenta :lol: :lol: :lol:

100's :cool: :cool: :cool: :cool: :cool:

Por chino2040

54 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 Nov 2010 04:18 am

xcom escribió:

puedes forzarla

propiead=null
System.gc lanzado cuando tu quieras

claro que hay algo que pasa.....descubrelo por ti mismo VERAS LA VERDAD


buenisimo! Increible!.... :cool: :cool: :lol: :lol: :lol:

Código ActionScript :

   private function system(e:Event):void
   {
      System.gc();
   }

Por chino2040

54 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 Nov 2010 04:45 am
Como comentario, usar System.gc() no es una buena práctica, ya que solo sirve en entornos de debugging, y no debería ser buena idea depender de la misma.

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 26 Nov 2010 10:12 am
BuenAS

+1 a lo dicho por Hernán.

Es para utilizar cuando estás depurando una aplicación. Te ayuda a la hora de ir testeando cómo se llena la memoria al instanciar determinadas clases, etc y poder vaciarla cuando inicias el testeo. En Flash Builder, incluso se puede hacer de forma gráfica, cuando se lanza un profiling.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 26 Nov 2010 03:47 pm
Thksss!!

Por chino2040

54 de clabLevel



 

firefox

 

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