Тема: Веревка
Показать сообщение отдельно
Старый 12.04.2014, 22:13
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 2  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Я просто не переделывал код в вашем файле, а написал с нуля. Мой код в классе, но это не должно вам помешать понять его логику. Там почти всё тоже самое.
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	/**
	 * ...
	 * @author samana
	 */
	public class Main extends Sprite 
	{
		private var p:Sprite;
		private var pArr:Vector.<Sprite> = new Vector.<Sprite>();
		public function Main():void 
		{
			//создаю части верёвки в виде прямоугольников и заношу их в массив
			for (var i:int = 0; i < 60; i++) 
			{
				p = new Sprite();
				p.graphics.beginFill(0);
				p.graphics.drawRect( -3, -2, 6, 4);
				p.graphics.endFill();
 
				p.x = i * 5;
				p.y = 100;
 
				addChild(p);
				pArr[i] = p;
			}
 
			//при движении мыши двигаю верёвку
			stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
		}
 
		private function stage_mouseMove(e:MouseEvent):void 
		{
			//сначала выствляем верёвку от первого звена (которое в координатах мыши)
			//до последнего
			pArr[0].x = mouseX;
			pArr[0].y = mouseY;
			for (var i:int = 1; i < pArr.length; i++) 
			{
				var p1:Sprite = pArr[i-1];//предыдущее звено
				var p2:Sprite = pArr[i];//текущее звено
				var ang:Number = Math.atan2(p1.y - p2.y, p1.x - p2.x);
				var dx:Number = p1.x - p2.x;
				var dy:Number = p1.y - p2.y;
				var dist:Number = Math.sqrt(dx * dx + dy * dy);
 
				p2.rotation = ang * 180 / Math.PI;
				if (dist > 10)
				{
					p2.x += (dist-10)*(dx/dist);
					p2.y += (dist-10)*(dy/dist);
				}
			}
			//------------------------- revers
			//перебераем звенья в обратном порядке, от фиксированного конца, до начального звена
			//фиксирую последее звено
			pArr[pArr.length - 1].x = 100;
			pArr[pArr.length - 1].y = 100;
			//цикл начинаю с предпоследнего звена, ведь последнее звено зафиксировано
			for (i=pArr.length-2; i >= 0; i--) 
			{
				p1 = pArr[i+1];//звено следующее (в сторону начала верёвки)
				p2 = pArr[i]; // текущее звено
				ang = Math.atan2(p1.y - p2.y, p1.x - p2.x);
				dx = p1.x - p2.x;
				dy = p1.y - p2.y;
				dist = Math.sqrt(dx * dx + dy * dy);
 
				p2.rotation = ang * 180 / Math.PI;
				if (dist > 10)
				{
					p2.x += (dist-10)*(dx/dist);
					p2.y += (dist-10)*(dy/dist);
				}
			}
		}
 
	}
 
}