¿Quieres registrarte?

Cómo crear un menú dinámico 3D con Actionscript 3

Por: M@U
16 de Febrero del 2009
5083 de clabLevel
Otros artículos de M@U
17,233 visitas

Continuando con el tip anterior, hago muestra de esta sencilla clase, que es capaz de llamar un grupo de Clips de película a través de un Array, mientras estos estén contenidos en la biblioteca y así agregarlos al escenario para formar un menú dinámico en tercera dimensión similar al siguiente:


Feel the experience!


Como podrás ver, se explota la técnica para detectar que cara se mantiene visible hacia la pantalla, completamente explicada aqui, solo que aplicada a múltiples objetos, todo simultáneamente.

Esta es la clase:

Código :

package  
{
   import flash.events.Event;
   import flash.events.MouseEvent;
   import flash.display.MovieClip;
   import flash.display.Sprite;
   import flash.geom.Matrix3D;
   import flash.geom.Point;
   //
   import fl.transitions.*;
   import fl.transitions.easing.*;
   //
   public class Ease3DMenu extends Sprite  
   {
      private var Elements:Array;
      private var FocusClip:MovieClip;
      private var P1:Point, P2:Point, P3:Point;
      private var magnitud:Number = new Number();
      private var container:Sprite = new Sprite();
      private var elementArr:Array = new Array();
      //
      public function Ease3DMenu (array:Array = null):void  
      {
         container.x = 250;
         container.y = 150;
         addChild(container);
         container.buttonMode = true;
         if(array != null){Elements = array;}
         for (var i:int = 0; i < Elements.length; i++)
         {
            var element:MovieClip = Elements[i];
            //
            element.x = element.width / 2 - ((element.width + 10) * Elements.length) / 2 + i * (element.width + 10);
            element.addEventListener(MouseEvent.CLICK, eventHandler);
            elementArr.push({elm:element, z:100});
            container.addChild(element);
            element.stop();
         }
         addEventListener(Event.ENTER_FRAME, eventHandler);
      }
      //
      private function eventHandler(event:Event):void
      {
         switch(event.type)
         {
            case Event.ENTER_FRAME:
            container.rotationX =  container.mouseY /10;
            container.rotationY =  container.mouseX /10;
            //
            for (var i:int = 0; i < elementArr.length; i++)
            {
               P1 = elementArr[i].elm.localToGlobal(new Point(0,0));
               P2 = elementArr[i].elm.localToGlobal(new Point(100,0));
               P3 = elementArr[i].elm.localToGlobal(new Point(0,100));
               elementArr[i].elm.gotoAndStop(((P2.x-P1.x)*(P3.y-P1.y) - (P2.y-P1.y)*(P3.x-P1.x)) > 0 ? 1 : 2);
            }
            break;
            //
            case MouseEvent.CLICK:
               if (FocusClip)
               {
                  FocusClip.focus = true;
                  var a:Tween = new Tween(FocusClip, "z", Strong.easeIn, FocusClip.z, 100, .5, true);
                  var b:Tween = new Tween(FocusClip, "rotationY", Strong.easeIn, FocusClip.rotationY, 0, .5, true);
               }
               //
               FocusClip = MovieClip(event.currentTarget);
               container.addChild(FocusClip);
               var c:Tween = new Tween(FocusClip, "z", Strong.easeOut, FocusClip.z, -100, .5, true);
               var d:Tween = new Tween(FocusClip, "rotationY", Strong.easeOut, FocusClip.rotationY, 180, .5, true);
            break;
         }
      }
   }
}
Y su uso (también muy sencillo) es el siguiente, donde "Elemento1" y "Elemento2" son Clips de película de la Biblioteca:

Código :

import Ease3DMenu;
var elementos:Array = new Array (new Elemento1(), new Elemento2());
var menu:Ease3DMenu = new Ease3DMenu(elementos);
addChild(menu);


Nótese que en esta clase he empleado la clase Tween nativa de Flash y no otro tipo de librería externa, que aunque prefiero utilizarlas me parecía menos apropiado ya que obligaría a quien la use tener que conseguirla para hacer funcionar el ejemplo.

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas flash 3d actionscript_3

Comentarios | Enviar un comentario
M@U sos muy groso! :)
Por: Raxiro-blog
Se ve muy bien!!
Por: nashCode
Que bien!!! justo lo que buscaba... gracias!
Por: Chevy
Ya me estoy quedando atrás con AS, ojala pronto tenga mas tiempo y retome flash.

Muy útil el tip, osea que AS3 ya trae RotationX y todo eso? hmmm
Por: gcm
wow! muy bueno el ejemplo M@U (y)
Por: Zguillez
OMFG!!! Excelente M@U. Felicitaciones!!!
Por: The Fricky!
hola muy buen tip.
pero me da el siguiente error :

"1180: Llamada a un método Elemento1 posiblemente no definido."

"1180: Llamada a un método Elemento2 posiblemente no definido."

que puedo hacer???
Por: ruben-blog
Ruben no se si estaré en lo correcto, pero si no tenés el flash player 10 no creo que lo puedas hacer funcionar.
saludos.
Por: Raxiro-blog
Genial ejemplo M@U (H)
Por: fredybg
si tengo cs4 con as3 y reproductor 10 activo
Por: elpk
Me gusto mucho, ese efecto 3D se ve muy bien, solo tengo una pregunta, ¿Este efecto se puede en Flash CS3?, (ya que lo intente pero no me quedo). :)
Por: Keith_NT
cs3???
cs3 es la version del flash, o adobe en general.

supongo que tu pregunta apunta a lo siguiente:
puedo hacerlo con action script 2??

No, no se puede. esta hecho con codigo as3, no as2

otra cosa, por si tu pregunta no era esa... es una clase, no puedes llegar y pegar ese codigo en un documento de as3, ese codigo es llamdo desde un documento de flash donde estan los movieclips y todo el cuento.

Con respecto a este tip, esta muy interesante, como medio para aprender nuevas cosas del as3, pero dudo que sea aplicable en una pagina "normal", tipo 2.0 y esa basura, basura porque el 1.0 , 2.0.... es lo mismo, como dicen por ahi: "es la misma mierda con distintas moscas". -off comment.

ahora si quieres hacer una pagina personal, esta muy bien, se pueden hacer muchas aplicaciones interactivas en 3D, y le puedes dar un toque innovador y atractivo.

reitero, muy buen dato M@U.
Por: Erwin-blog
Tal vez no me di a entender,
con cs3 me refiero a flash 9 con AS3.

Solo tengo problema con esto:

Código :

import flash.geom.Matrix3D;


ya que dice que no se encuentra.

Nota: Erwin, ya se manejar clases y la diferencia entre AS2 y AS3, no tienes que explicamelo .
Por: Keith_NT
cambia import flash.geom.Matrix3D;
por import flash.geom.*;

tal ves ahi si funcione
Por: Erwin-blog
estube buscando y en adobe dice lo siguiente de Matrix3D

Language Version: ActionScript 3.0
Runtime Versions: Flash Player 10, AIR 1.5
Por: Erwin-blog
ok, gracias Erwin.
Tendre que esperar :( .
Por: Keith_NT

Keith :

Tal vez no me di a entender, con cs3 me refiero a flash 9 con AS3.
Lamentablemente necesitaras AS3 pero en Flash Player 10, recurre a Flash CS4.

Ahora, no creo que puedas recrear el efecto (al menos no con la simpleza como tal) en lenguajes anteriores debido a que no fue sino hasta CS4 que fueron incorporados varios métodos para el manejo de figuras en ejes tridimensionales. En este aspecto tiene razón Erwin.

@ruben: Debes crear un par de MCs en tu biblioteca e instanciarlos dentro del Array, no copies tan literalmente el código.

Muchas gracias a todos por los comentarios,
Por: M@U
Me viene de 10 muchas gracias y sigan a si
Por: shadowblade
Excelente tip ^^
Por: Zah
por ahora no entiendo un carajo de as3, pero esto esta buenisimo!!! en algun lado lo metere!!!
gracias!!
Por: pabletein
Ostres, está estupenda esa clase. Muy buen aporte. Graciaaaas!!!
Por: Sisco
Hola, tengo un problema...como hago para que cada clip de estos me funcione como un boton y me lleve a un frame en especial...gracias
Por: Alvaro-blog
hola amigo solo deseo que me enseñes una forma de como crear una calculadora normal y la cienifica
porque me urge aprender todo de programas
Por: ronald -blog

ronald -blog :

hola amigo solo deseo que me enseñes una forma de como crear una calculadora normal y la cienifica
porque me urge aprender todo de programas
See, de hecho adaptando un poco la clase lograras ese mismo efecto de calculadora también.
Por: M@U
Al dar click sobre la A aparece la B y como hago para que al darle click a la B regrese a la A... es posible darle dos acciones al mismo boton?
Por: Chevy
re bueno!!
pero no me funciono!!!

una pregunta, los movies los va pegando en linea??? no se podrian poner en cuadricula???
eso si que es lo que necesito... jaja

Saludos y fecitaciones!!
Por: pabletein-blog
tengo cs4 y flash 10 y el compilador me tira los errores
"1180: Llamada a un método Elemento1 posiblemente no definido."
"1180: Llamada a un método Elemento2 posiblemente no definido."
Por: francisco-blog

francisco-blog :

tengo cs4 y flash 10 y el compilador me tira los errores
"1180: Llamada a un método Elemento1 posiblemente no definido."
"1180: Llamada a un método Elemento2 posiblemente no definido."
Debes exportar un par de MCs de tu biblioteca con esos nombres de instancia. Las gráficas de los botones NO son dibujadas dinamicamente, la clase se encarga de crear solamente el resto del efecto.
Por: M@U
¿Existe en la pág. algún enlace para descargarse todo el ejemplo completo (p. ej. en un zip)? Es que soy nuevo en AS3 y me cuesta mucho interpretar este tutorial... si ya estuviera realizado, podría bichearlo...

gracias.
Por: Naboman
Hola, yo tengo este error.

1119: Acceso a una propiedad rotationX posiblemente no definida mediante una referencia con tipo estático flash.display:Sprite.

estoy usando el CS3 9.0
Por: Herles-blog
Hola, tengo un problema, no se en donde poner el codigo de la clase, intente poniendolo en un archivo .as pero no funcionó, si alguen me puede ayudar, estaría muy agradecido, gracias. y exelente resultado
Por: JasonGamba
Jugate con los pibes y hace nuevos tips. Son la posta los tuyos
Por: Yo-blog
hola, tengo el siguiente problema me aparece este error 1180: Llamada a un método addFrameScript posiblemente no definido.
gracias
Por: jofaco-blog
hola me gustaria si me pudieran alludar con esto:

var c:Tween = new Tween(FocusClip, "z", Strong.easeOut, FocusClip.z, -100, .5, true);

no lo entendi, gracias.
Por: roberto-blog
hola no pude hacer funcionar el menú, he copiado el código de la clase y el script para agregar el menú al fla y me saltan errores:

1119: Access of possibly undefined property rotationX through a reference with static type flash.display:Sprite.

1119: Access of possibly undefined property rotationY through a reference with static type flash.display:Sprite.

1172: Definition flash.geom:Matrix3D could not be found.

no encuentra la clase Matrix3D, la he buscado en internet y parece que está disponible a partir de CS4, puedo conseguir la clase de forma independiente, funcionará en CS3?
Por: deet
alguien podria subir el archivo de eso aplicado o pasarlo por mail? graciass
Por: miguel-blog

roberto-blog :

var c:Tween = new Tween(FocusClip, "z", Strong.easeOut, FocusClip.z, -100, .5, true);
Se crea una instancia "c" de tipo tween, luego se aplica la misma sobre el boton (displayObject) instanciado como "FocusClip", ya de ultimo se afecta a su profundidad (z) con un ease determinado (Strong.easeOut).

Lamento que suene confuso, pero puedes buscar mas al respecto en documentos de referencia de Flash. Presiona F1.
Por: M@U
La verdad esta de lujo el menu pero me asalta una duda si tuvieras que realizar el menu en swf aparte, insertarlo en la pagina, como lograr que no se devuelva el menu al esta primero ¿Como cargar los contenidos sin afectar la pelicula que contiene el menu?
Por: hazael
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.