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

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

Iv (dembicki@narod.ru)

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


_root.my_mc.onEnterFrame = function() {

this.accel_x = (this.target_x-this._x)/5;

this.accel_y = (this.target_y-this._y)/5;

this.speed_x = (this.speed_x+this.accel_x)*this.damp;

this.speed_y = (this.speed_y+this.accel_y)*this.damp;

this._x += this.speed_x;

this._y += this.speed_y;

};

_root.my_mc.onMouseDown = function() {

this.target_x = _root._xmouse;

this.target_y = _root._ymouse;

};

Значения переменных в "эластичном" скрипте

Тестани. На клик шарик будет устремляться на установленную ему цель. В расчете участвуют переменные: target (цель), accel (ускорение), speed (скорость) и константа damp (затухание). Причем на каждое измерение собственная переменная.

При установке переменной target мы первым делом вычисляем ускорение, которое составит одну пятую часть расстояния между мувиком и целью. Затем к скорости прибавляем ускорение, но тут же чуток прибиваем затуханием. После вычисления скорости изменяем координаты объекта на значение скорости.

TIPS 11

То же самое можно написать гораздо короче:

_root.my_mc.onEnterFrame = function() {

this._x += this.speed_x=(this.speed_x+(this.target_x-this._x)/5)*this.damp;

this._y += this.speed_y=(this.speed_y+(this.target_y-this._y)/5)*this.damp;

};

Именно этот вариант и будем юзать в нашем скрипте.

Вернемся к веревке и привяжемся с эластичностью к узловым мувиклипам. Значения, которые мы рассчитали для позиции узловых точек, теперь будем применять иначе: они станут значениями цели - target для них. Эластику можем повесить каждому мувику на событие enterFrame, но лучше рассчитывать все в одном месте во избежание торррмозззов.

Добавим в класс переменную затухания:

p.damp = 0.9;

Оформим расчет эластичной позиции в одной функции в классе:

p.update = function(prev_mc, next_mc, damp) {

var y = (prev_mc._y+next_mc._y+this._parent.weight)/2;

var x = (prev_mc._x+next_mc._x)/2;

this._x += this.sx=(this.sx+(x-this._x)/5)*damp;

this._y += this.sy=(this.sy+(y-this._y)/5)*damp;

};

А на onEnterFrame применим функцию ко всем узловым мувикам, передав в аргументах предыдущий и следующий мувик в массиве и значение затухания.

p.onEnterFrame = function() {

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

this.update.apply(this.arrMC[i], [this.arrMC[i-1], this.arrMC[i+1], this.damp]);

}

};

Потесть. Уже похоже! Осталось только нарисовать веревку.

ВЕРЕВКА И МЫЛО

Для начала просто соединим все точки массива прямыми линиями:

p.onEnterFrame = function() {

this.clear();

this.lineStyle(0, 0, 100);

this.moveTo(this.arrMC[0]._x, this.arrMC[0]._y);

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

this.update.apply(this.arrMC[i], [this.arrMC[i-1], this.arrMC[i+1], this.damp]);

this.lineTo(this.arrMC[i]._x, this.arrMC[i]._y);

}

this.lineTo(this.arrMC[i]._x, this.arrMC[i]._y);

};

Теперь к главному: как бы нам все эти точки соединить кривой, да еще так, чтобы она не заламывалась на изгибах. Я и сам поначалу обломался.

Есть три узловые точки (на рисунке 1, 3, 5), соединенные гладкой кривой. Кривая эта будет гладкой только до тех пор, пока точки 2, 4 и узловая точка 3 будут находиться на одной прямой. Как только одна из точек сместится с этой прямой, тут же образуется угол. А этого мы должны избежать.

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