Post Escrito

compartir

Menú dinámico con Clases View Comments

Mar11

Luego de unas semanas de no escribír nada, decidí comenzar con una serie de tutoriales sobre Clases.
En este caso se me ocurrió armar un menú o lista dinámica el cual usa dos clases, una para los botones y otra para la lista.
Mi idea era poder crear un menu rapidamente en flash pudiendo indicarle si queremos que sea horizontal, vertical o que tenga varias columnas. (como en el caso de mi “minifolio” donde las miniaturas de mis trabajos estan en varias columnas).

This movie requires Flash Player 9


Clase Boton:

?Ver código ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
La funcion boton asigna los eventos de rollover y rollout automaticamente
y tiene los metodos para habilitaro deshabilitar al boton. Ademas tenemos la opcion de darle al boton un estado de seleccioando
*/
class Boton extends MovieClip {
	// Primero definimos las variables que usaremos dentro de la clase
	public function click() {
	}
	// generamos una funcion click que sera un metodo donde asignaremos la accion del boton
	var press:Boolean;
	// variable booleana que define si el boton tiene o no un estado seleccionado
	var pos:Number;
	// variable donde guardaremos la posicion dentro de la lista que tiene el boton
	/*
	funcion constructora de la clase. En esta funcion asignamos los eventos del boton
	*/
	public function Boton() {
		//en onPress asignamos la funcion click que dira que hacer y en en caso de tener estado seleccionado vamos al mismo y deshabilitamos el boton
		this.onPress = function() {
			this.click();
			if (this.press == true) {
				this.presionado(true);
				_global.seleccionado.presionado(false);
				_global.seleccionado = this;
			}
		};
		// en onRollOver dirigimos el cabezal del boton al frame llamado "over" para generar el efecto
		this.onRollOver = function() {
			this.gotoAndPlay("over");
		};
		// en onRollOut dirigimos el cabezal del boton al frame llamado "out" para generar el efecto
		this.onRollOut = this.onReleaseOutside=function () {
			this.gotoAndPlay("out");
		};
	}
	/*
	METODOS:
	esta es una function privada que lleva a cabo el efecto del boton al ser seleccionado y al dejar de estarlo
	*/
	private function presionado(estado:Boolean):Void {
		if (estado == true) {
			this.gotoAndPlay("press");
			this.enabled = false;
		} else {
			this.enabled = true;
			this.gotoAndPlay("pressout");
		}
	}
	/*
	SETTERS Y GETTERS:
	habilitado es un metodo set y get que habilita y deshabilita segun su valor booleano al boton, con un efecto de alpha sobre el boton
	*/
	public function set _habilitado(estado:Boolean):Void {
		if (estado == false) {
			this.gotoAndPlay("out");
			this.onEnterFrame = function() {
				if (this._alpha>50) {
					this._alpha -= 5;
				} else {
					this.onEnterFrame = null;
					this.enabled = estado;
				}
			};
		} else if (estado == true) {
			this.onEnterFrame = function() {
				if (this._alpha<100) {
					this._alpha += 5;
				} else {
					this.onEnterFrame = null;
					this.enabled = estado;
				}
			};
		}
	}
	public function get _habilitado():Boolean {
		return this.enabled;
	}
	// metodos set y get de _press que asigana si el boton tiene estado de seleccionado o no
	public function set _press(estado:Boolean) {
		this.press = estado;
	}
	public function get _press():Boolean {
		return this.press;
	}
	// metodos set y get de _pos que nos guarda y asigna la posicion en la lista del boton
	public function set _pos(valor:Number) {
		this.pos = valor;
	}
	public function get _pos():Number {
		return this.pos;
	}
}
// fin clase Boton

Clase Lista:

?Ver código ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
Esta clase se encargara de crear una nueva lista, tomando de la libreria un boton
modelo y duplicandolo, dando la opcion de poder pasarle un numero de columnas o si
los botones tendras la funcion presionado.
*/
class Lista extends MovieClip {
	// Primero definimos las variables que usaremos dentro de la clase
	var datos:Array;
	//array que contendra los datos de los botones, como nombre, accion, etc
	var linkage:String;
	//el nombre del linkeage que tendra el boton en la libreria
	var columnas:Number;
	//cantidad de columnas en la que se mostraran los botones
	var sep:Number;
	//separacion en pixeles entre los botones
	var press:Boolean;
	//variable booleana que define si los botones tienen estado presionado o no
	/*
	funcion constructora de la clase, en este caso no tiene nada
	*/
	public function Lista() {
	}
	/*
	METODOS:
	la funcion "crear" crea, como su nombre lo dice, el listado de botones.
	pasamos los parametros necesarios, explicados arriba
	*/
	public function crear(p_datos:Array, p_linkage:String, p_columnas:Number, p_sep:Number, p_press:Boolean) {
		this._visible = true;
		// hacemos visible la lista
		// variable para acomodar el boton en X e Y segun el numero de columnas
		var x:Number = 0;
		var y:Number = 0;
		// asignamos los parametros a las variables de la clase
		this.datos = p_datos;
		this.linkage = p_linkage;
		this.sep = p_sep;
		this.columnas = p_columnas;
		this.press = p_press;
		// bucle for que genera la lista de botones duplicandolos
		for (var i:Number = 0; i<datos.length; i++) {
			var item:MovieClip = this.attachMovie(linkage, "item"+i, i);
			//genera una variable item donde guardamos la referencia al nuevo boton
			//lo posicionamos en X e Y
			item._x = (item._width+sep)*x;
			item._y = (item._height+sep)*y;
			item._press = press;
			//asiganmos el valor pasado como press al metodo press de la clase Boton
			item._pos = i;
			//guardamos la posicion del boton para acciones futuras
			var ruta:Object = this;
			// asignamos a la variable "ruta" la referencia de la clase para usarla dentro de otros metodos y no perder su referencia
			//le asignamos una accion al metodo click creado en la clase Boton (o sea lo que va a hacer el boton)
			item.click = function() {
				trace(ruta.datos[this._pos].dato);
			};
			item.label_txt.text = datos[i].label;
			// ponemos el texto del boton en el campo de texto dinamico que el mismo tiene
			x++;
			//aumentamos el valor de "x" para generar columnas
			// si "x" es igual a columnas vuelve a 0 y aumenta "y" para bajar a la siguiente fila
			if (x == columnas) {
				x = 0;
				y++;
			}
		}
	}
}
//fin de clase Lista

Lo que debemos hacer una vez creadas las clases es armar un MovieClip en Flash que será nuestro botón. Dentro de él tenemos que hacer la animación del efecto over y out con sus respectivas etiquetas en los frames.
Este MC debe estar en la libreria con un linkage el cual utilizaremos para agregar el boton al menú. Además debemos asignarle la Clase “Boton”.
Para la lista creamos un MC vacio en escenario al cual le asiganmos la Clase “Lista” y le ponemos el nombre de instancia que querramos (en este ejemplo “lista_mc”).

Una vez hecho esto en el primer frame de nuestra película escribimos en siguiente código:

?Ver código ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
La idea seria que los datos vengan de un base de datos o un XML y los bolquemos en un array
en este caso cree un array cualquier para que vean como funciona el menú
la propiedad "label" que pueden ver sería en texto que aparecera en el boton, si es que dentro del MC del boton hay un Textfild dinamico con el nombre "label_txt".
y la propiedad datos es un texto que muestra la hacer click en el boton en un trace
*/
listado =[]
listado.push({label:“nombre 1″, dato:“dato a mostrar 1})
listado.push({label:“nombre 2″, dato:“dato a mostrar 2})
listado.push({label:“nombre 3″, dato:“dato a mostrar 3})
listado.push({label:“nombre 4″, dato:“dato a mostrar 4})
listado.push({label:“nombre 5″, dato:“dato a mostrar 5})
listado.push({label:“nombre 6″, dato:“dato a mostrar 6})
//
/*
el metodo que llamamos de la clase lista se llama "crear". Obviamente este metodo crea el menu y le pasamos los siguientes parametros:
1: el array que contiene todos nuestros datos
2: el linkage del boton en la libreria
3: cantidad de columnas
0: menu horizontal
1: menu vertical
2 o +: cantidad de columnas
4: separacion en pixeles entre los botones
5: true si tenemos el estado press en el boton
*/
lista_mc.crear(listado, “boton”, 2, 10, true);

Espero les sirva y lo usen y dejen sus comentarios sobre este experimento

Archivos del tutorial

También te puede interesar:

  • gloorootoo
    Me parece fantástico tu bló, realmente es algo que hacía falta, me parece que estarás viéndome seguido!
  • Se agradece!
    Lo tengo bastante abandona por mucho laburo, pero en algún tiempo volveré a darle pelota!
    Saludos!
  • Richard
    Haber si haces una explicacion con un video tutorial sobre la clase boton
    :D
  • Richard
    Buen aporte haber si lo haces para el AS3, lo cual quiero ese efecto que cuando pasar por un boton hasce la animacion pero al otro boton que le haces click se queda estaticon pero ya no hace la animación,
  • Alonso
    Hola que tal, excelente recurso, andaba buscando como crear menus de una manera simple y ordenada y este esta de lujo, pero tengo una gran duda, ya que con arrays no he trabajado, si yo quiero que los botones tengan una accion como un loadMovie o un getURL, como le hago? ya que no he podido hacer nada más allá del trace que viene :S. Espero no sea mucha molestia que me puedas dar una explicadita con esto porque ando perdido.
  • En lugar del trace poder poner una funcion que le pases como parametro el e.target (o sea el boton que tocaste).
    Y en la función segun el botón que sea ejecutas la acción que quieras.
    Podés verificar con un Switch que botón se toco!

    Saludos!
  • muy bueno realmente tu trabajo.
    recien estoy arrancando en esto de la programacion, y me parece exelente el laburo q haces y la dedicacion q tenes.
    estoy investigando bastante este tutorial, pero todavia hay varios conceptos q no tengo muy claros.
    voy a seguir introduciendome un poco en el tuto para ver que puedo llegar a hacer.
    te felicito y te agradezco por el tutorial q brindaste.
    salute!
  • Hola, nuevamente yo!!! ñ_ñ

    Saben hace poco, tuve la oportunidad de ver un archivo en word en el cual se encuentra un vídeo de una animación, se ve que es de flash ya que menciona Adobe Flash , es de una animación de un monito qu ese empieza a pelear con el mouse, posiblemente ya tuvieron la fortuna de verlo.
    Pero bueno el punto de todo esto es: como puedo exportar un desde flash un archivo para verlo en cuanto abra el documento en word.
  • Hola, Weedo.

    Perdón por la tardanza en contestarte, pero he tenido algo de trabajo. La verdad muchas gracias por tu apoyo. Lo revisaré y estudiaré el AS2.

    Y nuevamente muchas gracias por tu ayuda.
  • Hola Alex.
    Mira, antes que nada tenes que saber que el mundo de Flash es muy amplio, se pueden hacer muchisimas cosas, y cada cosa de distintas maneras.
    Te recomendaria que empieces llendo a www.cristalab.com, un excelente sitio donde tienen tutoriales de todo nivel y un muy buen foro donde puedes preguntar que seguro te contestaran.
    Tal vez te sea mas simple aprender AS2, antes que AS3, teniendo en cuenta que no sabes programar.
    Hechale un vistazo y cuentame, quedo a tu disposición, Saludos!
  • Alex
    Sabes, tengo poco con esto del Flash CS3... he adquirido cierto conocimiento muy básico, sobre los que es Flash. Por otro lado para ser sincero no soy programador, ni mucho menos informático o algo que se le parezca, soy Ingeniero y me gusta esto de la animación pero la verdad no se por donde empezar, hacen mención del AS 2 y AS 3; de los cuales no sé absolutamente nada. De verdad estaría muy agradecido si me dieras una pauta para irme adentrando a esto de los AS's, ya que veo tantos sitios que manejan cosas fabulosas como tu sitio, pero me pierdo entre tanta letra y no le encuentro la lógica. Please help me?
  • La verdad que hace rato veo tus trabajos y ahora con el blog voy viendo la cancha que tenes en el tema, yo recien empiezo asi que estamos con el AS 2, pero pronto me pondre en onda con AS 3. Muy bueno el ejemplo!
  • Buenísima referencia para entrarle a las clases. Muchas gracias por compartirlo.
  • en el ejemplo q puse, en el codigo figura lo del texto, pero a los botones no les puse un campo dinamico. Fijate esta linea de codigo de la clase Lista.

    item.label_txt.text = datos[i].label; // ponemos el texto del boton en el campo de texto dinamico que el mismo tiene

    lo que tenes q hacer es poner en el MC del boton q estas duplicando un campo de texto dinamico q se llame label_txt. El cual toma el valor del Array "listado" que uso en el ejemplo.
  • drito
    Perdona... me equivoqué con otro ejemplo. ya veo que en el ejemplo pones un texto a los botones pero no me funcionan cuando ejecuto el ejemplo original y la verdad es que no se porqué es..

    A ver si me puedes guiar... Saludos
  • drito
    Muy bueno el tutorial... pero tengo un par de preguntitas..
    Necesito un menu pero que los botones tengan un texto, el texto de cada boton lo cojo de un xml. Concretamente no sé como insertarle el texto a los botones de forma dinamica, el xml ya lo tengo formado pero no se como puedo modificar tu ejemplo para que coga ese texto cada boton.
    Si me pudieras ayudar, te lo agradeceria bastante.
    Saludos y gracias de antemano
  • Your are Nice. And so is your site! Maybe you need some more pictures. Will return in the near future.
  • A pedido de Apu les dejo un ejemplo y un .zip con los archivos del tutorial
    Espero les guste y sirva
    Saludos!
  • Apu
    Muy bueno, sería genial también si publicaras un link con un ejemplo terminado para poder ver y comparar resultados.
    Muy bueno en serio, sigue así!
blog comments powered by Disqus

DeCabeza.net usa WordPress y el tema FREEmium.
desarrollado por Dariusz Siedlecki y modificado por DeCabeza.net