Comunidad de diseño web y desarrollo en internet online

Problema con imagenes externas

Citar            
MensajeEscrito el 06 Oct 2009 11:14 am
Tengo hecha una web en flash, pero claro como tengo las imagenes puestas de la biblioteca de flash, ME OCUPA MUCHISIMO, el swf. pesara como 3,17 mb, entonces quiero cargar las imagenes de la biblioteca externa de flash .

Pero claro llegaron los problemas, les cuento, tengo una capa 1 y una capa 2 .

CAPA 1 :

Tiene todos los botones, que al hacer click tendria que salir la imagen en la capa 2

CAPA 2 :

Vacia y ahi es donde quiero que aparezca mi imagen .

Entonces siguiendo con las funicones de siempre y algo que lei por internet, intente algo asi :

bot_a.addEventListener(MouseEvent.MOUSE_UP, Firma1);

function Firma1(event:MouseEvent) : void {
Loader("Imagen.jpg);
}

Pruebo la pelicula y no me salta ningun error de entrada pero en cuanto entro a la seccion de galeria y hago click en la imagen me salta este error :

TypeError: Error #1034: Error de conversión forzada: no se puede convertir "firmanewphilsmoke.jpg" en flash.display.Loader.
at index_fla::MainTimeline/Firma1()

a lo cual a mi mismo me respondo, yo pongo el codigo pero claro no puse en ningun momento donde iva a aparecer la imagen, ni las coordenadas, entonces no se si tambien tengo que meter codigo en la capa 2 donde iria el contenido .

Hay un tutorial aca de AS3 de precarga, pero la verdad que no se entiende un carajo .

Lo unico que quiero es eso que se haga click en un boton y se vea la imagen en otra capa, SIN EFECTOS RAROS NI NADA, solo que se vea y listo .

Si me pudiesen ayudar, muchisimas gracias .

Por Sepultura

60 de clabLevel



 

www.cultosiniestro.com.ar

firefox
Citar            
MensajeEscrito el 06 Oct 2009 11:56 am
Hay un tutorial aca de AS3 de precarga, pero la verdad que no se entiende un carajo .


Entonces intenta hacer algo mas acorde a tus capacidades

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 Oct 2009 12:09 pm

Sepultura escribió:

Entonces siguiendo con las funicones de siempre y algo que lei por internet, intente algo asi :

bot_a.addEventListener(MouseEvent.MOUSE_UP, Firma1);

function Firma1(event:MouseEvent) : void {
Loader("Imagen.jpg);
}

Es mejor siempre irse a "las fuentes". Vamos, en la página de adobe explican cómo usar el Objeto Loader

Verás que es simplemente

Código ActionScript :

//Creo un objeto "Loader"
var loader:Loader=new Loader();
//Lo situamos donde queramos
loader.x=100  
loader.y=5
//lo añadimos al "stage"
addChild(loader)
//luego, para cada botón, la cosa sería como
bot_a.addEventListener(MouseEvent.MOUSE_UP, Firma1);

function Firma1(event:MouseEvent) : void {
loader.Load(new URLRequest("imgen1.jpg"));
}


Hay muchas cosas que explicar (qué es un loader, qué es addchild, el método load...) si tienes alguna duda andamos por aquí.

NOTA:Sepultura, la verdad es que no sé cómo está de bien o mal explicado el tutorial de precarga, pero queda más amable preguntar en el foro algo del estilo "no entiendo por qué se hace esto y lo otro" que decir algo del estilo "no se entiende un carajo" (es que, personalmente, me he quedado con las ganas de responder: "pues compraté un libro")

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Oct 2009 12:18 pm
... que es lo que yo hice ... pero por suerte Eliseo tiene santa paciencia ....

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 Oct 2009 12:50 pm
Bueno lo primero perdon si mi vocabulario fue un tanto malo ... tampoco quise ofender a nadie ehh . perdon .

muchas gracias por tu ayuda Eliseo, meti los codigos que me distes en la capa 1 .

Pero me salta un error en la linea loader.Load(new URLRequest("Imagen1.jpg")

el error en concreto es el 1061 y me dice asi :

1061: Llamada a un método Load posiblemente no definido mediante una referencia con tipo estático flash.display:Loader.

Una pregunta el codigo lo meto en la capa donde tengo los botones o en la capa vacia ?

Por las dudas te digo que yo lo puse en la capa donde tengo los botones .

Gracias de nuevo y perdon nuevamente si les molesto como hable.

Por Sepultura

60 de clabLevel



 

www.cultosiniestro.com.ar

firefox
Citar            
MensajeEscrito el 06 Oct 2009 02:38 pm
:glups: es que es "load" (en minúsculas) en lugar de "Load"

Código ActionScript :

function Firma1(event:MouseEvent) : void { 
    loader.load(new URLRequest("imgen1.jpg"));  //<--load, NO Load
}

El código lo puedes meter en cualquier capa, SIEMPRE que esté en un frame donde tengas los botones
Las "capas" el Flash SÓLO sirven para, cuando tenemos MCs en cada capa, darle un orden -los MCs o imágenes que estén en una capa superior se verán "por encima" de los que estén en una capa inferior -vamos, que "taparán" parte de los MCs de abajo"-
Generalmente se suele poner el código AS en una capa "aparte" (pero es opcional)

NOTA1:A mí no me molestó -es más entiendo las ganas de mandarlo todo a la mierda-, así que no acepto disculpas por mi parte porque no hubo molestias :)

NOTA2:es "chapa", así que ni puto caso. En AS.3 TODO son "objetos de alguna Clase". Esto es, que siempre tenemos algo como

Código ActionScript :

var variable:TipoClase=new Clase()

Una vez que tenemos un "objeto de una Clase", le podemos aplicar "métodos" de esa Clase, esto es

Código ActionScript :

variable.metodoDeClase()

En Referencia del Lenguaje tenemos toooodas las Clases con las que trabaja Flash (es un enlace para mí imprescindible). No hay que asustarse cuando nos hables de Clases porque SIEMPRE hemos trabajado con Clases, por ejemplo la Clase MovieClip.
Si, dentro de la ayuda, nos vamos a los "métodos", vemos, por ejemplo, que a un movieClip se le puede hacer un gotoAndPlay(10). Así que, si tenemos un MC en nuestro escenario llamado "mimc" podemos escribir

Código ActionScript :

mimc.gotoAndPlay(10)

Hay que tener en cuenta que AS es "case-sensitive", esto es, que diferencia mayúsculas y minúsculas, así que NO VALE GotoAndPlay, ni nada por el estilo

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Oct 2009 04:11 pm
jejeje te reiras, pero cuando me dio ese error, agarre y me fije en el codigo de AC y puse mayuscula a la "L" de Loader, no al Load jeje que loco que estoy .

Bueno mira, el codigo me funciono muy bien, lo puse en todos los botones, renombre los botones y perfecto , TE AGRADEZCO MUCHISIMO, tu dedicacion la verdad para explicar y encima dar consejos extra, fuera de lo que fue mi pregunta, da gusto la verdad que te lo explique de esta forma para que en un post te salga bien .

Lo unico que si, el unico cabo suelto que me quedo ahora, es un temita un poco tecnico, que cuando hago click en otra imagen quiero que la anterior se quite, pero no consigo darle al blanco, lo seguire intentando y si no a ver si alguien se anima y me ayuda.

Gracias nuevamente :)

Por Sepultura

60 de clabLevel



 

www.cultosiniestro.com.ar

firefox
Citar            
MensajeEscrito el 06 Oct 2009 04:43 pm
si tienes un ÚNICO loader NO debería pasar (siempre que digo que "no debería pasar" me da la impresión de que nos estamos equivocando en algo) que dando a un botón se mantengan las dos imágenes
Cuando digo que haya un único loader es que las instrucciones

Código ActionScript :

var loader:Loader=new Loader(); 
addChild(loader)

deben estar FUERA de cualquier función

Si a lo que te refieres es a "eliminar" una imagen si se "pincha" es sólo añadir un listener al loader y hacer un removeChild(loader)

Código ActionScript :

....
loader.addEventListener(MouseEvent.CLICK, removeImagen);
...
function removeImagen(e:Event):void {
   removeChild(loader);  //<---esto hará que el loader desaparezca 
}

Claro que, así, al pulsar el botón, se cargará la imagen pero no se verá. Bueno, no hay problema, tendremos que cambiar nuestras funciones "Firma1(event:MouseEvent) "

Código ActionScript :

private function Firma1(e:Event):void {
   loader.load(new URLRequest("img1.jpg")); 
   if (!loader.parent) { //si no tiene padre, es que no está añadido a la DisplayList
      addChild(loader);
   }
}

¡OJO! cada vez que hacemos un addChild, el "objeto" se coloca por encima de todo lo que haya, así que podemos cambiarle la posición usando setChildIndex

Código ActionScript :

private function Firma1(e:Event):void {
   loader.load(new URLRequest("img1.jpg")); 
   if (!loader.parent) { //si no tiene padre, es que no está añadido a la DisplayList
      addChild(loader);
                setChildIndex(loader,0); //<---pone DEBAJO de todo el "loader"
   }
}

Si no es eso, perdona, que ando un poco espeso esta tarde

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Oct 2009 01:15 am
muchisimas gracias pero el problema no eran esos, era que yo soy medio retrasadin, y que repeti en todo el loader, pero con un numero, no sabia que habia que ponerlo en el primero y despues los demas igual .

Muchisimas gracias.

EDITADO :

Ahora si, me surgio un ultimo imprevisto, el cual tiene que ver por la parte de que cuando hago click en otra seccion o en otro boton ME QUEDA LA ULTIMA QUE IMAGEN QUE VISITE .

quise darme un poco de mania e intente en los botones que se activan los submenu donde se puede elegir cada galeria algo como esto :


bot_1.addEventListener(MouseEvent.CLICK, removeImagen);

function removeImagen(e:Event):void {
removeChild(loader);
}

pero no me funciono, no me acuerdo que error me salto .

lo que busco ya para dejaros de molestar es que cuando haga click en otra seccion directamente no se vea ninguna imagen .

Por Sepultura

60 de clabLevel



 

www.cultosiniestro.com.ar

firefox
Citar            
MensajeEscrito el 07 Oct 2009 06:47 am
Para eliminar de la "DisplayList" un objecto, lo hacemos con removeChild. Así que, sí que "debería" funcionar. Conviene saber sí está o no en la displayList así que escribiríamos

Código ActionScript :

function botonOnClick(e:Event){
  if (loader.parent){
     removeChild(loader)
     //para liberar memoria igualamos el contenido a null
    loader.content=null;
  }
  ....resto de código...
}

Claro, que tienes que cambiar los botones de la galería como indiqué antes para añadirlo al stage si es que no está añadido.

Vale, el error que te da será que no puede acceder a un objeto nulo o algo así. Eso es porque no has definido loader a nivel general.
Dos códigos

Código ActionScript :

//Primer caso, definimos loader FUERA de cualquier función
//se podrá eliminar con removeChild
var loader:Loader=new Loader()
bt1.addEventListener(MouseEvent.CLICK,anadirImagen)
function anadirImagen(e:Event){
   loader.load(new URLRequest("imagen1.jpg"));
}

Código ActionScript :

//Segundo caso, definimos loader en la función anadirImagen
bt1.addEventListener(MouseEvent.CLICK,anadirImagen)
function anadirImagen(e:Event){
   var loader:Loader=new Loader()
   loader.load(new URLRequest("imagen1.jpg"));
}

Los dos códigos hacen lo mismo, lo que ocurre es que en el primer caso la variable "loader" que hace referencia al Loader es accesible desde cualquier función. en cambio la segunda es una variable "temporal" (por estar definida dentro de una función) Y sólo tiene valor DENTRO de la función. Así, en el primer caso podemos tener otro botón y escribir

Código ActionScript :

btEliminar.adEventListener(MouseEvent.CLICK,quitarImagen)
function quitarImagen(e:Event){
    removeChild(loader)  //<--al ser "accesible" desde cualquier función podemos eliminarlo simplemente
}

En el segundo caso NO podemos acceder al "loader". Pensemos que DENTRO de una función en AS (en general cualquier lenguaje "Visual") sólo tenemos acceso a:
1.-variables que le pasemos como argumentos
2.-variables generales definidas "a nivel de aplicación" (Vale, definidas fuera de cualquier función)
3.-objetos que estén en el stage (han de extender de DisplayObject, esto es nos vale un Sprite, una Shape, un Loader.... y haberse añadido con un addChild)

¡aja! debemos capturar nuestro loader
El único modo de "capturar objetos que estén en el stage" es mediante las instrucciones
getChildAt() y getChildByName()
getChildAt() Precisa saber el "index" donde se ha colocado
getChildByName Precisa saber la propiedad "name" del "DisplayObject".

Vale, tal y como lo tenemos en el segundo código no sabemos ni el "index" donde se ha colocado ni la propiedad "name". Así que cambiemos un poco el segundo código

Código ActionScript :

bt1.addEventListener(MouseEvent.CLICK,anadirImagen)
function anadirImagen(e:Event){
   var loader:Loader=new Loader();
   loader.name="miloader"  //<---le damos valor a la propiedad "name"
   loader.load(new URLRequest("imagen1.jpg"));
}

Así sí que podríamos tener nuestro segundo botón

Código ActionScript :

btEliminar.adEventListener(MouseEvent.CLICK,quitarImagen)
function quitarImagen(e:Event){
    var mc:DisplayObject=getChildByName("miloader")
    if (mc!=null){
       removeChild(mc);
    }
}

Varias cosas sobre el código
1.-getChildByName -así como getChildAt devuelve un objeto de tipo DisplayObject. Ese es el motivo por el que lo hemos igualado a una variable de tipo "DisplayObject"
2.-Antes de hacer el removeChild, comprobamos que efectivamente exista

En este caso nos vale que la variable sea del tipo DisplayObject porque sólo vamos a "removerlo". Si quisiéramos acceder a una propiedad del loader -por ejemplo a su propiedad "content", debemos igualarlo a una variable de tipo Loader, pero debemos hacer también una "conversión de cast". Esto es, le vamos a decir que lo que nos devuelva la función getChildByName lo "trate" como si fuera un objeto Loader

Código ActionScript :

function quitarImagen(e:Event){
    var mcLoader:Loader=getChildByName("miloader") as Loader //<--sí ese "as Loader" es la "conversión de cast"
    //así podemos escribir, por ejemplo
    trace(mcLoader.contentLoaderInfo.bytesTotal)
    if (mcLoader!=null){
       removeChild(mcLoader);
    }
}

puff, ya está.

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Oct 2009 01:39 pm
lo intente con varias cosas pero nada ...

mira yo tengo dos botones que cuando haces click en uno, se despliega un submenu que contiene cada galeria, entonces cuando haces click en una galeria, APARECE LA GALERIA, pero claro, cuando hago click en el boton de nuevo para ir a otra galeria la imagen que tenia seleccionada antes se me queda en medio ahi mientras se ve otra galeria .

Bueno, mira, la web la tengo hosteada :

www.cultosiniestro.com.ar

hace click en el boton izquierdo rojo y anda a una galeria, por ejemplo a la de digital y despues hace de nuevo click en el boton rojo para ir a otra y fijate de lo que te digo .

En el boton rojo, puse este codigo :

function quitarImagen(event:MouseEvent) :void {
removeChild(loader)
}

no me saltaba ningun error, pero en cuanto hacia click en el boton me saltaba este error :

TypeError: Error #2007: El valor del parámetro child debe ser distinto de null.
at flash.display::DisplayObjectContainer/removeChild()
at index_fla::MainTimeline/quitarImagen()

el parametro child tiene que ser distinto a null ?
eso no lo entiendo por lo cual me salta ese error y despues copie tu ultimo codigo :

function quitarImagen(e:Event){
var mcLoader:Loader=getChildByName("miloader") as Loader //<--sí ese "as Loader" es la "conversión de cast"
//así podemos escribir, por ejemplo
trace(mcLoader.contentLoaderInfo.bytesTotal)
if (mcLoader!=null){
removeChild(mcLoader);
}
}

pero ni siquiera me funciono, es decir ni los errores me saltaban :S

pfffffffff noto que los estoy molestando demasiado con una tonteria de galeria .

perdon.

Por Sepultura

60 de clabLevel



 

www.cultosiniestro.com.ar

firefox
Citar            
MensajeEscrito el 07 Oct 2009 02:04 pm
No es molestia (lo quizá es que no nos entendemos mucho)
El error

Código ActionScript :

function quitarImagen(event:MouseEvent) :void {
  removeChild(loader)
}

el error que te da es que "loader" es una variable que no tiene valor.
¿dónde tienes definida la variable "loader"? (vamos, dónde tienes escrito

Código ActionScript :

var loader:Loader=new Loader()

¿estás escribiendo el código en un frame de la película o te has hecho una "clase de documento"?

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Oct 2009 10:48 am
Problema resuelto.

Muchisisisisissisisisisisiisisisisisimas gracias Eliseo2, sinceramente muchisimas gracias por tu paciencia y gracias por prestarnos tu gran saber en el mundo del diseño .

el problema era porque no habia llamado al stage al loader, con lo cual quedo el codigo queda asi :

function quitarImagen(e:MouseEvent) :void {
addChild(loader)
removeChild(loader)
}

Pongo el codigo, por si alguno en el buscar o en google tiene el mismo problema .

GRACIAS .

Por Sepultura

60 de clabLevel



 

www.cultosiniestro.com.ar

firefox
Citar            
MensajeEscrito el 08 Oct 2009 11:06 am
hay veces que creo que no me hace caso ni mi madre (bueno, mi madre menos que nadie :) )
Te dije que comprobaras si loader está añadido. Para eso se debería comprobar si está en la displayList.
Yo lo comprobaría pensando si tiene padre

Código ActionScript :

if (loader.parent!=null){ //si tiene "padre"
      removeChild(loader)
}

Vale, siempre podemos hacer un try...catch para recoger el error, aunque personalmente es mejor tratar de evitar esos problemas

Código ActionScript :

try{
   removeChild(loader)
}
   catch(e:ArgumentError) {
}

Por Eliseo2

710 de clabLevel



 

firefox

 

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