Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Використання порожніх фільмів




Тепер розглянемо все потенциально можливі проблеми, які можуть виникнути при створенні порожнього фільму усередині вже існуючого. Ми будемо використовувати внутрішній фільм як об'єкт, у якому перебувають всі змінні, і він буде також бути об'єктом, до якого можна привласнити керуючий елемент onEnterFrame, не побоюючись виходу з ладу якої-небудь попередньої функціональності.

Керуючий елемент mouseDown набудовуємо так само, як і колись:

_root.onMouseDown = function() { ball_mc.slideTo(this._xmouse, this._ymouse, 4);};

Тепер наша функція slideTo буде виглядати майже так само, як раніше, і основною відмінністю є те, що колись фільм управляла сам собою, а тепер фільм виконує усередині себе певні дії. Це видно із заміни 'this' на 'this._parent' при доступі або зміні параметрів X і Y. Наш керуючий фільм здійснює доступ і керування параметрами свого батьківського фільму, тобто того фільму, якому необхідно переміщати.

MovieClip.prototype.slideTo = function(x, y, speed) { // create controller movieclip var control_mc = this.createEmptyMоvieClip ("slideControl", Кthis.depth++); control_mc.target = x; control_mc.target = y; control_mc.speed = speed; control_mc.onEnterFrame = function() { // this._parent is the movieclip we're moving this._parent._x += (this.target-this._parent._x) /this.speed; this._parent._y += (this.target-this._parent._y)/this.speed; if (Math.abs(this.target-this._parent._x)<0.2 && Math.abs(this.target- Кthis._parent._y) <0.2) { this._parent._x = this.target; this._parent._y = this.target; this.removeMovieClip(); } };};

Як і відносно функції duplicate, створеної нами раніше, ми використовували посилання, що повертається функцією createEmptyMovieClip для звертання до знову створеного movieClip. Однієї з можливих "пасток" при використанні цього методу з createEmptyMovieClip є те, що користувач може записати фільм поверх уже наявного усередині. Простіше говорячи, це те, чого потрібно остерігатися при керуванні фільмом; необхідно мати якийсь механізм визначення того, на якій глибині перебувають об'єкти й символи. За допомогою уведення змінної глибини для кожної тимчасової лінії можна ефективно реалізувати даний запобіжний захід, застосовуючи цей спосіб щораз при створенні фільму. З іншого боку, можна було б оголосити глобальну змінну глибини для всіх тимчасових ліній, однак все-таки краще мати одну змінну для кожної тимчасової лінії, щоб не втрачати контроль над значеннями. Залишаємо право вибору за вами.

Ви могли б використовувати addProperty для автоматичного додавання глибини щораз при спробі доступу, однак довелося б робити це для кожного фільму окремо, тому статична змінна, що збільшується на одиницю з кожним разом, буде оптимальним рішенням. Іншим можливим підходом може бути циклове проходження фільмів цілком в окремому місці, і використання getDepth() у кожному з них для з'ясування глибин, однак це досить нераціональний спосіб, тому що тут прийде робити велика кількість непотрібних запитів на дії.

Збережете ваш фільм у файлі issueCommand2.fla. Якщо ви запустите фільм на даному етапі, ви заметете, що рух буде припинено при швидкому послідовному клацанні мишею. Якщо виконати команду Debug > List Variables, стане видно, що причиною цього є присутність більш ніж одного инстанса slideControl у нашім фільмі - всі вони працюють із різними напрямками. Таким чином, нам потрібно придумати щось таке, за допомогою чого можна буде переконуватися в присутності в будь-який момент часу лише одного инстанса цього керуючого кліпу усередині нашого фільму.

Можливим рішенням цієї проблеми є створення дублікатів slideControl щораз на одній і тій же глибині, щоб колишній инстанс автоматично перезаписувався новим. Однак краще не використовувати цей підхід, тому що він порушує схему глибини, про яку ми тільки що говорили. На додаток до цього, якщо ми використовували метод коливань для забезпечення руху нашого фільму, нам зовсім не потрібно буде перезаписувати будь-які змінні швидкості усередині фільму й переривати його рух; нам необхідне збереження цих даних до зупинки фільму.

Більше розумним рішенням буде перевірка того, чи є вже фільм slideControl. Якщо це не так, то вам потрібно буде створювати його, а якщо він уже присутній, то потрібно буде перезаписувати змінні X і Y кінцевої крапки й подія onEnterFrame.

Обидва підходи приведуть до одного й тому ж результату. Змінений текст коду виділений жирним шрифтом:

MovieClip.prototype.slideTo = function(x, y, speed) { var control_mc if (this.slideControl) { //if slideControl already exists control_mc = this.slideControl; } else { //if slideControl doesn't exist then create it control_mc = this.createEmptyMovieClip ("slideControl", this.depth++); } control_mc.target = x; control_mc.target = y; control_mc.speed = speed; control_mc.onEnterFrame = function() { this._parent._x += (this.target-this._parent._x)/this.speed; this._parent._y += (this.target-this._parent._y)/this.speed; if (Math.abs(this.target-this.__parent._x)<0.2 && КMath.abs(this.target-this._parent._y)<0.2) { this._parent._x = this.target; this._parent._y = this.target; this.removeMovieClip(); } };};

Збережете файл під ім'ям issueCommand3.fla і при запуску фільму зверніть увагу на те, що тепер він поводиться потрібним образом.

Незважаючи на позитивний результат, даний підхід неспроможний із практичної точки зору, тому що ми не можемо визначити момент, коли фільм досягає своєї кінцевої позиції. Рух насправді припиняється, але нам часто буде вимагатися виконати деяка інша дія по закінченні руху. Принаймні, було б непогано знати, коли фільм перебуває в русі, а коли немає.

Для рішення цієї проблеми звернемося до функції зі зворотним зв'язком. Усе буде працювати в такий же спосіб, як і деякі інші компоненти - вони будуть викликати функцію при зміні значення або відновленні яких-небудь даних. При припиненні руху буде викликатися зазначена нами функція. Отже, насамперед, ми створимо функцію, що буде викликатися при закінченні руху фільму. У момент, коли це буде потрібно, можна виводити повідомлення у вікні Output із вказівкою ім'я фільму, що завершив свій рух, що ми будемо використовувати як параметр.

function slideDone(mс) { trace("movieClip "+mc+" has finished moving");}

Загалом кажучи, коли рух фільму буде припинятися, буде здійснюватися виклик функції slideDone в _root. При виклику функції slideTo, нам потрібно буде додати два інших параметри - callBackObj і callBackFunc. callBackObj є місцем розташування викликуваної функції (у цьому випадку, _root), а callBackFunc - ім'ям викликуваної функції, тобто, у нашім випадку, функції slideDone. Отже, спочатку потрібно додати в нашу функцію два додаткових параметри:

_root.onMouseDown = function() { ball_mc.slideTo(this._xmouse, this._ymouse, 4, _root, "slideDone");};

Потім нам буде потрібно настроїти функцію slideTo для роботи із цими двома параметрами й для зберігання їх у фільмі slideControl (за допомогою додавання коду, що на прикладі нижче виділений жирним шрифтом):

MovieClip.prototype.slideTo = function(x, y, speed, callbackObj, callbackFunc) { var control_mc if (this.slideControl) { control_mc = this.slideControl; } else { control_mc = this.createEmptyMovieClip("slideControl", this.depth++); } control_mc.target = x; control_mc.target = y; control_mc.speed = speed; control_mc.callBackObj = callBackObj; control_mc.callBackFunc = callBackFunc;};

Нарешті, нам потрібно з'ясувати, як викликати _root.slideDone з використанням двох змінних callBackObj і callBackFunc. Це насправді дуже просто й робиться практично в такий же спосіб, як здійснюється, наприклад, доступ до значення в масиві, або динамічне створення посилання на фільм:

this.callBackObj [this.callBackFunk] (this._parent)

Частина коду перед квадратними дужками є місцем розташування функції (_root). Уміст у квадратних дужках здійснює пошук значення, що відповідає даному рядку (у нашім випадку, slideDone), і потім значення в дужках передається у вигляді параметра. Передане тут значення є звертанням до фільму, що ми переміщали, тобто this._parent, our ball_mc. Наша функція цілком виглядає приблизно так:

MovieClip.prototype.slideTo = function (x, y, speed, callbackObj, callbackFunc) { var control_mc if (this.slideControl) { control_mc = this.slideControl; } else { control_mc = this.createEmptyMovieClip ("slideControl", this.depth++); } control_mc.targetх = x; control_mc.target = y; control_mc.speed = speed; control_mc.callBackObj = callBackObj; control_mc.callBackFunc = callBackFunc; control_mc.onEnterFrame = function() { this._parent._x += (this.target-this._parent._x) /this.speed; this._parent._y += (this.target-this._parent._y) /this.speed; if (Math.abs(this.target-this._parent._x)<0.2 && КMath. abs(this.target-this._parent._y)<0.2) { this._parent._x = this.target; this._parent._y = this.target; this.callBackObj[this.callBackFunc](this._parent); this.removeMovieClip(); } };};

Збережете ваш фільм у файлі issueCommand004.fla і при запуску фільму ви побачите, що у вікні Output відобразиться повідомлення "movieClip_level0.mc has finished moving", тобто повідомлення про завершення руху фільму. Це буде відбуватися щораз при зупинці фільму.

Ви можете змінити вміст функції slideDone для здійснення будь-яких потрібних вам дій. Наприклад, у вас може бути масив, що містить дані про те, які фільми запущені, і ви можете використовувати його для забезпечення початку виконання наступної стадії проекту тільки по завершенні продовження фільму.

Функція callback дозволяє нам використовувати дуже важливу можливість зворотного зв'язка. Ми можемо ініціювати початок руху фільму до певного місця й залишити цей процес на самостійне завершення, тому що по закінченні руху від нього надійде відповідне повідомлення. Нашим наступним кроком буде настроювання функції, що зможе погодитися з будь-якими потрібними нам параметрами, зміненими у фільмі, після чого фільм буде змінювати всі ці параметри одночасно. Ми повернемося до цієї теми в одній з наступних лекцій.


Поделиться:

Дата добавления: 2015-04-05; просмотров: 59; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты