Тема: Веревка
Показать сообщение отдельно
Старый 20.11.2009, 16:16
3dgod вне форума Посмотреть профиль Отправить личное сообщение для 3dgod Найти все сообщения от 3dgod
  № 8  
Ответить с цитированием
3dgod

Регистрация: Jan 2008
Сообщений: 1
На основе кода господина etc (спасибо ему больше) публикую код улучшенной веревки, с затухающим колебанием, лимитированным фактором растяжения, с подвешиванием на конце груза и фиксированной точкой привязки верхнего конца.

Груз выполнен в виде мувиклипа на сцене.

Я создаю сразу 8 веревок, с немного различающимеся параметрами, чтобы не одинаково "жили"

Код AS1/AS2:
//функция выборки случайного числа из диапазона
function Range (min:Number, max:Number):Number
{
	var randomNum:Number = Math.floor (Math.random () * (max - min + 1)) + min;
	return randomNum;
}
//создаю контейнеры для 8 линий, привязываю к каждой веревке груз
for (i = 1; i <= 8; i++)
{
	this.createEmptyMovieClip ("line" + i,_root.getNextHighestDepth ());
	_root["line" + i].letter = _root["letter_" + i];
}
//инициализация веревки
this.init = function (num, len, X, line, t)
{
	line.len = len;
	line.wind = 0;
        //таймер для колебаний
	line.t = t;
        //мультипликатор для затухания
	line.multi = 1;
	line.point = [];
	for (var i = 0; i < num; i++)
	{
		var t = new Object ();
		t.x = X;
                //помещаем все точки веревки вверх, чтобы веревка "упала"
		t.y = -200;
		line.point.push (t);
	}
};
 
//собственно "жизнь" веревки
for (j = 1; j <= 8; j++)
{
	this["line" + j].onEnterFrame = function ()
	{
		this.t += 0.1;
                //затухания
		this.multi *= 0.99;
		this.gravity = 20 + this.t;
		this.wind = Math.sin (this.t) * 6 * this.multi;
                //помещаем верхний конец в нужный "гвоздик" и фиксируем
		this.point[0].y = 0;
		this.clear ();
		this.lineStyle (0,0xD7E1EB,100);
		this.moveTo (this.point[0].x,this.point[0].y);
		for (var i = 1, len = this.point.length; i < len; i++)
		{
			//[x1,y1] и [x2,y2] - координаты предыдущей и текущей точки соответственно
			var x1 = this.point[i - 1].x, y1 = this.point[i - 1].y;
			var x2 = this.point[i].x, y2 = this.point[i].y;
			// xd и yd - разница расстояний между точками
			var xd = x2 - x1 + this.wind;
			var yd = y2 - y1 + this.gravity;
			//dist - расстояние между точками
			var dist = Math.sqrt (xd * xd + yd * yd);
			//коррекция расстояния между точками до требуемого (через подобие)
			this.point[i].x = x1 + (xd * (Math.cos (this.t * 1.3) * 1 * this.multi + this.len)) / dist;
			this.point[i].y = y1 + (yd * (Math.sin (this.t * 1.3) * 1 * this.multi + this.len)) / dist;
			this.lineTo (this.point[i].x,this.point[i].y);
		}
                //перемещаем груз к последней точке
		this.letter._x = this.point[this.point.length - 1].x;
		this.letter._y = this.point[this.point.length - 1].y;
	};
 
}