Показать сообщение отдельно
Старый 11.02.2012, 08:36
DimkaN вне форума Посмотреть профиль Отправить личное сообщение для DimkaN Найти все сообщения от DimkaN
  № 1  
Ответить с цитированием
DimkaN

Регистрация: Feb 2012
Сообщений: 14
По умолчанию глючит карусель в баннере

Ребят, всем привет, очень задолбался поэтому прошу помощи, я в 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];
		}
 
	}
}
Вложения
Тип файла: rar SoapBay2.rar (262.7 Кб, 34 просмотров)