ПОВОРОТ МУВИКЛИПА ПО НАПРАВЛЕНИЮ ДВИЖЕНИЯ

 

Это первая статься по просбе читателя, собственно и просьба читателя тоже первая и на момент написания единственная :). Не всегда именно шарик летает за мышкой, или куда-нибудь еще. Если летит например стрелка, то полет боком смотрится противоестественно. Что-ж, придется эту стрелку поворачивать по направлению движения. Для начала нарисуем саму стрелку: --> и именно по направлению оси х. Превратим заклинанием F8 ее в мувик. Весь остальной пример будет базироваться на скрипте эластика, рассмотреный ранее.

 

onClipEvent (load) { // при загрузке мувика

rad =180 / Math.PI; // рассчитаем отношение градусов к радианам

}

onClipEvent (enterFrame) { // затем каждый кадр

_y += sty=(sty+(_parent._ymouse-_y)*.3)*.8;

_x += stx=(stx+(_parent._xmouse-_x)*.3)*.8;// рассчитаем эластичное движение относительно мыши *

_rotation = Math.atan2 ( sty, stx ) * rad; // рассчитаем угол поворота мувиклипа в радианах и переведем его в градусы **

}

 

* если внимательно сравнивать скрипт эластика и использованный здесь, то увидим разницу - выделено красным: эластика:

_y += sty=(sty+_ymouse*.3)*.8;

_x += stx=(stx+_xmouse*.3)*.8; текущий пример:

_y += sty=(sty+(_parent._ymouse-_y)*.3)*.8;

_x += stx=(stx+(_parent._xmouse-_x)*.3)*.8;

 

в чем разница? в случае эластика

_ymouse - это расстояние по оси у между мышкой и центром мувиклипа в системе координат мувиклипа

а в текущем случае :

(_parent._ymouse-_y) - это расстояние по оси у между мышкой и центром мувиклипа в системе координат родителя мувиклипа.

 

Дело в том, что изменяя свойство _rotation мувиклипа мы влияем на систему координат мувиклипа и, соответственно, на значение _xmouse, _ymouse, что приведет к фатальным последствиям для функционирования скрипта. Для того, чтобы избежать такого влияния мы вычисляем расстояние между мувиклипом и мышкой в системе координат независимой от свойства _rotation мувиклипа, то есть в родительском мувиклипе. ** разберем то, ради чего сей скрипт описан: как поворачивается мувиклип по направлению своего движения. В данном примере я использовал для вычисления угла поворота значения шага по осям х и у - stx и sty соответственно. При рассчете движения объекта практически всегда сначала рассчитывается шаг на основании формулы основной траектории, затем вносятся изменения в его величину под воздействием факторов влияния и уже затем свойства и изменяются на полученные значения шагов, как в примере гравитации . Причем очень легко изменить и пример гравитации для использования.

1) Вместо шарика нарисуйте стрелку,

2) Добавьте рассчет отношения радианов к градусам:

onClipEvent (load) {

rad = 180/Math.PI;

}

3) В конце существующего скрипта добавьте:

onClipEvent (enterFrame) {

_rotation = Math.atan2(speed, 2)*rad;

}

поскольку скорость по оси х неизменна и равняется 2, а по у она рассчитывается и помещается в переменную speed, то их и используем вычислениях. И еще: рекомендую почитать хелп функции Math.atan2() И остался нераскрытым вопрос: почему мы использовали переменные шага (скорости) для вычисления угла поворота? Как поворот зависит от скорости? Получается так: что чем быстрее, тем левее ? :)) Всё как обычно просто: переменная шага (скорости) это разница между текущей и следующей позицией мувиклипа по соответствующей оси. Зная это значение легко рассчитать угол, используя Math.atan2 (а вы почитали хелп?).

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

 

onClipEvent (enterFrame) {

old_x = _x

old_y = _y

-----------

[вычисление следующей позиции ]

-----------

stx = _x - old_x

sty = _y - old_y

_rotation = Math.atan2(st_y, st_x) * rad;

}

 

Hosted by uCoz