Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #27, ФЕВРАЛЬ 2003 г.

TIPS OF FLASH: взмылим веревку!

Iv (dembicki@narod.ru)

Спецвыпуск Xakep, номер #027, стр. 027-104-2


Здорово, но непонятно, зачем все эти точки. Разберемся, к чему мы стремимся. Разложим на простые составляющие поведение нашей веревки. Немного о физике происходящего: если повесить веревку за оба конца, какие силы будут на нее действовать? Естественно, сила тяжести, которая будет действовать на все точки веревки. Ей будет сопротивляться сила упругости. И поскольку любая веревка или ее часть имеет массу, то в динамике должна присутствовать инерция.

СИЛА УПРУГОСТИ

Сила упругости заставляет все точки веревки стремиться занять позицию точно между двумя соседними точками.

Реализуем это, рассчитывая по очереди координаты всех мувиков в массиве, кроме первого и последнего - это наши кнопки, они будут определять начало и конец веревки.

p.onEnterFrame = function() {

for (var i = 1; i<this.arrMC.length-1; i++) {

var s = this.arrMC[i-1];

var c = this.arrMC[i];

var e = this.arrMC[i+1];

c._x = (s._x+e._x)/2;

c._y = (s._y+e._y)/2;

}

};

А вот теперь можно и тестануть, предварительно приаттачив мувик "cord":

_root.attachMovie("cord", "cord0", 0);

Только кнопки-то еще не драгаются.

TIPS 7

Drug&Drop делаем так:

_root.start_mc.onPress = _root.end_mc.onPress=startDrag;

_root.start_mc.onRelease = _root.end_mc.onRelease=stopDrag;

Тестанем еще раз. Теперь все в порядке. Кнопки драгаются, точки встают в позицию.

TIPS 8

Чтобы лучше понять, как все пашет, поиграйся со скриптом, попробуй поменять значение переменной this.num на событии onLoad и посмотри, что из этого выйдет. Не увлекайся большими числами - тормоза включатся довольно рано.

TIPS 9

Уже на базе этого скрипта можно придумать какие-нибудь эффекты. Вместо рисования крестика приаттачь какой-нибудь интересный объект с анимацией. Например, смотри известный исходник Антона Волкова: http://steelcrown.com/ru/interesting/lab/titans/

ГРАВИТАЦИЯ

Сила тяжести будет тащить любую точку веревки вниз. Но ей будет противостоять сила упругости. Точка равновесия этих сил будет находиться ниже среднеарифметического значения координаты двух соседних точек. То есть нам достаточно прибавить к _у координате каждой точки некое число.

TIPS 10

Это число для последующего программного изменения лучше поместить в переменную в классе. Вот так:

p.weight = 3;

Тогда строка

c._y = (s._y+e._y)/2;

будет выглядеть так:

c._y = (s._y+e._y)/2+this.weight;

Вот мы и добавили фактор гравитации. Как все просто! Тестани!

ЭЛАСТИКА

Каждая точка веревки имеет массу, поэтому при движении этих точек должна присутствовать инерция. То есть любая точка веревки должна при перемещении от состояния покоя, плавно увеличивая свою скорость, стремиться к новой мертвой точке - точке покоя. Но не останавливаться на ней сразу, а по инерции пролетать дальше. Но тут ей начнет противодействовать сила упругости, которая так же плавно начнет изменять скорость на противоположную.

Чтобы в этом разобраться, давай сохраним наш проект и откроем новый. Делаем мувик, рисуем в нем симпатичный шарик, задаем ему имя экземпляра "my_mc" и в первом кадре рута напишем:

_root.my_mc.damp = 0.9

Назад на стр. 027-104-1  Содержание  Вперед на стр. 027-104-3