Comunidad de diseño web y desarrollo en internet online

Eliminar Bitmap con getChildByName Ayuda Please

Citar            
MensajeEscrito el 05 Ago 2010 02:13 pm
Hola a todos me encontrado con una duda que no se como resolver y no soy capaz de encontrar la informacion correcta
e echo un ejemplo sencillo para la ocasion y para simplificar el codigo.

Bueno antes de postear el codigo planteo la duda,

Se me a dado el caso que tengo que cargar imagenes con un loader y despues clonar el contenido del mismo, el tema es que despues necesito eliminar el bitmap y su contenedor pero solo los que yo indique y para eso necesito acceder al bitmap mediante el nombre de instancia y despues eliminarlo pero no me funciona

Aqui les dejo el codigo que seguro lo entendereis mejor

Código ActionScript :

var _Mvc:Loader;
var _Url:URLRequest;
_Mvc = new Loader();//creamos el loader
_Url = new URLRequest();
_Url.url="archivos/imagenes/texturas/1.jpg";
//--------------------------------------------------------------
var terrain:MovieClip = new MovieClip();//creamos el contenedor de los bitmaps
addChild(terrain);
//--------------------------------------------------------------
//al completar la carga de la imagen ejecutar onFileLoad
_Mvc.contentLoaderInfo.addEventListener(Event.COMPLETE, onFileLoad);
_Mvc.load(_Url);
//--------------------------------------------------------------
function onFileLoad(e:Event):void {
   _Mvc.contentLoaderInfo.removeEventListener(Event.COMPLETE, onFileLoad);//quitamos listener
   for (var n:int = 0; n< 3; n++) {
                             //Clonamos 3 veces el bitmapdata
      var imagen:Bitmap=new Bitmap(Bitmap(_Mvc.content).bitmapData.clone());
      imagen.name=String(n);//a la nueva instancia del bitmap le damos de nombre el valor de n
      terrain.addChild(imagen);//metemos imagen dentro de terrain
   }
}
//--------------------------------------------------------------
import fl.controls.Button;
var miBoton:Button = new Button();
this.addChild(miBoton);
miBoton.x=150;
miBoton.addEventListener(MouseEvent.CLICK, onClick);
//--------------------------------------------------------------
function onClick(e:Event):void {//Aqui se pretende eliminar los bitmap
   for (var n:int = 0; n< 3; n++) {
   //busca la instancia por el nombre y supuestamente tendria que eliminar el bitmap pero no funciona
      terrain.getChildByName(String(n)).dispose();
      //Aqui deberia eliminar el contenedor del Bitmap tampoco funciona
      removeChild(terrain.getChildByName(String(n)));
   }
}



Bueno lo qu enecesito es saber como buscar una instancia bitmap dentro de un contenedor mediante su nombre y eliminar el bitmap y su contenedor

Espero qu eme puedan ayudar saludos

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 02:22 pm
Bueno e mirado de simplificar mas el codigo para que no canse pk con los comentarios asusta pero es muy sencillo en realidad

Código ActionScript :

var _Mvc:Loader = new Loader();
var terrain:MovieClip = new MovieClip();
addChild(terrain);
_Mvc.contentLoaderInfo.addEventListener(Event.COMPLETE, onFileLoad);
_Mvc.load(new URLRequest("archivos/imagenes/texturas/1.jpg"));

function onFileLoad(e:Event):void {
   for (var n:int = 0; n< 3; n++) {
      var imagen:Bitmap=new Bitmap(Bitmap(_Mvc.content).bitmapData.clone());
      imagen.name=String(n);
      terrain.addChild(imagen);
   }
}

miBoton.addEventListener(MouseEvent.CLICK, onClick);
function onClick(e:Event):void {
   for (var n:int = 0; n< 3; n++) {
      terrain.getChildByName(String(n)).dispose();
      removeChild(terrain.getChildByName(String(n)));
   }
}

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 02:30 pm
Ponerle un nro de nombre y castearlo a String no es una buena idea, prueba primero con algo así:

imagen.name="img"+n;

Eso te lo convierte automáticamente en String (hazle un cast si estás en strict mode)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Ago 2010 02:41 pm
BuenAS:

Imagino que lo que quieres es "discriminar" entre una u otra imagen, ya que el bitmap parece que lo tienes localizado:

Bitmap(_Mvc.content)

Dentro de onFileLoad puedes obtener el LoaderInfo del Loader, que posee la propiedad "url" con la ruta de la imagen que has cargado, que será distinta para cada imagen y con lo que podrías averiguar cuándo has cargado tal o cual imagen;

Código ActionScript :

function onFileLoad(e:Event):void {
   var loaderInfo:LoaderInfo = e.target as LoaderInfo;
   trace("Ruta imagen: ", lloaderInfo.url);
   for (var n:int = 0; n< 3; n++) {
      var imagen:Bitmap=new Bitmap(Bitmap(_Mvc.content).bitmapData.clone());
      imagen.name=String(n);
      terrain.addChild(imagen);
   }
}

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 05 Ago 2010 02:47 pm
BuenAS:

Por cierto, algunas versiones de Flash Player 9 (creo que las inferiores a FP 9.0.128) daban un error si añadías el contenido de un loader a otro DisplayObject y utilizabas el mismo Loader para cargar otra vez. Flash Player 10 ya no tiene este problema. Si publicas para Flash Player 10, no hay problema; si es para Flash Player 9 sería conveniente que utilizases un loader distinto en las sucesivas precargas.

Un saludo.
P.D.: Un posible peligro, si estás depurando con FP 10 debugger y después la versión final la publicas para FP9 (o sea, permites que alguien con FP9 pueda ver el swf), todo parecerá ir bien hasta que un usuario intente verlo con FP9.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 05 Ago 2010 03:24 pm
Bueno agradezco vuestros comentarios pero me quedado igual si sin saber porque estas 2 lineas no funcionan

terrain.getChildByName(String(n)).dispose();
removeChild(terrain.getChildByName(String(n)));

Entiendo que no es recomendable agregar un int como string directamente lo tendre en cuenta

a ver voy a intentar explicarme mejor con lo minimo posible

Estoy haciendo un juego en 2d
tengo un array donde estan almacenados las imagenes que debo cargar segun la direccion que me mueva
cuando avanzo carga una imagen y clono su contenido bitmapdata tantas veces como sea necesario

var imagen:Bitmap=new Bitmap(Bitmap(_Mvc.content).bitmapData.clone());

El proceso por cada imagen.
chequeo posicion, cargo imagen segun posicion, clono imagen y la coloco en el stage segun posicion.


si la imagen va colocada en la posicion X-10 e Y10 del escenario

entonces le doy como nombre imagen.name = "1010";

y asi con todas las que se vayan cargado en diferentes posiciones, su posicion debe ser indicativo de su nombre

Por lo tanto cuando me mueva en direccion contraria necesitare eliminarlas

como lo averiguo? pues controlo la posicion X e Y en la que me encuentro

si me encuentro en la posicion X=10 e Y=10

Entonces se que tengo que eliminar la (imagen/bitmap) con nombre "1010"

como? pues con

terrain.getChildByName(xPos,yPos).dispose();//bitmap
y su contenedor con
removeChild(terrain.getChildByName(xPos,yPos));

Pero no funciona

esa es mi duda que no puedo eliminarlo

lo de LoaderInfo.url no me sirve


Solo necesito un ejemplo para ver como hacer funcionar las 2 lineas de codigo anterior solo eso

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 03:29 pm
Entiendo que no es recomendable agregar un int como string directamente lo tendre en cuenta


¿Probaste usar el string como te lo sugerí? ¿Los quita?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Ago 2010 03:34 pm
No, no los quita
me devuelve el siguiente error con la siguiente linea

terrain.getChildByName("m"+n).BitmapData.dispose();
1119: Access of possibly undefined property BitmapData through a reference with static type flash.display:DisplayObject.

y asi me devuelve este otro
terrain.getChildByName("m"+n).dispose();
1061: Call to a possibly undefined method dispose through a reference with static type flash.display:DisplayObject.

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 03:36 pm
si hago un

trace(terrain.getChildByName("m"+n));

me devuelve

[object Bitmap]
[object Bitmap]
[object Bitmap]

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 03:37 pm
Prueba así:

BitmapData(terrain.getChildByName("m"+n)).dispose();

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Ago 2010 03:39 pm
si supuestamente es un objeto Bitmap como dice en el trace
entonces porque no puedo hacer

objectBitmap.BitmapData.dispose(); ???

que seria lo mismo que

terrain.getChildByName("m"+n).BitmapData.dispose();

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 03:42 pm
Tampoco

me devuelve el sigueinte error
con esto

BitmapData(terrain.getChildByName("m"+n)).dispose();

TypeError: Error #1034: Error de conversión forzada: no se puede convertir flash.display::Bitmap@29478881 en flash.display.BitmapData.
at dudaDispose_fla::MainTimeline/onClick()

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 03:44 pm
anteriormente a eso ya habia probado con Bitmap(terrain.getChildByName("m"+n)).dispose();
Y tampoco

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 03:46 pm
si quieres probarlo solo tienes que copiar el primer codigo de arriba, es con el que estoy probando yo,
solo es copy paste y cambiar la ruta de la imagen por una que tengas por ahi y funciona.

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 04:25 pm
Uf ya lo e probado todo no se como hacerlo nadie sabe?

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 04:42 pm
Bueno al final probando y probando encontre la solucion
por si a alguien le interesa

no habia probado esta conbinacion xD

Bitmap(terrain.getChildByName("m"+n)).bitmapData.dispose();

al parecer las veces que le dicho a flash que el objeto es un bitmap habia puesto bitmapData con B alta y por eso pense que no funcionava y lo descarte

la verdad me hago la picha un lio con palabras reservadas o propiedades que se llaman igual y solo cambia la primera letra de mayuscula a minuscula en fin

Bueno pues solucionado

Gracias a todos

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8
Citar            
MensajeEscrito el 05 Ago 2010 05:00 pm
mmm decir que despues de eliminar el bitmapdata para eliminar el contenedor bitmap
seri asi
terrain.removeChild(terrain.getChildByName("m"+n));
saludos

Por giskard

110 de clabLevel



Genero:Masculino  

Programador y diseñador web

msie8

 

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