Hola
Justo estoy haciendo lo mismo para una galeria de productos... te dejo el codigo q estoy hanciendo.. no esta 100% terminado pero creo q te va a servir, aca tenes un ejemplo de lo como quedaria
http://ar.geocities.com/alfathenus/menu_circular.swfSolo se necesitan 3 leyers con codigos y nada mas. Las imagenes se cargan externamente
Un primer leyer con las variables de configuracion y con las variables q se van a usar
Código :
//cada cuanto tiempo se recalcula la posicion de las carteras
var tiempo:Number = 100;
//radio de la elipse
var radioX:Number = 300;
var radioY:Number = 100;
//desplazamiento de (0,0) del incio del movieclip (seria el centro de la elipse)
var x:Number = 350;
var y:Number = 300;
//contador de los grados
var grados:Number = 0;
//desplazamiento entre cada recalculo de la posicion
var desp:Number = 5;
//cantidad total de carteras
var totalCarteras = 20;
//distancia entre las carteras
var distCarteras:Number = 360/totalCarteras;
//contador de carteras q ya se cargaron
var contCarteras:Number = 0;
//acumulador de distancia
var acumDis:Number = 0;
//minima escala del boton
var min:Number = 10;
//el movieclip q contiene el menu circular, fijate q lo ubico en el (0,0)
var mc:MovieClip = _root.createEmptyMovieClip("catalogo", 1);
mc._x = 0;
mc._y = 0;
var loader:MovieClipLoader = new MovieClipLoader();
var obj:Object = new Object;
Ahora otro
leyer con las funciones q necesitamos
Código :
//Pasa un valor de grados a radianes
function PasarRadianes(grad:Number):Number
{
return (grad*Math.PI)/180;
}
//me da la pocicion y de una cartera en el menu
function PosicionY(grad:Number, radio:Number, y:Number):Number
{
return radio*Math.cos(PasarRadianes(grad))+y;
}
//me da la posicion x de una cartera en el menu
function PosicionX (grad:Number, radio:Number, x:Number):Number
{
return radio*Math.sin(PasarRadianes(grad))+x;
}
//mueve el menu de forma ciruclar
function MoverMenu(mc:MovieClip):Void
{
AsignarEventos(mc);
mc.onEnterFrame = function()
{
desp = ObtenerVelocidad(this);
for(a in this)
if(this[a]._name != undefined)
Reposicionar(mc[a], desp);
}
}
//posiciona la cartera en su nueva hubicacion
function Reposicionar(mc:MovieClip, desp:Number):Void
{
//asigno el nuevo angulo del movieclip
mc.grad += desp
if (mc.grad > 360)
mc.grad = desp;
else if (mc.grad < 0)
mc.grad = 360+desp;
mc._x = PosicionX(mc.grad, radioX, x);
mc._y = PosicionY(mc.grad, radioY, y);
//calculo el tamaño del movieclip
a = (mc.grad > 180)?180-(mc.grad-180):mc.grad;
f = (a * 100) / 180;
r = (f*(100-min))/100;
mc._xscale = 100-r;
mc._yscale = 100-r;
//calculo la profundidad del movieclip
depth = 200-((y+radioY)-mc._y);
mc.swapDepths(depth);
}
//obtengo la velocidad de cambio del angulo de cada mc dependiendo de la posicion del mouse
function ObtenerVelocidad(mc:MovieClip):Number
{
dx = mc._parent._xmouse - x;
vporc = (dx*100)/radioX;
if (vporc > 100)
vporc = 100;
else if (vporc < -100)
vporc = 0;
v = (vporc * 5)/100;
return (v < 0)?Math.ceil(v):Math.floor(v);
}
//asigno los eventos a los mc
function AsignarEventos(){
for(a in mc)
if (mc[a] instanceof MovieClip)
{
mc[a].onPress = function(){
AnularBotones(this._parent, this);
delete mc.onEnterFrame;
if (this.grad < 180)
this.onEnterFrame = function()
{
if ((this.grad-5) > 0)
for(b in this._parent)
if(this._parent[b]._name != undefined)
Reposicionar(this._parent[b], -5);
else
{
for(b in this._parent)
if(this._parent[b]._name != undefined)
Reposicionar(this._parent[b], -this.grad);
delete this.onEnterFrame;
}
}
else
this.onEnterFrame = function()
{
if ((this.grad+5) < 360)
for(b in this._parent)
if(this._parent[b]._name != undefined)
Reposicionar(this._parent[b], 5);
else
{
for(b in this._parent)
if(this._parent[b]._name != undefined)
Reposicionar(this._parent[b], 360-this.grad);
delete this.onEnterFrame;
}
}
}
}
}
//anulos los botones
function AnularBotones(mc:MovieClip, mc2:MovieClip):Void
{
trace(mc)
for(a in mc)
if(mc[a] instanceof MovieClip)
delete mc[a].onPress;
mc2.onPress = function()
{
_root.MoverMenu(mc);
}
}
Y por ultimo un 3er
leyer con la logica de funcionamiento
Código :
obj.onLoadInit = function(target:MovieClip)
{
_root.contCarteras++;
target._x -= target._width/2;
target._y -= target._height/2;
//si se cargaron todas las imagenes, inicio el movimiento del menu
if (_root.contCarteras == _root.totalCarteras)
_root.MoverMenu(_root.mc);
}
loader.addListener(obj);
mc2 = mc.createEmptyMovieClip("cartera0", mc.getNextHighestDepth());
mc3 = mc2.createEmptyMovieClip("img", 1);
mc2.grad = 0;
mc2._x = PosicionX(mc2.grad, radioX, x);
mc2._y = PosicionY(mc2.grad, radioY, y);
loader.loadClip("imagenes/cargar7.jpg", mc3);
for(i = 1; i < totalCarteras; i++)
{
mc2 = mc.createEmptyMovieClip("cartera"+i, mc.getNextHighestDepth());
mc3 = mc2.createEmptyMovieClip("img", 1);
mc2.grad = i*distCarteras;
mc2._x = PosicionX(mc2.grad, radioX, x);
mc2._y = PosicionY(mc2.grad, radioY, y);
//aca podes cargar las imagenes de la manera q vos necesites
loader.loadClip("imagenes/cargar"+random(7)+".jpg", mc3);
}
Bueno, como podras ver lo estoy haciendo para un catalogo de carteras je
Espero q te sirva....
saludos!