Visto 3.059 veces.

AS3 – Snippet – MC – Como modificar o acceder al texto de un boton con campo de texto dinamico creado manualmente con la clase Button y flash AS3

How to modify or access the text of a button with dynamic text field manually created with the Button class and Flash AS3

Alguna vez nos hemos encontrado con botones con texto dinamico y hemos querido cambiar el texto del interior dinámicamente mediante código y no hemos podido, si es tu caso y te as encontrado que no puedes cambiar el texto dinamico de un boton pues la solución es sencilla, aquí os dejo los pasos a seguir.

Primero dibujamos un rectángulo en el escenario, pulsamos f8 le damos como nombre de instancia “miBoton” y lo convertimos en símbolo de tipo botón.
Accedemos al botón le añadimos los 3 fotogramas(keyFrames) de estado y le añadimos a cada estado un rectángulo de color diferente y un campo de texto dinámico con nombre de instancia “miTexto”.

Volvemos al escenario y accedemos a la ventana de acciones del primer fotograma y añadimos alguna de las dos opciones del código siguiente:

Option 1

O simplemente podemos utilizar algo más sencillo

Option 2 ( Esta es más mejor ;D )

Cabe destacar que para que el texto se refleje en los tres estados es necesario cambiarlo en los tres, tanto en la opción 1 como en la 2, en la opción 2 la cosa sería tal que así:

De esta manera cambiar el texto dinamico en un botón manual es muy sencillo y evitamos el error 1119: Access of possibly undefined property ot through a reference with static type flash.display:SimpleButton. por intentar acceder directamente al campo de texto dinamico de un boton manual

Social Report xavirobot

8 comments on “AS3 – Snippet – MC – Como modificar o acceder al texto de un boton con campo de texto dinamico creado manualmente con la clase Button y flash AS3

  • Excelente panita, estaba a punto de abandonar AS3 por ese detallito. Funciona a las mil maravillas, thank you

    Reply
  • Hola Javier, tengo una consulta que hacer sobre clases, quiero mostrarles 2 clases que he escrito.

    La primera clase llamada Acomodar hace que con un clic se active el poder trasladar al MC llamada Acomodar dejando presionado el clic del ratón y al soltar el clic del ratón se deje de mover el MC “Acomodar” y se desactive el poder trasladar asta que se le haca otro clic, bueno como en la función Arrastrar y Soltar las deje vacías, no se trasladara el MC.

    En la segunda clase llamada PC, le hice una extensión a la clase Acomodar y sobrescribo las funciones de Arrastrar y Soltar para que se traslade el MC PC y permitir que el MC Acomodar quede fijo donde lo dejo.
    No se me explicar muy bien, asíque les pego el código de ambas clases para que entiendan lo que estoy diciendo.

    —————————————————————————————————————-
    package
    {
    import flash.display.*;
    import flash.events.*;
    public class Acomodar extends MovieClip
    {
    var clic:Number = 0;
    public function Acomodar()
    {
    this.addEventListener(MouseEvent.CLICK,clicIzquierdo);
    }
    function clicIzquierdo(e:MouseEvent):void
    {
    clic++;
    trace(“Cilc “+ clic );
    if (clic > 0 )
    {
    clic = clic – 2;
    }
    if ( clic==0)
    {
    trace(“desactivado”);
    removeEventListener(MouseEvent.MOUSE_DOWN, Arrastrar);
    removeEventListener(MouseEvent.MOUSE_UP, Soltar);
    buttonMode = false;
    }
    else
    {
    trace(“activado”);
    addEventListener(MouseEvent.MOUSE_DOWN, Arrastrar);
    addEventListener(MouseEvent.MOUSE_UP, Soltar);
    buttonMode = true;
    }
    }
    function Arrastrar(e:MouseEvent):void
    {
    //this.startDrag();
    }
    function Soltar(e:MouseEvent):void
    {
    //this.stopDrag();
    }
    }
    }
    —————————————————————————————————————-
    package
    {
    import flash.display.*;
    import flash.events.*;
    public class PC extends Acomodar
    {
    public function PC()
    {
    }
    override function Arrastrar(e:MouseEvent):void
    {
    this.startDrag();
    }
    override function Soltar(e:MouseEvent):void
    {
    this.stopDrag();
    }
    }
    }
    —————————————————————————————————————-
    Ahora mi problema es que yo quiero que se active el poder Arrastrar y Soltar del MC PC presionando el MC Acomodar y no haciéndose clic así mismo pero el código quiero que sea en una clase.
    Me la pase buscando y leyendo mucho, pero no logre vincular líneas de código entre clases.

    Por ejemplo como poner en la clase PC

    public function PC()
    {
    Acomodar.addEventListener(MouseEvent.CLICK,clicIzquierdo);
    }

    Si alguien me dice como es o me da una referencia como buscarlo por internet, se lo agradecería.

    Reply
    • He hecho varias pruebas con tu código y he tenido que hacer algunos arreglos para que funcionara correctamente pero no acabo de comprender que quieres hacer. Para empezar el MovieClip PC donde va a estar? dentro del MovieClip Acomodar o fuera de él?

      Lo digo porque si va a ser dentro lo que yo te recomendaría es que detectaras encima de que movieclip se a echo clic con el ratón y capturar el nombre de instancia de dicho clip y luego arrastrar el clip en cuestión.

      Si por ejemplo dentro del clip Acomodar tienes 4 o 5 movieclips mas y quieres saber encima de cual se ha hecho clic para poderlo arrastrar lo puedes hacer de la siguiente manera.

      Dibuja un rectángulo del color que quieras en el escenario y conviértelo en un movieclip y dale el nombre de instancia contenedor, a continuación crea varios movieclips mas de otros colores para diferenciarlos y dales nombres diferentes, mételos/anídalos dentro del movieclip contenedor manualmente, incluso si quieres mete algún movieclip dentro de algún otro movieclip que este dentro del movieclip contenedor.

      Después en el primer fotograma introduce el siguiente código y pre visualiza, veras que el comportamiento es el siguiente:
      Si haces clic en un movieclip que está dentro del contenedor principal este lo podrás arrastrar individualmente, si haces clic en el contendor principal arrastraras todos los movieclips de su interior, si haces clic encima de un movieclip que está dentro del contenedor principal pero que a su vez tiene otros movieclips, arrastraras esos movieclips junto a su contenedor padre.

      Ahora solo te faltaria jugar con la profundidad o mover los movieclips de contenedor dinamicamente con addChild en el caso de que quisieras imitar un sistema de ventanas tipo windows.

      Reply
  • Soy algo duro explicándome, asíque te diré lo q tengo en la cabeza como resultado final.

    Imagínate que el Escenario es una porción de tierra y en el le pongo MC que serán edificios y quedaran fijos, pero si no me agrada la ubicación donde los puse y quiero cambiarlos de lugar, tengo un botón “Acomodar” una vez que acomode a mi gusto, vuelvo apretar el botón “Acomodar” y vuelven a quedar fijos. Pero los edificios lo vas adquiriendo con el tiempo por eso no puedo poner una cantidad fija de edificios por que al principio comenzare con uno, más tarde dos y etc…

    Y muestro que he logrado hacer todo lo que pongo pero haciendo clic en el mismo MC que quiero mover y no lo logro hacer apretando el MC Acomodar.

    Reply
    • Hola Néstor viste el ejemplo que te dejé? en un principio para hacer eso de los edificios que me planteas lo primero seria preguntarse si es necesario crear las clases como las estas creando, yo lo aria de dos maneras aunque siempre a medida que vas escribiendo código acabas llegando a la manera más optima pero bueno así a voz de pronto yo me lo plantearía de dos maneras. Teniendo en cuenta la programación orientada a objetos tendríamos que un edificio es un objeto o clase con sus propiedades y métodos, las propiedades podrían ser el color, la altura, el número de ventanas etc., y los métodos pues, derrumbar, quemar, mover y acomodar.

      Añadir la lógica de mover y acomodar dentro de la propia clase edificio implicaría también programar la gestión de la posición para que no sea posible acomodar un edificio en un lugar no permitido dentro de la clase principal edificio.

      Esto estaría bien porque posteriormente se podría crear instancias mediante herencia de otros tipos de edificios con propiedades y métodos diferentes que hereden los métodos y propiedades de la clase principal porque podría ser que fuera necesario métodos diferentes entre un rascacielos y un edificio de bomberos por ejemplo, además todos heredarían los métodos mover y acomodar junto a la gestión de posición.

      Pero esto podría no ser lo más adecuado porque estaríamos duplicando una cantidad de código innecesario por cada instancia, por lo que los métodos de gestión de posición o mover y acomodar quizás no deberían ser métodos de la clase edificio, me explico, si lo pensamos con más detenimiento en la vida real un edificio no se puede mover así mismo, es mas prácticamente ninguno se puede mover, y si se pudiera necesitaría de la ayuda de algún elemento externo como por ejemplo una grúa o un camión grande para trasladar casas prefabricadas.

      Por lo tanto eso nos daría la respuesta para la segunda opción que sería crear un clase completamente independiente de la clase edificio que se encargara de gestionar todo lo relacionado a la recolocación de edificios, algo así como una clase Recolocar o una clase Grúa o como la quieras llamar.

      La clase Grúa debería poder recuperar el nombre de instancia del edificio en el cual a echo clic y poderlo recolocar en un sitio permitido. Posteriormente podrás ir añadiéndole más métodos a la grúa como, derribar, rotar edificio, mover grupo de edificios, construir…

      Bueno espero que con el código anterior y esta explicación te ayude a reorientar las clases que te habías planteado, pero bueno tu hazlo como tu veas, mejor.

      Reply
      • Gracias Javier, vos sos el que sabes y yo soy el que estoy aprendiendo, ahora me pongo hacerlo como vos decís y gracias de nuevo por tomarte tu tiempo en contestarme.

        Reply
        • Javier Vicente says:

          Ok, un placer, cuando lo tengas medio planteado si tienes alguna duda, mándame el código por correo e intentare mirármelo cuando pueda, un saludo.

          Reply

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">