Ребят, всем привет, очень задолбался поэтому прошу помощи, я в AS3 новичок. Короче пытаюсь сделать я карусель.
Объекты двигаются по эллипсу, меняется угол, от pi/2 до pi (ну примерно до pi - в коде видно).
Когда угол предыдущего объекта становится равным pi - текущий объект перемещается в начало карусели т.е. угол равняется pi/2.
В общем, странное как - то ведет себя каруселька, при больших приращениях угла через пару оборотов расстояние между объектами становится разным, да и иногда объекты не хотят перемещаться в начало карусели. Не могу понять в чем дело.
Баннер вложил в архив.
Полный исходник класса:

Код AS3:
package
{
import flash.display.MovieClip;
import flash.filters.GlowFilter;
import flash.filters.BlurFilter;
import flash.events.Event;
public class MovieClipMotion extends MovieClip
{
public var soapObj:Array; /* array for classes names storage */
public var radiusX:int;
public var radiusY:int;
public var angleEtalon:Number;
public var centerX:int;
public var centerY:int;
public var speed:Number;
/*cunstructor***************************
*Creates array of classes instances for soap
*adding to the scene
***************************************/
function MovieClipMotion():void
{
speed = 0.03;
soapObj = new Array(new AmorSym(),new Vinograd(),new ChocolateSym(),new CoffeSym(),new Vishnya(),new Hugo(),new GreypFR(),new SunDance());
centerX = 1080;
centerY = 170
radiusX = 900;
radiusY = 320;
angleEtalon = 7*( (Math.PI/2)/soapObj.length ) + Math.PI/2;
for(var i:int = 0; i<soapObj.length; i++)
{
var tempItem:MovieClip = soapObj[i];
/*scaling*/
tempItem.scaleX = 1 - (7-i)*0.125;
tempItem.scaleY = tempItem.scaleX;
/*calculate angle*/
tempItem.ugol = i*( (Math.PI/2)/soapObj.length ) + Math.PI/2;
tempItem.x = centerX + radiusX*Math.cos(tempItem.ugol);
tempItem.y = centerY - radiusY*Math.sin(tempItem.ugol);
tempItem.addEventListener(Event.ENTER_FRAME,motion);
addChild(tempItem);
}
this.addEventListener(Event.ENTER_FRAME,changeSpeed);
}
function changeSpeed(e:Event):void
{
speed = (this.mouseX - 500)/3500;
}
function motion(e:Event):void
{
var beforeObj:Object;
//sort
for(var i:int = 4 ; i < 11; i++)
if(this.getChildAt(i).scaleX > this.getChildAt(i+1).scaleX)
this.swapChildrenAt(i,i+1);
if ( angleEtalon > e.target.ugol )
{
e.target.x = centerX + radiusX*Math.cos(e.target.ugol);
e.target.y = centerY - radiusY*Math.sin(e.target.ugol);
e.target.ugol += speed;
e.target.scaleX = (e.target.y+radiusY) / (radiusY+centerY - radiusY*Math.sin(angleEtalon));
e.target.scaleY = e.target.scaleX;
//this.blurInOut(e,e.target.scaleX);
}
else
{
beforeObj = e.target.parent.getChildAt(e.target.parent.getChildIndex(e.target)-1);
if (beforeObj.ugol >= angleEtalon){
e.target.ugol = Math.PI/2;
}
//else e.target.x -= 30;
}
}
function blurInOut(objForBlur:Event, step:Number)
{
var blurF:BlurFilter = null;
blurF = new BlurFilter((1-step)*150,(1-step)*150,1);
objForBlur.target.filters = [new GlowFilter(0xFFFFFF,1,20,20,1.5,1),blurF];
}
}
}