Представьте себе, что вам требуется перемещать объект на сцене по прямой.
Не проблема: на enterFrame навешиваем что-то вроде this._x+=this.speed и объект перемещается.
Всё тут же усложняется, если вам требуется, чтобы объект перемещался по некому пути.
Для решения такого рода задач издревле используется MotionTween.
Но далеко не всегда такое решение удовлетворяет нуждам разработчиков.
- что делать, если скорость объекта должна изменяться в зависимости от действий пользователя?
- что делать, если сам путь должен изменяться динамически?
- можно ли рассчитать позицию объекта на изменяющемся пути не обладая глубокими математическими познаниями?
Ну, раз я задаю эти вопросы, значит есть положительные ответы на них :).
Читаем дальше.
Несколько простых шагов к достижению цели:
1. Создание изменяющегося пути.
Не заморачиваемся.
Накидываем несколько мувиков, делаем класс для них,
отрисовываем результат, используя эти мувики в качестве контрольных точек
(FLA):
- это у нас типа волны на море :).
2.Делаем кораблик
Тоже не заморачиваемся.
На событие onEnterFrame навешиваем движение по горизонтали, которое зависит от действий пользователя.
Пользователя отслеживаем на нажатие кнопок влево-вправо. Если не работают, кликни по ролику - он должен быть в фокусе. Смотрим FLA если что-то непонятно:
3. Наконец-то подключаем Path
Это несложно. Но учтите, что это не урок по AS2. Если вы не в курсе как заюзать AS2 класс, то стоит порыть в сети в поисках ответа на этот вопрос.
Итак, поскольку путь у нас постоянно изменяется, на onEnterFrame создаем экземпляр класса Path, используя в качестве аргументов координаты мувиков, образующих пути. Вместо непосредственного присвоения координаты x мувику, скармливаем вычисленное значение x методу getPoint экземпляра класса Path. Этот метод вычисляет и возвращает точку на пути, которая по кривой находится на заданном расстоянии. Более того. Возвращается еще и угол касательной к кривой в этой точке. Всё это дружно берем, присваиваем нашему кораблику. И разумеется, смотрим FLA, чтобы разобраться как это сделано. Результат:
Но тут же, если не влом тестить, нарываемся на одну засаду:
длина пути постоянно меняется.
Чем длиннее становится путь по кривой от начала (слева) до кораблика,
тем ближе к началу по оси x будет находиться кораблик. Нужно править.
4. Переходим на относительную систему вычисления позиции.
Не так уж это и сложно.
Вместо простого вычисления x вычисляем позицию кораблика как процент пройденного пути.
Затем вычисляем абсолютную позицию на пути, перемножая на длину пути и разделив на 100.
Смотрим FLA и результат:
Для демонстрации прелестей Path этого было бы достаточно. Но.
5. Добавим реалити.
Кораблик не реагирует на волны. Рулит как танк, как будто ему что в гору, что с горы. Поправить это стоит, впрочем и посмотреть как это сделал я во FLA.
- самое простое решение - самое эффективное. Я просто к длине пройденного пути добавляю одну сотую отвращения. Точнее одну сотую от вращения :).
6. Делаем картинку дивной красы.
Для этого:
-
выносим кораблик из мувика в рут, чтобы кораблик мог прятаться под волной;
-
загоняем крайние точки за пределы видимости, чтобы всякие артефакты нас не мучали;
-
меняем отрисовку волны
в итоге видим результат и разбираемся с FLA.
Вот и чудненько вышло.
Вот только волны все посетители дружно раскритиковали: дерьмецо твои волны, говорят.
И мои отмазки, что волны не главное, никому не интересны. Ок.