ПОВОРОТ МУВИКЛИПА ПО НАПРАВЛЕНИЮ ДВИЖЕНИЯ
Это первая статься по просбе читателя, собственно и просьба читателя тоже первая и на момент написания единственная :). Не всегда именно шарик летает за мышкой, или куда-нибудь еще. Если летит например стрелка, то полет боком смотрится противоестественно. Что-ж, придется эту стрелку поворачивать по направлению движения. Для начала нарисуем саму стрелку: --> и именно по направлению оси х. Превратим заклинанием 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;
}