Botones dinámicos en AS3
Hola a todos, no se si el título es correcto o no, pero seguro que despertará la curiosidad de los que estamos aprendiendo.
Hasta ahora en flash siempre utilizaba un metodo muy sencillo pero para mi efectivo a la hora de crear botones de menús, botones en mc, etc...
El resultado era esté:
Lo que hago es un mc que dentro tiene un boton falso, etiquetas de in out y activo, una zona sensible con la programación y luego le doy el texto desde el mc, luego duplico el mc, ya sea dinámicamente o duplicándolo en el escenario manualmente y dándole la programación a cada mc, al final sólo tengo un mc, si modifico su interior se modifican todos.


En la zona activa del boton le doy esta programación:
on(rollOver){
gotoAndPlay('in')
}
on(rollOut){
gotoAndPlay('out')
}
on(release){
_root.boton_activo.gotoAndPlay('out')
_root.boton_activo=eval(this)
_root.boton_activo.gotoAndStop('activo')
}
Con esta programación tan simple tenia solucionados muchos dolores de cabeza, y la he usado para mil cosas, galerias, duplicados, menus, etc...
Ahora me gustaría trasladar está programación a AS3 y me está mareando un poco el tema, lo que me gustaría es tener alguna clase parecida, para poder hacer un mc con una animación dentro, etiquetas, etc...
El primer problema con el que me encuentro es el siguiente, he intentado hacer primero una función en la línea de tiempo sólo para un boton, luego en teoria haría que esa función fuera para todos, pero bueno, ya no me va ni la primera
le he puesto este código en el primer frame
this.boton_mc.txt_boton.text='uno';
this.boton_mc.boton.addEventListener(MouseEvent.MOUSE_OVER,over);
this.boton_mc.boton.addEventListener(MouseEvent.MOUSE_OUT,out);
this.boton_mc.boton.addEventListener(MouseEvent.CLICK,pulsado);
function over(e:MouseEvent):void{
boton_mc.gotoAndPlay('in')
//Texto_txt.text = ("Has hecho over");
}
function out(e:MouseEvent):void{
boton_mc.gotoAndPlay('out')
//Texto_txt.text = ("Has hecho out");
}
function pulsado(e:MouseEvent):void{
//Texto_txt.text = ("Has pulsado");
boton_mc.gotoAndStop('activo')
boton_mc.boton.enabled=false;
trace("Has pulsado");
}
Sin pulsar siquiera ya no funciona, en el momento que hace el out, como la linea de tiempo sigue avanzando y luego vuelve al primer frame es como si la zona sensible hubiera desaparecido, ejemplo :
y eso que todavía no he intentado hacer el eval para que se guarde en una variable su ruta y luego se desmonte o se monte según a que boton cliques.
ALguien puede ayudarme a hacer una clase reutilizable para este tipo de código.
Aqui les dejo el fla por si sirve de algo
Mil gracias
tpmmds
Hola:
...esa razón lo justifica todo ;-) Hace poco un compañero de curro, que tenía bastante tiempo libre para dedicarse, también ha tenido una hija y... se esfumó el tiempo en foros, de tapeo...
Y volviendo a AS3, y viendo que vas a seguir con el editor de Flash, te diría una palabra mágica, que posiblemente conozcas: "snippets" (trozos de código para reutilizar). En Flex, FDT, FlasDevelop son de uso frecuente y en Flash hay extensiones que te puedes bajar de Internet e instalar. Funcionan como un panel más y básicamente son trozos de código ya escritos para que simplemente hagas Copy&Paste.
Hay muchas tareas comunes que se escriben siempre igual. Por ejemplo, hacer una precarga de imágenes, cargar y procesar un xml, añadir los oyentes de eventos... Todo este código lo tendrías clasificado en el anterior panel, y sólo tendrías que añadirlo en el pto concreto de tu códico donde lo vas a utilzar.
Otra cosa, también interesante si utilizas Flash CS4: puedes tener las bibliotecas de clases compiladas swc, por ejemplo PV3D, en una carpeta, y hacer referencia a dicha carpeta sin más, para poder utilizarlas. Ah, y una cosilla, cuando se compila, el compilador SOLO añade al swf aquellas clases a las que se haga referencia en el código.
Un saludo
dazao
muchas gracias por dedicar tanto tiempo a ayudar a los demás, la verdad es que es algo que siempre me ha parecido loable. Yo antes intentaba ser mucho más activo en los foros, pero ahora, con el trabajo, los proyectos, y una niña de dos años me es casi imposible :D
Lo del gotoAndStop es porque cuando se hace el out mando al cabezal a la etiqueta de out y antes de que llegue a la etiqueta de activo lo que hago es mandarlo al frame 1, si clicas entonces mando al cabezal directamente a activo, donde no hay boton.
Luego si clicases en otro boton mandaria el boton_activo que es la variable asociada al _root. con el eval al gotoAndPlay out, me he explicado?
Es un código cutre pero me ha sacado de mil apuros :D
tpmmds
BuenAS:
En CS4 tienes en el panel de proyectos la posibilidad de que te genere automáticamente la clase con esta "carcasa" de código de la que hablamos.
Por otro lado, le he echado un vistazo al fla y parece que no es un problema de haberlo pasado a AS3, sino de cómo se lanzan las animaciones. No me ha quedado claro el efecto que buscas (hay un gotoAndStop(1) en el frame 18 que no acabo de pillar para qué es.
Creo que lo tienes, lo único, un repaso de los lugares donde colocas los stop y gotoAndPlay para que hagan realmente el efecto que buscas
Un saludo
dazao
bueno, tu editor, supongo que lo hace si utilizas flex builder o flash develop, programas que todavía no me he atrevido ni a abrir .D
tpmmds
...una cosilla, que no quiero desanimar a nadie con AS3 :-)
Una cosa es utilizar AS3 con OOP (AS2 también se puede utilizar de esa forma; yo cuando programo con AS2 también tiro de clases, métodos, propiedades...) y otra cosa que se puede hacer sin mayor problema es escribir código en el timeline. Si quitas los guiones bajos de las propiedades, utilizas addEventListener para añadir los listeners, y algún método que ha cambiado de nombre... puedes seguir programando en AS3 casi como si utilizaras AS2.
Y otra cosa que parece que asusta, es la "carcasa" de código que llevan las clases. Pero todo ese código te lo genera automáticamente el editor que utilizas. Todo eso de Public class Manolito extends MovieClip, import flash.display.MovieClip... no se escribe, lo hace automáticamente tu editor.
Un saludo.
dazao
gracias, pero eso es precisamente lo que queria deciros, que no he conseguido que sea reutilizable.
Si miras el archivo en as3, veras que al hacer el out ya no funciona...
descargar
Y no se ni como hacer lo del eval, quiero decir, cuando tengo más de un boton...
tpmmds
lo mismo para hacerlo más claro te lo he liado. No hay problema en tener toda la animación en el mismo MovieClip, ahora bien, tendrías que mandar según el caso, la animación a un frame u otro. Hay 4 para las cuatro situaciones posibles (over, up, down, y hitarea que es la zona clicable, que a veces no suele coincidir con los anteriores).
Y tal y como lo tienes, es reutilizable en AS3, quitando el código de las instancias de botones y colocandolo junto al resto en el frame 1.
dazao
muchas gracias, pero entonces hacer un boton es mucho más laborioso, no entiendo como puede ser que lo que se hacia en 20 segundos ahora te lleve tanto más, ademas veo que hay 3 clips para un sólo boton.
Lo del eval lo usaba para no tener que buscar la ruta del mc, una vez pulsado lo asociaba a la variable _Root.boton_activo y luego al clicar en otro sólo decia _Root.boton_activo.gotoAndPlay('out') para que se desmontará y asignaba a la variable el nuevo boton.
Supongo que no estará bien escrito pero me ha funcionado siempre perfecto, y me ha servido para mil cosas.
Lo que no entiendo es como hacer que un boton quede activado y luego no tenga rollover hasta que no se desactive, o sea hasta que alguien no clique en otro boton y el que antes estaba desactivo se vuelva a activar, grrr, que mal me explico.
Lo que me gustaría es poder exportar la estructura que utilizaba antes a AS3, pues sólo modificando un mc todo lo demás se actualiza, y puedo poner mc en el escenario.
Quiero decir, actualmente, sin AS3, hacer un site es relativamente rápido, y hacer modificaciones también, me da la sensación que en AS3 para hacer lo mismo se tarda 10 veces más, y acepto que estará mucho mejor programado ya que no da pie a equivocaciones pues cualquier error lo revienta, pero es un rollo que en lugar de simplificar el trabajo lo complique de tal forma.
Digo todo esto aunque ahora mismo me estoy leyendo el cookbook de oreilly para aprender y porque no quiero quedarme atrás, pero siento impotencia al ver que no se ni duplicar un movieclip, juer parece que acabe de empezar de nuevo desde 0,...
odrakir
Tal y como lo tienes cárgate el clip "boton" y añade los eventos al clip boton_mc.
Probablemente también te interese hacerle boton_mc.buttonMode = true; para que aparezca la mano.
Por cierto, no sé para qué quieres "eval", pero ya no se usa desde flash 5 o así.
tpmmds
BuenAS:
La clase SimpleButton permite utilizar MovieClips para los distintos estados. Podrías extender esta clase y crearte, por ejemplo, la clase SimpleButtonAnimated:
Boton Animado
En este enlace puedes encontrar un ejemplillo de lo que digo. Va el Fla y una clase llamada SimpleButtonAnimated que es la que crea el botón animado. En la biblioteca deberías tener los skins con las distintas animaciones para los estados Up y Over.
Un saludo.
dazao
Nadie responde?