у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет. Вопрос знатокам, что не так? |
Представление сайта
Управление движением
Теперь вы уже немного разбираетесь в том, как работают рассматриваемые разнообразные методы создания сценариев движения. Мы переходим к рассмотрению различных способов управления движением. Метод, который использовался до сих пор, подразумевает использование немалого количества различных рабочих мест, а мы настроили его на работу с одним фильмом.
Было бы гораздо лучше брать любой определенный фильм и создавать myMovieClip.slideTo(100,200), чтобы фильм мог перемещаться к этой точке и останавливаться, без надобности присваивать фильму вручную управляющий элемент clipEvent или функцию для проверки достижения конечной точки, и т.д.
Далее мы будем рассматривать различные методы создания сценариев начала движения объекта. Мы не будем указывать на тот или иной определенный способ и говорить, что он является самым лучшим, а вместо этого продемонстрируем вам несколько возможностей, чтобы вы могли выбирать из них нужное для работы с вашими проектами.
Скольжение
- Откройте новый фильм и разместите на рабочем месте инстанс ball_mc.
- Первое, что мы сделаем на отдельном слое сценариев, это добавим вызов функции slideTo, которая будет выполняться каждый раз при щелчке мышью пользователем.
- Мы будем передавать функции slideTo три параметра: позицию по оси x, позицию по оси y и еще одно значение, которое будет указывать скорость скольжения:
_root.onMouseDown = function() { ball_mc.slideTo(this._xmouse, this._ymouse, 4); };
- Теперь нам нужно создать непосредственно функцию slideTo, которая должна будет выполнять два отдельных действия:
- устанавливать в фильме значения targetX и targetY ;
- настраивать управляющий элемент enterFrame фильма для обеспечения его скольжения по направлению к конечной точке.
Вместо того чтобы определять эту функцию для отдельного фильма, как мы делали в предыдущих функциях ball_mc.checkDistance, мы поместим ее в MovieClip.prototype. Все функции внутри MovieClip.prototype доступны в равной степени всем фильмам. Все встроенные методы фильмов, такие как goToAndPlay, также присутствуют в movieclip.prototype. При вызове функции она ведет себя так, как если бы она была внутри фильма.
MovieClip.prototype.slideTo = function(x, y, speed) { // set up targets and speed variable this.targetX = x; this.targetY = y; this.speed = speed; // create onEnterFrame function this.onEnterFrame = function() { // take care of motion this._x += (this.targetX-this._x)/this.speed; this._y += (this.targetY-this._y)/this.speed; // check if near target if (Math.abs(this.targetX-this._x)<0.2 && Math.abs(this.targetY-this._y)< 0.2) { this._x = this.targetX; this._y = this.targetY; delete this.onEnterFrame; } }; };
Первые три строки функции берут параметры, которые ей передаются, и сохраняют их в переменных внутри фильма. Затем присваивается функция onEnterFrame, передвигающая фильм, а также выполняется проверка достижения конечной точки.
- Сохраните ваш файл под именем issueCommand1.fla и запустите его. При щелчке мышью фильм будет скользить к месту щелчка.
- Мы также можем попытаться применить тот же самый подход в двух фильмах - создать копию исходного фильма ball_mc и дать новому инстансу имя ball_mc2 с помощью Property Inspector.
- Перетащите инстанс ball_mc2 на рабочее место и затем откройте панель Actions для изменения кода onMouseDown, согласно тексту кода, приведенному ниже:
_root.onMouseDown = function() { ball_mc.slideTo(this._xmouse, this._ymouse, 4); ball_mc2.slideTo(this._xmouse+19, this._ymouse, 1); };
- Сохраните фильм в файле issueCommand1b.fla и запустите его. Вы заметите, что второй фильм перемещается значительно правее указателя мыши и со значительно меньшей скоростью.
Итак, наш фильм работает как надо, однако при более детальном рассмотрении будут выявлены некоторые проблемы при использовании данного подхода. Наиболее заметный недочет заключается в том, что любой фильм может иметь только одну функцию, присвоенную его управляющему элементу onEnterFrame: если фильм уже предположительно имел функцию, присвоенную его управляющему элементу onEnterFrame, а мы присвоили ему другую функцию, то вторая функция будет записана поверх первой. Это может случиться, если к фильму было применено плавное исчезновение, увеличение размеров или по каким-либо другим причинам.
Другая проблема состоит в том, что мы помещаем в фильм переменные, такие как targetX, targetY и speed, которые могут уже использоваться в фильме с другими целями. Они будут просто записываться поверх старых, что соответствующим образом повлияет на функциональность фильма. Несмотря на то, что мы обычно помним имена, присваиваемые объектам в нашем ActionScript, полезно использовать информативные и не лишенные смысла названия.