Comunidad de diseño web y desarrollo en internet online

Ayuda por favor: AS3 y botones

Citar            
MensajeEscrito el 28 Ago 2008 04:06 pm
Hola amigos.

Estoy tratando as 3 en flash CS3 y se me presenta el siguiente inconveniente:

Cree un nuevo símbolo de tipo botón y dentro de este en el fotograma "sobre" incluí un campo de texto dinámico.
Cuando aplico el evento mouse_over el campo de texto se debe llenar con un texto. Sin embargo cuando empleo la forma tradicional que empleaba con actiónscript 2, no funciona.

Quisiera saber como lo puedo lograr.

Acontinuación especifico el codigo que he escrito:

La instancia del botón se llama: a

La instancia del campo de texto anidado en el botón a se llama: salida

Código :

function btn_csOver(event:MouseEvent):void {
   a.salida.text="Probando"  //Esta línea genera el error
}

a.addEventListener(MouseEvent.MOUSE_OVER, btn_csOver);



Gracias por cualquier comentario al respecto.

Por charladito

26 de clabLevel



 

msie7
Citar            
MensajeEscrito el 28 Ago 2008 04:10 pm
¿Que dice el error?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Ago 2008 04:17 pm
El error que aparece del compilador dice:

1119: Acceso a una propiedad salida posiblemente no definida mediante una referencia de tipo estático flash.display:SimpleButton

origen: a.salida.text="Probando"

Por charladito

26 de clabLevel



 

msie7
Citar            
MensajeEscrito el 28 Ago 2008 04:38 pm
Usar un botón con algo de programación distinto al evento click ya implica un MovieClip, la clase simpleButton es mas para un look&feel estático. Anyway, para completud, prueba esto:

Código ActionScript :

function btn_csOver(event:MouseEvent):void {      
    event.target.overState.getChildAt(1).text="Probando"  
}
a.addEventListener(MouseEvent.MOUSE_OVER, btn_csOver);


Depende de como sea la gráfica de tu botón, puede que el texto no esté en el nivel 1, prueba 2, 3, etc hasta que lo pille

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Ago 2008 05:09 pm
Gracias Jorge, funciona muy bien como lo haz escrito.

No entiendo muy bien la sentencia y si te es posible agradecería una breve descripción, pues hasta ahora estoy incursionando en AS3.

Reitero mis agradecimientos.

Por charladito

26 de clabLevel



 

msie7
Citar            
MensajeEscrito el 28 Ago 2008 06:11 pm
La clase SimpleButton representa cada estado como overState, normalState, etc (mira la ayuda) Estos estados devuelven un DisplayObject, que puede ser inspeccionado con el método getChildAt para acceder al objeto TextField. Si no se entiende, lo mejor es que repases los conceptos detrás del DisplayList, este PDF tiene una buena intro

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Ago 2008 06:30 pm
ok. Lo revisaré

Gracias Jorge

Por charladito

26 de clabLevel



 

msie7
Citar            
MensajeEscrito el 14 Ene 2011 12:05 pm
Hola,
veo que este post es bastante antigüo con lo que es probable que no se responda pero estoy en una situación similar y no sé como resolverlo....
Quiero hacer una cosa aparentemente secilla pero no hay manera :S. Tengo un Moviclip que contiene varios botones anidados, cada botón contiene un campo de texto. Lo que quiero hacer es simplemente rellenar el campo de texto.

si hago p.e:

Código ActionScript :

    mc_padre.button_hijo.upState.getChildAt(1).text="valor"; 


me da el siguiente error: 1061: Call to a possibly undefined method getChildAt through a reference with static type flash.display:DisplayObject.

si hago:

Código ActionScript :

trace( mc_padre.button_hijo.numChildren); 

el output es undefined, aunque tenga un campo de texto no ve ningún hijo....

Ayuda, please"!

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 14 Ene 2011 01:27 pm
El problema es "tener algo DENTRO de un botón".

Código ActionScript :

//En un MC podemos escribir algo como
mimc.variable=100
//en un botón NO podemos escribir
miboton.variable=100

Y con variable me refiero también a un Mc o a un Texto que esté en ese botón. El motivo es que en AS3 sólo no son selladas las Clases MovieClip y Object
Puedes tratar de hacer una conversión de cast (no sé si funciona)

Código ActionScript :

MovieClip(miboton).variable=100
//ó
TextField(MovieClip(miboton.micaja_texto)).text="Hola Mundo"

¡OJO! eso sólo funcionará si la caja de texto ocupa los tres frames del botón (en otra capa)
Pero, básicamente el problema es tener algo DENTRO de un botón. Lo "suyo" es tener un MC y dentro una caja de texto y un botón. La caja de texto según como sea has de poner la propiedad MouseEnabled=false, para que puedas pinchar el botón cuando estás pinchando la caja de texto

Otra opción es tener el botón DENTRO de un MC y que la caja de texto sea dinámica con valor de la variable, p.e. "caption". Así modificaríamos la propiedad "caption" DEL MC

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Ene 2011 03:14 pm
Gracias Eliseo!
Ha sido de gran ayuda :)

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Ene 2011 10:23 am
Hola de nuevo!
Perdona que insista con el tema pero vuelvo a tener un problema con los campos de texto dentro de un SimpleButton.
Si solo tengo un campo de texto y hago:

Código ActionScript :

TextField(Sprite(auxButton.upState).getChildAt(1)).text="Maria"; //name

no tengo ningún problema, pero ahora el botón tiene varios cambios campos de texto y quiero acceder por el nombre de la instancia del TextField correspondiente y no puedo....Por índice sí:

Código ActionScript :

TextField(Sprite(auxButton.upState).getChildAt(1)).text="Maria"; //name
TextField(Sprite(auxButton.upState).getChildAt(2)).text="102";// level

Por nombre de instancia no, y no lo entiendo:

Código ActionScript :

TextField(Sprite(auxButton.upState).getChildByName("instanceName_01")).text="Maria"; //name
TextField(Sprite(auxButton.upState).getChildByName("instanceName_02")).text="102";// level

Si compruebo cuales son los nombres de las instancias, veo que no se corresponden con los nombres que yo he puesto, por eso me da error...

Código ActionScript :

trace(Sprite(auxButton.upState).getChildAt(1).name); //output: instance385

No quiero acceder por índice porque es para un uso genérico y corro el riesgo de no actualizar el campo de texto que quiero...
¿Alguna sugerencia? No veo que pasa... Gracias :)

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Ene 2011 11:58 am
Hola Buenas, lo primero agradecer por toda la ayuda que se presta en estos foros, y quería plantear un problemilla que tengo. He creado un boton segun la clase SimpleButton de la siguiente manera:

package
{
import flash.display.Sprite;
import flash.display.SimpleButton;
//----------------------------
public class botonSimple extends Sprite {
private var ruta:Sprite
private var boton:SimpleButton = new SimpleButton;
//----------------------------
public function botonSimple(queRuta,queX,queY) {
ruta = queRuta
boton.upState = creaSprite(3,0x000000,0xFF9900,100,30);
boton.overState = creaSprite(3,0x000000,0xFFCC00,100,30);
boton.downState = creaSprite(3,0x000000,0xFFCC99,100,30);
boton.hitTestState = boton.upState;
boton.useHandCursor = true;
boton.x = queX
boton.y = queY
ruta.addChild(boton);
}
//----------------------------
private function creaSprite(lin_grosor, lin_color, relleno_color, ancho, alto):Sprite {
var sprite:Sprite = new Sprite();
sprite.graphics.lineStyle(lin_grosor, lin_color);
sprite.graphics.beginFill(relleno_color);
sprite.graphics.drawRect(0, 0, ancho, alto);
return sprite;
}
}
}


Mi problema es que no consigo modificar la funcion "downState", para que al pulsarlo se me cargue un .swf externo que tengo.

Este código lo he encontrado por la red y la verdad no se mucho de flash, pero tengo mucha necesidad de terminar este trabajillo, y estoy un poco desesperado!! Necesito crear el boton mediante código para que aparezca en una aplicacion que ya tengo creada, y esta es la forma más fácil que he encontrado. Despues de crear esta clase, en la clase principal creo el boton de la forma:

import botonSimple;
var boton1:botonSimple = new botonSimple(this,50,100);

Cualquier ayuda o sugerencia me vendría muy muy bien. Muchas gracias!!

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

chrome
Citar            
MensajeEscrito el 18 Ene 2011 12:48 pm
Para Emed: NO ES LO MISMO la propiedad "name" que el "nombre de instancia"
El nombre de instancia es "una variable que hace referencia a un MC". Ya sé que es confuso. Un ejemplo simple. Tengamos en nuestra película un MC cuyo nombre de instancia sea "ref_mimc" (sin las comillas)
Escribamos

Código ActionScript :

trace(ref_mimc.name)  //saldrá "instance01", p.e.
ref_mimc.name="nombre_mimc"
trace(ref_mimc.name)  //saldrá "nombre_mimc"
getChildByName("nombre_mimc").x=100 //<--se desplazará a la posición 100

He hecho que la propiedad "name" no sea "ref_mimc" para que quede más clara la idea.

Lo que quiero decir es
1.-La propiedad "name" no tiene nada que ver con el nombre de instancia
2.-La propiedad "name" sólo se le puede dar valor mediante programación
3.-El método getChildByName lo que busca es la propiedad "name"

Vale, Visto el problema vamos con la solución. Debemos darle valor a la propiedad name de tus cajas de texto.
Lo podemos hacer en un frame de tu botón (que sería lo suyo, para que todos los Objetos que deriven de esa Clase hagan lo mismo.

Código ActionScript :

upState.instanceName_01.name="instanceName_01"
upState.instanceName_02.name="instanceName_02"

ó en la película principal

Código ActionScript :

MovieClip(auxButton.upState).instanceName_01.name="instanceName_01"
MovieClip(auxButton.upState).instanceName_02.name="instanceName_02"


Antonio, NO tienes que "modificar la funcion "downState" -ni siquiera es una función-, lo que tienes que hacer es, en la clase principal añadir un listener MOUSE_DOWN

Código ActionScript :

import botonSimple;
var boton1:botonSimple = new botonSimple(this,50,100);
boton1.addEventListener(MouseEvent.MOUSEDOWN,botonPulsado)
private function botonPulsado(e:MouseEvent){
     trace(e.target.ruta)
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Ene 2011 02:59 pm
Gracias Eliseo!
Entiendo lo que dices :) pero no tengo acceso a la linea de tiempo (lo hago todo por programación) y con archivos swc importados como 'libreria' por tanto debería optar por la segunda opción:

Código ActionScript :

MovieClip(auxButton.upState).instanceName_01.name="instanceName_01" 
MovieClip(auxButton.upState).instanceName_02.name="instanceName_02" 


Me da el siguiente error: [no se puede convertir flash.display::Sprite@15be8601 en flash.display.MovieClip]
si accedo así:

Código ActionScript :

Sprite(myButton.upState).instanceName_01.name="instanceName_01";

me da el siguiente error:
1119: Access of possibly undefined property instanceName_01through a reference with static type flash.display:Sprite.

De hecho si pudiera acceder a la instancia de texto (que yo decida) contenida en el botón (no por índice) igual no sería necesario asignarle un name...pero no hay manera! Siento insistir pero estoy estancada con esta tonteria y no me deja continuar....

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Ene 2011 03:28 pm
Se me ocurre tratar de hacer una "conversión de cast" a Objet"

Código ActionScript :

Object(auxButton.upState).instanceName_01.name="instanceName_01" 

pero no sé si funcionará :(

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Abr 2012 04:21 pm
Hola buen dia! solicitando de su apoyo ya que estoy creando un menú que nos envie a las diferentes etiquetas creadas, tengo configurado el script de la siguiente manera:

stop();

conv_local.addEventListener(MouseEvent.CLICK, Btnconv_local);

function Btnconv_local(event:MouseEvent):void{
gotoAndPlay("conv_local");
}

conv_local.buttonMode = true;



conv_corp.addEventListener(MouseEvent.CLICK, Btnconv_corp);

function Btnconv_corp(event:MouseEvent):void{
gotoAndPlay("tipos_convenio");
}

conv_corp.buttonMode = true;



mayorista.addEventListener(MouseEvent.CLICK, Btnmayorista);

function Btnmayorista(event:MouseEvent):void{
gotoAndPlay("mayorista");
}

mayorista.buttonMode = true;


consorcio.addEventListener(MouseEvent.CLICK, Btnconsorcio);

function Btnconsorcio(event:MouseEvent):void{
gotoAndPlay("consorcio");
}

consorcio.buttonMode = true;

intro.addEventListener(MouseEvent.CLICK, Btnplay1);

function Btnplay1(event:MouseEvent):void{
gotoAndPlay("intro");
}

intro.buttonMode = true;

paso1.addEventListener(MouseEvent.CLICK, Btnpaso11);

function Btnpaso11(event:MouseEvent):void{
gotoAndPlay("Paso1");
}

paso1.buttonMode = true;


paso2.addEventListener(MouseEvent.CLICK, Btnpaso22);

function Btnpaso22(event:MouseEvent):void{
gotoAndPlay("Paso2");
}

paso2.buttonMode = true;



paso3.addEventListener(MouseEvent.CLICK, Btnpaso33);

function Btnpaso33(event:MouseEvent):void{
gotoAndPlay("Paso3");
}

paso2.buttonMode = true;


contacto.addEventListener(MouseEvent.CLICK, Btncontacto1);

function Btncontacto1(event:MouseEvent):void{
gotoAndPlay("Contacto");
}

contacto.buttonMode = true;




El cual funciona correctamente :wink:


Sin embargo serán varias plantillas con la funcionalidad similar, lo que realice fue copiar el código y sustituir los movie clip correspondientes y asignando las instancias quedando de la siguiente manera:

convloc_nocxc.addEventListener(MouseEvent.CLICK, Btnconv_loc_nocxc);

function Btnconv_loc_nocxc(event:MouseEvent):void{
gotoAndPlay("Conv_loc_nocxc");
}

convloc_nocxc.buttonMode = true;



convloc_cxc.addEventListener(MouseEvent.CLICK, Btnconv_loc_cxc);

function Btnconv_loc_cxc(event:MouseEvent):void{
gotoAndPlay("conv_loc_cxc");
}

convloc_cxc.buttonMode = true;



convloc_agencia.addEventListener(MouseEvent.CLICK, Btnconv_loc_agencia);

function Btnconv_loc_agencia(event:MouseEvent):void{
gotoAndPlay("conv_loc_agencia");
}

convloc_agencia.buttonMode = true;


convloc_cxc_agen.addEventListener(MouseEvent.CLICK, Btnconv_loc_cxc_agen);

function Btnconv_loc_cxc_agen(event:MouseEvent):void{
gotoAndPlay("conv_loc_cxc_agen");
}

convloc_cxc_agen.buttonMode = true;


intro.addEventListener(MouseEvent.CLICK, Btnplay11);

function Btnplay11(event:MouseEvent):void{
gotoAndPlay("intro");
}

intro.buttonMode = true;

paso1.addEventListener(MouseEvent.CLICK, Btnpaso111);

function Btnpaso111(event:MouseEvent):void{
gotoAndPlay("Paso1");
}

paso1.buttonMode = true;


paso2.addEventListener(MouseEvent.CLICK, Btnpaso222);

function Btnpaso222(event:MouseEvent):void{
gotoAndPlay("Paso2");
}

paso2.buttonMode = true;



paso3.addEventListener(MouseEvent.CLICK, Btnpaso333);

function Btnpaso333(event:MouseEvent):void{
gotoAndPlay("Paso3");
}

paso2.buttonMode = true;


contacto.addEventListener(MouseEvent.CLICK, Btncontacto11);

function Btncontacto11(event:MouseEvent):void{
gotoAndPlay("Contacto");
}

contacto.buttonMode = true;


Al momento de ejecutarlo no esta funcionando, no esta reconociendo las instancias asignadas en los movie clip :(


Solicito su apoyo .. estoy asignando algo mal?

Mil gracias a todos y saludos!

Por yoctonan

2 de clabLevel



Genero:Femenino  

chrome
Citar            
MensajeEscrito el 14 Abr 2012 05:42 pm
Haz un post nuevo con tu problema

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.