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.

Por Raxiro el 16 de Febrero de 2009
Muy útil el tip, osea que AS3 ya trae RotationX y todo eso? hmmm
Por ruben el 17 de Febrero de 2009
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 Raxiro el 17 de Febrero de 2009
saludos.
Por fredybg el 17 de Febrero de 2009
Por Erwin el 17 de Febrero de 2009
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.
con cs3 me refiero a flash 9 con AS3.
Solo tengo problema con esto:
Código :
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 Erwin el 18 de Febrero de 2009
por import flash.geom.*;
tal ves ahi si funcione
Por Erwin el 18 de Febrero de 2009
Language Version: ActionScript 3.0
Runtime Versions: Flash Player 10, AIR 1.5
Tendre que esperar
Keith :
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 shadowblade el 18 de Febrero de 2009
gracias!!
Por Alvaro el 24 de Febrero de 2009
Por ronald el 25 de Febrero de 2009
porque me urge aprender todo de programas
ronald -blog :
porque me urge aprender todo de programas
Por pabletein el 03 de Marzo de 2009
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 francisco el 07 de Marzo de 2009
"1180: Llamada a un método Elemento1 posiblemente no definido."
"1180: Llamada a un método Elemento2 posiblemente no definido."
francisco-blog :
"1180: Llamada a un método Elemento1 posiblemente no definido."
"1180: Llamada a un método Elemento2 posiblemente no definido."
Por Naboman el 11 de Abril de 2009
gracias.
Por Herles el 19 de Abril de 2009
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 JasonGamba el 10 de Julio de 2009
Por Yo el 12 de Agosto de 2009
Por jofaco el 13 de Agosto de 2009
gracias
Por roberto el 30 de Octubre de 2009
var c:Tween = new Tween(FocusClip, "z", Strong.easeOut, FocusClip.z, -100, .5, true);
no lo entendi, gracias.
Por deet el 02 de Diciembre de 2009
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 miguel el 07 de Enero de 2010
roberto-blog :
Lamento que suene confuso, pero puedes buscar mas al respecto en documentos de referencia de Flash. Presiona F1.
Por hazael el 10 de Enero de 2010
Por Roberto el 25 de Abril de 2010
1180: Call to a possibly undefined method Elemento1.
le puse como nombre de instancia Elemento1 a un movie clip que se llama Elemento1 tambien y nada... podrias colocar un link de descarga o decirme que sucede?
Por Roberto el 30 de Abril de 2010
ya van como 10 preguntas que hago sobre diferentes temas y incluso abriendo un tema como usuario registrado y nada...
Por charlyn el 20 de Julio de 2010
Muy bueno el tip! pero me aparece el siguiente error.
ReferenceError: Error #1056: No se puede crear la propiedad focus en Elemento2.
at Ease3DMenu/eventHandler()
Será que la clase tiene algo mal escrito o me equivoqué en algo??
Gracias
Charlyn
Por juanzear el 27 de Agosto de 2010
que quiere decir? por que sale gracias por sus enseñazas y coalboracion
PD. bueno copie y pegue unos que no entendia jejeje
Error: Error #1023: Desbordamiento de la pila.
at flash.events::EventDispatcher()
at flash.display::DisplayObject()
at flash.display::Shape()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
Por Gregorio Cruz el 30 de Septiembre de 2010
Saludos.
Por Gregorio Cruz el 02 de Octubre de 2010
Por RedCyanCat el 05 de Marzo de 2011