Cristalab

Crear una Botonera Dinámica en ActionScript 2.0

Por: penHolder + 06.11.2007

Mediante este tip voy a explicar cómo crear una botonera dinámica como esta:



Para empezar vamos a crear un clip en nuestra biblioteca que sera nuestro botón modelo, también creamos un campo de texto dinamico instanciado como "t"



Luego, cuando ya tenemos nuestro botón en la biblioteca, hacemos click con el boton derecho, y en la parte de vinculación le damos un nombre y aplicamos la opción de vinculación para Actionscript y exportar en el primer fotograma.



Ahora vamos con el código.

Primero creamos un MovieClip vacio q contendrá los botones.

Código :

this.createEmptyMovieClip("botonera",this.getNextHighestDepth());


Luego declaramos un Array que contendrá la cantidad de botones a crear y sus nombres.

Código :

var labels:Array = Array("home","about","services","contact");


Ahora con width() escribimos dentro del clip vacio para evitar problemas de rutas.

Código :

with(botonera){
}


Primero posicionamos la botonera:

Código :


with(botonera){
   this._x = 50;
}


Luego creamos un for seteado por la longitud del Array.

Código :


with(botonera){
  this._x = 50;
  for(i=1;i <= labels.length; i++){
  }   
}


Ahora declaramos una vaiable de tipo MovieClip que funcionara de modelo a nuestros botones y le damos por valor cada boton attachado.

Código :


with(botonera){
  this._x = 50;
  for(i=1;i <= labels.length; i++){
    var modelButton:MovieClip = this.attachMovie("boton", "boton"+i , this.getNextHighestDepth ());
  }   
}


Posicionamos los botones.

Código :


with(botonera){
  this._x = 50;
  for(i=1;i <= labels.length; i++){
    var modelButton:MovieClip = this.attachMovie("boton", "boton"+i , this.getNextHighestDepth ());
    modelButton._x = 0;
    modelButton._y = ((i*0)+this._height) +5; //multiplicamos por 0, para q la distancia sea constante
  }   
}


Le ponemos título a cada botón, dados por los elementos del Array.

Código :


with(botonera){
  this._x = 50;
  for(i=1;i <= labels.length; i++){
    var modelButton:MovieClip = this.attachMovie("boton", "boton"+i , this.getNextHighestDepth ());
    modelButton._x = 0;
    modelButton._y = ((i*0)+this._height) +5; //multiplicamos por 0, para q la distancia sea constante
    modelButton.t.text = labels[i-1];
  }   
}


Ahora eventos de rollOver y rollOut.

Código :


with(botonera){
  this._x = 50;
  for(i=1;i <= labels.length; i++){
    var modelButton:MovieClip = this.attachMovie("boton", "boton"+i , this.getNextHighestDepth ());
    modelButton._x = 0;
    modelButton._y = ((i*0)+this._height) +5; //multiplicamos por 0, para q la distancia sea constante
    modelButton.t.text = labels[i-1];
    modelButton.onEnterFrame = function (){         
         //ecuacion para la trancicion de alpha
         //donde: a = transparencia
         //       v = velocidad de trancicion
         this._alpha += (this.a - this._alpha) /this.v;
                  
         //si el cursor esta sobre el boton...         
         if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
            //...cambia su transparencia al 50%
            this.a = 50;
            this.v = 5;
            
            //sino, vuelve o se mantiene al 100%
            } else{
               this.a = 100;
               this.v = 10;
            }
         }
       }
  }   
}


Finalmente para eventos de click usamos onMouseDown()

Código :

modelButton.onMouseDown = function (){
      if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
      if(this._name == "boton1"){
          trace("welcome home")//acciones
      }
      if(this._name == "boton2"){
         trace("about us")//acciones
      }
      if(this._name == "boton3"){
         trace("our services")//acciones
      }
      if(this._name == "boton4"){
         trace("contact us")//acciones
      }
   }
}


Cada botón nos muestra un mensaje distinto en el output.



Cómo ven para añadir otro botón solo deben agragar un elemento más al Array

Aquí pueden descargar el .fla

Espero les sirva Guiño

Etiquetas actionscript

Comentarios | Enviar un comentario
Esta muy bueno y practico!!!
*esperando la version de clases
Por: CarlosRuminott
no pude descargar el fla, me aparecireon un monton de simbolos raros y entre eso el AS, curioso nunca me habia pasado!!!
no importa lo voy a hacer manualmente.
Por: CarlosRuminott
Buen aporte, pero...

Código :

modelButton._y = ((i*0)+this._height) +5; //multiplicamos por 0, para q la distancia sea constante
constante??? es decir siempre cero??? Confundido
Esto debería ser solamente:

Código :

 modelButton._y = this._height+5;

Por: Otaku RzO
Que tal chicos el tutorial es muy bueno peroooo hay varios comentarios que debo hacer Lengua
Otaku ya se dio cuenta de un error pero..

La onda sería así..

Código :

 modelButton._y = (this._height*i)   (5 * i);


Y para hacerlo mas practico sería cuestión de crear una var "distancia" donde ahi la modificamos a gusto, sin tener que buscar ese 5 escondido.

Otra cosa,, para los estados de over y out, definitivamente no usaría onEnterFrame, sino preguntale a Freddie Aw Crap
De ultimaaaa le haces un enterframe que inicie cuando estás sobre el boton, y que este se elimine cuando se sale de el y ya.

Yo por lo general lo que hago (que ya me lo tome como mi estandar de botoneras) es dentro del MC le creo 2 o 3 labels en la linea de tiempo(o más si es necesario). Algo como INN, OUT, OFF, y por ejemplo

Código :

boton.onRollOver = function(){
   this.gotoAndPlay('INN');
}

Esto es bueno por si queremos hacer algun efecto que no podemos lograr en AS o que nos llevaría mucho menos tiempo realizarlo "manualmente". O también podría suceder si no sabemos tanto AS como para crear efectos "zarpados" (es mi caso Triste )

Saludos chicaos.
Por: Raxiro_blog
Fe de erratas (son las 8:50am!! Lengua)

Código :

modelButton._y = (this._height*i)   (5 * i);

Por: Raxiro_blog
otra vez io... bueno no sale el más y nose porque

Código :

 modelButton._y = (this._height*i) "MAS" (5 * i);

Por: Raxiro_blog
@Raxiro: lo probaste ?! Se separa mucho U_U
En si debería ser:

Código :

modelButton._y = (modelButton._height + 5)*i;

Pero si no quieren el espacio vacío al inicio:

Código :

modelButton._y = ((modelButton._height + 5)*i) - modelButton._height;

Por: Otaku RzO
es cierto es q al escribir this, me lo toma como el clip botonera, y yo queria q se refiera a modelButton, zks por la correccion Bien
Por: penHolder
perfecto muy bueno. Pero cuando lo vinculo y lo paso a dreamweaver 8 el vinculo no funciona. Hice algo mal?
Por: jose_blog
si en ves de tirar un mensaje me llamara un swf, donde debo cambiar el codigo?
Por: sarj

sarj :

si en ves de tirar un mensaje me llamara un swf, donde debo cambiar el codigo?

Si en vez de preguntar checaras primero el tip completo? haber si esto te dice donde cambiarle

Código :

modelButton.onMouseDown = function (){
      if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
      if(this._name == "boton1"){
          trace("welcome home")//acciones
      }
      if(this._name == "boton2"){
         trace("about us")//acciones
      }
      if(this._name == "boton3"){
         trace("our services")//acciones
      }
      if(this._name == "boton4"){
         trace("contact us")//acciones
      }
   }
}

Por: flashreloco
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.