Comunidad de diseño web y desarrollo en internet online

Error a usar delete " Intento de eliminación de la propiedad fij

Citar            
MensajeEscrito el 25 Nov 2014 04:20 pm
Hola buenas tardes;
Soy nueva en As3 y me estoy fustrando bastante con un proyecto. Estoy intentando liberar un poco la memoria, al intentar eliminar una variable que contiene un swf con un botón, me da este error "Intento de eliminación de la propiedad fija bPlay. Sólo se pueden eliminar propiedades definidas dinámicamente.". La idea es cuando pase al fotograma siguiente me elimine todos los objetos del fotograma actual y de esa manera liberar la memoria. Tengo entendido que con removeChild, no se elimina, solo lo saca del contenedor, por lo que esa funcion no me sirve, lo que necesito es eliminarlo definitivamente. Seguro que es un fallo tonto, pero llevo varios dias dandole vueltas al tema, en internet no encuentro nada, y creo que me voy a volver loca. ¿Alguien que pueda ayudarme por favor?


var bCreditos:Loader = new Loader();
bCreditos.x = bCreditos.width/0;
bCreditos.y = bCreditos.height/0;
bCreditos.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete1);
bCreditos.load(new URLRequest("diseño/swf/botonCreditos.swf"));

function onComplete1(e:Event):void
{
this.addChildAt(bCreditos,1);
}

/////////////// Play /////////////////

var bPlay:Loader = new Loader();
bPlay.x = bPlay.width/0;
bPlay.y = bPlay.height/0;
bPlay.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete2);
bPlay.load(new URLRequest("diseño/swf/botonPlay.swf"));

function onComplete2(e:Event):void
{
this.addChildAt(bPlay,1);
}

/////////////////////////////////////////////////////


function fplay($event: MouseEvent):void
{
//FUNCIONALIDAD DEL BOTÓN


var cargador = new Loader();
cargador.load(new URLRequest("play.swf"));
addChild(cargador);
bPlay.mouseEnabled = false;
bCreditos.mouseEnabled = false;
bPlay = null;
bCreditos = null;
delete(bPlay);
removeEventListener (MouseEvent.CLICK, fcreditos);
removeEventListener (MouseEvent.CLICK, fplay);
}
bPlay.addEventListener(MouseEvent.CLICK, fplay);

Por gainfa

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Nov 2014 07:44 pm
Para quitar variables y hacer que el Garbage Collector lo elimine, pon la variable a null

miBoton = null;

Haz removeEventListener de todos los eventos y haz removeChild de todos los elementos visuales

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Nov 2014 09:35 pm
Genial, creo que el codigo esta bien y que ya lo tengo. Muchisimas gracias, no me libera toda la memoria que necesito, pero si una parte. Un millon de gracias.

function fplay($event: MouseEvent):void
{
//FUNCIONALIDAD DEL BOTÓN


var cargador = new Loader();
cargador.load(new URLRequest("play.swf"));
addChild(cargador);
removeEventListener (MouseEvent.CLICK, fplay);
removeEventListener(Event.COMPLETE, onComplete);
removeEventListener(Event.COMPLETE, onComplete2);
removeEventListener(Event.COMPLETE, onComplete1);
removeChild(bPlay);
removeChild(bCreditos);
removeChild(fondo);
bPlay = null;
bCreditos = null;
fondo = null
}
bPlay.addEventListener(MouseEvent.CLICK, fplay);

Por gainfa

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2014 07:07 pm
Ahora me ha surgido un problema y no se como resolver, explico, Tengo una funcion que al cambia de scena, se encarga de eliminar todo del escenario, para que el Garbage Collector lo elimine, funciona correctamente. El problema esta que cuando vuelvo a la escena anterior me aparece todo el escenario en blanco. Pongo un ejempo por si no me entendeis bien: Imaginamos que estoy en la escena de menu y pincho en boton de ayuda, la funcion Kill me elimina todo de la escena de menu y me carga la escena ayuda correctamente, pero si le doy al boton de menu y vuelvo a la escena principal aparece todo el escenario en blanco, y eso me pasa con todas las escenas. Alguien sabe como podria resolverlo? La programación de los botones es practicamente la misma en todas las escenas.

stop();

//PROGRAMACIÓN DEL BOTON ARRANQUE
import flash.events.MouseEvent;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;

function fMenuCreditos($event: MouseEvent):void
{
var cargador = new Loader();
cargador.load(new URLRequest("Acertados.swf"));
addChild(cargador);
removeEventListener(MouseEvent.CLICK, fMenuCreditos);

}
bMenuCreditos.addEventListener(MouseEvent.CLICK,fMenuCreditos);

function fKillCreditos($event: MouseEvent):void
{
fondoCreditos.mouseEnabled = false;
bMenuCreditos.mouseEnabled = false;
removeChild(fondoCreditos);
removeChild(bMenuCreditos);
fondoCreditos = null;
bMenuCreditos = null;
removeEventListener(MouseEvent.CLICK, fKillCreditos);

}
bMenuCreditos.addEventListener(MouseEvent.CLICK,fKillCreditos);

Por gainfa

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2014 10:24 pm
Si borras dinámicamente y quieres que reaparezca, tienes que haber creado dinámicamente. Ahora si has creado las cosas manualmente no hay magia, deberás crear todo por código ... si el objetivo es limpiar memoria, a menos que sea algo realmente masivo, no tiene mucho sentido borrar cada vez que pasas ... o has notado problemas de memoria?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Dic 2014 11:04 pm
Si, tengo problemas de memoria, el juego tiene veinte niveles y cada vez que cambia de nivel va mas lento, hasta el punto que se queda colgado. Por lo que he pensado en eliminar cada vez que paso. Tambien probe en cargar los archivos en BulkLoader, todo me funcionaba ok, pero cuando vuelvo a la escena anterior me dice que la clase "mainLoader" ya esta creada, este es el codigo que tenia cuando lo intente cargar desde BulKLoader. La de las otras escenas es la misma, solo que cambia el nombre de funciones y demas. Lo que realmente me vendria bien, seria usar BulkLoader y que al volver a la escena no tenga el problema con esta parte del codigo. El error lo tengo en esto:
var loader:BulkLoader = new BulkLoader('mainLoaderAcertados');
que me dice que 'mainLoaderAcertados' ya esta creado.

Error: BulkLoader with name'mainLoaderAcertados' has already been created.
at br.com.stimuli.loading::BulkLoader()[C:\Users\Tamara\Desktop\acert\Acertados Mejorado2\J prueba\br\com\stimuli\loading\BulkLoader.as:386]
at Acertados_fla::MainTimeline/frame3()[Acertados_fla.MainTimeline::frame3:13]
/////////////////////////////////////////////////////////////////////////////////////////

stop();

//PROGRAMACIÓN DEL BOTON ARRANQUE
import flash.events.MouseEvent;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.display.Sprite;
import flash.events.*;
import br.com.stimuli.loading.BulkLoader;
import br.com.stimuli.loading.BulkProgressEvent;
import flash.system.JPEGLoaderContext;

var loader:BulkLoader = new BulkLoader('mainLoaderAcertados');
///////////////////// Cargar diseño ///////////////////////////////
loader.add('diseño/swf/botonCreditos.swf', {id:'botonCreditos'});
loader.add('diseño/swf/botonPlay.swf', {id: 'botonPlay'});
loader.add('diseño/imagen/menu_fondo.png', {id: 'fotoFondo'});

loader.start();

loader.addEventListener(BulkLoader.COMPLETE, onLoaded);
loader.addEventListener(BulkLoader.PROGRESS, onProgress);

function onLoaded(evt:Event)
{
var fondo:Bitmap = loader.getBitmap('fotoFondo');
this.addChildAt(fondo,0);
var bCreditos:MovieClip = loader.getMovieClip('botonCreditos');
this.addChild(bCreditos);
var bPlay:MovieClip = loader.getMovieClip('botonPlay');
this.addChild(bPlay);


function fPlay($event: MouseEvent):void
{


bPlay.mouseEnabled = false;
bCreditos.mouseEnabled = false;
removeChild(bPlay);
removeChild(bCreditos);
//removeChild(fondo);
bPlay = null;
bCreditos = null;
fondo = null;
var cargador = new Loader();
cargador.load(new URLRequest("Play.swf"));
addChild(cargador);
removeEventListener(BulkLoader.COMPLETE, onLoaded);
removeEventListener(BulkLoader.PROGRESS, onProgress);
removeEventListener(MouseEvent.CLICK, fCreditos);
removeEventListener(MouseEvent.CLICK, fPlay);
}
bPlay.addEventListener(MouseEvent.CLICK, fPlay);

////////////////creditos ///////////////

function fCreditos($event: MouseEvent):void
{
//FUNCIONALIDAD DEL BOTÓN

bPlay.mouseEnabled = false;
bCreditos.mouseEnabled = false;
removeChild(bPlay);
removeChild(bCreditos);
removeChild(fondo);
bPlay = null;
bCreditos = null;
fondo = null;
var cargador = new Loader();
cargador.load(new URLRequest("Creditos.swf"));
addChild(cargador);
removeEventListener(BulkLoader.COMPLETE, onLoaded);
removeEventListener(BulkLoader.PROGRESS, onProgress);
removeEventListener(MouseEvent.CLICK, fPlay);
removeEventListener(MouseEvent.CLICK, fCreditos);
}
bCreditos.addEventListener(MouseEvent.CLICK, fCreditos);



}

function onProgress(evt:BulkProgressEvent)
{
trace(evt.bytesLoaded + ' – ' + evt.bytesTotal);
}

Por gainfa

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2014 11:17 pm
EL BulkLoader no tiene algun unload que te permita descargar lo que ha sido cargado?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Dic 2014 11:38 pm
El loader tiene un método unload, que no te asegura liberar memoria. Considera crear dinámicamente los elementos para poder luego recrearlos. Doy un típico ejemplo en juegos: el pool de enemigos. No se crean cientos y cientos, se crean digamos 20 y se van metiendo al escenario, van volviendo al pool para ser reutilizados cada vez que matan un enemigo (obvio nunca hay mas de 20 en escena) Al finalizar el nivel todos los enemigos se destruyen. Si se vuelve al nivel, todos los enemigos son recreados ... pero hay libros enteros escritos sobre diseño de juegos, y si tu problema es de estructura ... posiblemente necesites un refactor gigante.
Mira si no hay onEnterFrame o Timer o setInterval que queden voyando, eso tambien come memoria. Puedes hacer un perfil del rendimiento para encontrar donde estan los problemas usando Adobe Scout, http://www.adobe.com/devnet/games.html

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

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