Mi problema es que en una parte de la aplicación he reutilizado un código de un ejemplo de programación AS3 para hacer una pizarra en la que se pueda pintar con el dedo. El caso es que funciona pero a veces se queda la aplicación colgada (o parada, no se) siempre en el mismo lugar, cuando se borra la pizarra para volver a empezar.
Este código que copié del ejemplo lo modifiqué para que se ejecute de acuerdo a mis necesidades pero las partes importantes permanecen tal cual:
Código ActionScript :
var lines:Array = new Array(); var controlpizarra:Array = new Array(); public function pintar():void { humano = 0; color = color_piza; thickness = grosor_piza; trace(tracesOk + "pintando..."); if (sema_barra == 1) { dibujaTimer(); } addEventListener(TouchEvent.MOUSE_DOWN, downEvent, false, 0, true); addEventListener(TouchEvent.MOUSE_UP, upEvent, false, 0, true); addEventListener(Event.ENTER_FRAME, updater, false, 0, true); } //Actuliza/dibuja las líneas dibujadas. // tuioobj es el blob - se puede ver como se le llama con una petición usando el id del blob. function updater(e:Event):void { if (sema_barra == 1) { calculaTimer(intervalo,empiezaPizarra,esperaPizarra); } for (var i:uint = 0; i < blobs.length; i++) { var tuioobj:TUIOObject=TUIO.getObjectById(blobs[i].id); removeBlob(blobs[i].id); } else if (parent != null) { lines["line"+blobs[i].id].graphics.lineTo(tuioobj.x, tuioobj.y); } } } //Hay un dedo en la pantalla de la pizarra function downEvent(e:TouchEvent):void { var curPt:Point=parent.globalToLocal(new Point(e.stageX,e.stageY)); addBlob(e.ID, curPt.x, curPt.y); e.stopPropagation(); humano = 1; } //Acaba de retirarse un dedo de la pantalla de la pizarra function upEvent(e:TouchEvent):void { removeBlob(e.ID); e.stopPropagation(); } //Añadimos un blob al array, creamos el sprite y lo visualizamos function addBlob(id:Number, origX:Number, origY:Number):void { blobs.push( {id: id, origX: origX, origY: origY, myOrigX: x, myOrigY:y} ); var line:Sprite = new Sprite(); lines["line"+id] = line; lines["line"+id].graphics.lineStyle(thickness, color); lines["line"+id].graphics.moveTo(origX, origY); addChildAt(lines["line"+id],1); trace(tracesOk + tracesOk + "nueva linea: lines[line" + id + "]"); controlpizarra.push(id); } //Elimina los blobs del array function removeBlob(id:Number):void { for (var i=0; i < blobs.length; i++) { if (blobs[i].id==id) { blobs.splice(i, 1); return; } } } //Elimina la barra y las "pintadas" de la pantalla y vacia el array de lineas function volvere():void { trace(tracesOk + "...dejamos de pintar"); removeEventListener(TouchEvent.MOUSE_DOWN, downEvent); removeEventListener(TouchEvent.MOUSE_UP, upEvent); removeEventListener(Event.ENTER_FRAME, updater); if (sema_barra == 1) { terminaTimer(); } for (var l:uint=0; l < controlpizarra.length ; l++) { removeChild(lines["line"+controlpizarra[l]]); delete lines["line"+controlpizarra[l]]; } controlpizarra.length = 0; }
Ya se que es un poco críptico y que hace uso de librerías "externas" en este caso "TouchEvent.MOUSE_DOWN/UP" que lo que hacen es recibir información de un sistema de pantalla táctil que no tiene nada que ver con lo que ocurre ya que la parte táctil funciona sin problemas.
Lo que me ocurre es que en estas líneas:
Código ActionScript :
var line:Sprite = new Sprite(); lines["line"+id] = line;
Entiendo que se está creando un SPRITE y se está "metiendo" en el ARRAY llamado "lines", esto ocurre tantas veces como veces se mueva un dedo por la pantalla, con lo que en el uso que le doy a este código puede ser entre ninguna y 40 o 50 veces. En modo debug veo que el array "lines" se va llenando con estos sprites pero el "length" del array siempre es "0" y eso es lo que no entiendo porque no soy capaz de borrar ninguno de esos sprites y cada vez que la aplicación pasa por la pizarra el array se va llenando y llenando.
He intentado vaciarlo con "splice" y con "delete" pero, aunque no da ningún error de compilación ni ejecución, el array no se vacía en absoluto, se puede ver al final:
Código ActionScript :
for (var l:uint=0; l < controlpizarra.length ; l++) { removeChild(lines["line"+controlpizarra[l]]); delete lines["line"+controlpizarra[l]]; } controlpizarra.length = 0;
El removeChild sí funciona y elimina las "pintadas" de la pantalla, pero el delete (he probado con splice y lo mismo) no funciona en absoluto.
Se que es un tanto largo y farragoso, pero se reduce a si alguine me puede decir como festionar este array de sprites y vaciarlo o eliminarlo y lo creo de cada vez o lo que sea.
Muchas gracias de antemano.
Paris