Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3400 / 338 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 16:

Интеграция динамических данных

< Лекция 15 || Лекция 16: 12345 || Лекция 17 >

Функции

В этой лекции мы будем рассматривать функцию и объект. Функция loadVariables была уже в версии Flash 4, а объект loadVars появился только во Flash MX. Оба метода работают весьма похоже, но объект loadVars совершеннее, и его лучше использовать в более сложных проектах. Мы начнем с рассмотрения функции loadVariables, так как это существенно для первого приложения.

loadVariables

Наиболее распространенное применение этой функции - фильм, который отображает на сайте "сообщения дня". Этот фильм считывает сообщение из текстового файла и отображает его в текстовом поле во Flash. Откройте dynamictext1.fla в папке Chapter 15 на компакт-диске. Фильм состоит из одного кадра, содержащего многостроковое текстовое поле. Текстовое поле должно быть динамическим (устанавливается в Property inspector) и связанным с переменной message.

Первый кадр будет содержать весь необходимый для приложения ActionScript. Здесь нужны лишь две строки кода.

messageURL = "message.txt"
loadVariables (messageURL, _root)

Это можно реализовать и одной строкой, не помещая URL внутрь переменной. В первой строке переменная установлена на расположение текстового файла, содержащего сообщение для загрузки. Переменную здесь легко редактировать при использовании фильма с различными именами файлов или с URL. Здесь нет никаких проблем, однако при работе с более сложными приложениями и несколькими текстовыми файлами они могут возникнуть.

В данном случае URL - просто имя файла, т.е. текстовый файл находится в той же папке, что и конечный файл SWF. Если нужно сохранить весь текст сайта в общей папке, то в URL-адресе указывается корневой каталог сайта:

messageURL = "/text/message.txt"

Чтобы разместить текстовые файлы в подпапке папки с конечным SWF независимо от того, в каком месте сайта находятся файлы, можно использовать относительный URL.

messageURL = "text/message.txt"

Обратите внимание, что при указании относительного URL опускается прямой слеш в начале URL. Ссылка на текстовый файл в той же папке, в которой находится конечный SWF, как в нашем примере, является простейшей формой относительного URL.

Вторая строка сценария реализует непосредственное импортирование. Первым аргументом является URL импортируемого текстового файла, а второй аргумент - это фильм, в который будут импортироваться переменные. В данном случае, мы имеем только фильм _root, поэтому он используется в качестве конечного фильма.

В данном примере мы устанавливаем одну переменную, поэтому текстовый файл выглядит так.

message=Hello!+This+is+yuor+message+of+the+day

При запуске фильма загружаются данные переменных и инициализируется переменная message, значение которой устанавливается на Hello!+This+is+your+message+of+the+day. Так как мы установили переменную текстового поля в фильме на значение message, строка отображается в текстовом поле при запуске фильма. Соответственно, сообщение можно изменить, редактируя текстовый файл в обычном текстовом редакторе.

Если фильм и текстовый файл загружены на веб-сервер, то после запуска фильма в браузере может возникать небольшая пауза перед началом отображения текста. Это происходит по причине затраты времени на запуск фильма Flash на клиентском компьютере для запроса текстового файла с веб-сервера и его загрузки. Далее в этой лекции мы расскажем о возможных проблемах, которые могут быть этим вызваны, однако для такого простого приложение, как это, можно опустить этот небольшой недостаток, или же, для информирования пользователя о том, что происходит, можно изначально установить содержимое текстового поля на значение Loading. Это слово будет отображаться в период времени между началом воспроизведения фильма и присвоением переменной другого значения после окончания загрузки текста.

Можно расширить это приложение и добавить рисунок, загружающийся во время выполнения, определяемый второй переменной, загружаемой из текстового файла. Для импорта рисунка в режиме run-time мы используем функцию loadMovie с адресом URL изображения в качестве первого аргумента, и вторым аргументом здесь будет фильм, в который предполагается загружать рисунок. Этот процесс был детально рассмотрен в "Сайты с мультимедийным содержимым" .

К текстовому полю мы добавим фигуру, преобразованную в фильм. В ней будет размещаться загружаемое изображение. Фильм места расположения рисунка назван именем imgPlace_mc. Файлом Flash является dynamictext2.fla. Весь ActionScript, по-прежнему, содержится в первом кадре.

messageURL = "message2.txt"

loadVariables(this.messageURL, _root) 
loadMovie(this.photofile, "imgPlacel_mc")

Текстовый файл message2.txt содержит следующие данные.

mesage=Hello!+This+is+your+message+of+the+day&photofile=photo1.jpg

Новая переменная в текстовом файле с именем photofile содержит имя файла рисунка JPEG; затем эта переменная передается в виде первого аргумента функции loadMovie, и рисунок JPEG отображается в месте расположения изображения.

Если при запуске фильма вам покажется, что он не работает, не беспокойтесь. На самом деле фильм функционирует, но немного иначе, нежели ожидалось. Текст сообщения отображается, как и в предыдущем приложении, но изображение не загружается, а место его расположения остается видимым.

Это происходит потому, что строка loadMovie сценария выполняется перед выполнением строки loadVariables сценария и возвратом переменных - из-за потерь времени на запрос текстового файла с сервера и на загрузку содержимого. Занимаемое время будет значительно больше при работе на веб-сайте, однако оно может быть значительным и при запуске в локальном режиме. В результате при выполнении строки loadMovie переменная photofile получается пустой, вследствие чего рисунок не загружается.

Просмотр переменных посредством команды Debug > List Variables показывает, что переменная photofile установлена на значение photo1.jpg. Для проверки значения переменной во время попытки загрузить рисунок можно добавить в код две следующие команды трассировки.

messageURL = "message2.txt"

loadvariables(this.messageURL, _root)
trace("photofile when loadMovie executed = " + this.photofile)
trace("type of photofile when loadMovie executed = 
  " + typeof (this, photofile))
loadMovie(this.photofile, "imgPlace1_mc")

Проверка этого дополненного фильма покажет, что переменная photofile является неопределенной. Ни одна из двух команд сама по себе в данном случае не имеет смысла. Отображение типа переменной с использованием typeof полезно, так как дифференцирует неопределенную переменную и переменную, значение которой устанавливается на пустую строку.

Все переменные, возвращаемые с использованием LoadVariables или LoadVars, будут строковыми, независимо от их начального значения. Переменная со значением true на самом деле будет не значением типа Boolean, а просто строкой. Это может вызвать проблемы, если переменная сравнивается со значением типа Boolean.

// set this variable as if they had being loaded 
  from an external file

variable! = "true"

//test value
if (variable! == true) { 
  result = "Match"

} else {
  result = "No Match"
}

При выполнении фильма значение result будет установлено на No Match. Далее в этой лекции мы будем использовать тот факт, что все возвращаемые переменные являются строками, для проверки существования переменной.

Проблема паузы при загрузке переменных означает, что все, что сложнее основного приложения "Message of the Day", лучше исключить из функции loadVariables и вместо этого использовать объект loadVars.

loadVars

Объект loadVars, появившийся только во Flash MX, предлагает решение проблемы с паузой. Этот метод выполняет работу функции loadVariables и считывает переменные из указанного текстового файла. Переменные не устанавливаются в фильме, а помещаются в сам инстанс объекта loadVars. Подход loadVariables можно заменить следующим кодом.

messageURL = "message2.txt"
myVars_obj = new loadVars() 
myVars_obj.load(messageURL)

После определения переменной messageURL мы создаем новый инстанс объекта loadVars и называем его именем myVars_obj, после чего даем инстансу команду на загрузку текстового файла посредством вызова метода загрузки с одним аргументом - адресом URL текстового файла.

При запуске этого кода не будет отображено сообщение или загружено изображение, однако с помощью команды Debug > List Variables можно будет посмотреть, что было проделано с содержимым текстового файла. Важной частью результата работы команды List Variables в данном случае является фрагмент myVars_obj.

Variable _level0.myVars_obj = [object #1, class 'LoadVars' ] { 
  message:"Hello! This is your message of the day",
  photofile:"photo1.jpg"
}

Две переменные, содержащиеся в текстовом файле, message и photofile, а также их значения теперь являются частью объекта myVars_obj.

Эти значения могут быть доступны так, как если бы они были параметрами объекта, с помощью стандартного синтаксиса с точками, например myVars_obj.message.

Если объект loadVars уже содержит переменную с таким именем, тогда существующая переменная замещается, однако в противном случае имеющиеся переменные остаются. Это означает, что один инстанс может создать набор переменных, считывая данные из текстовых файлов.

Объект loadVars имеет два встроенных способа проверить, осуществлялось ли чтение файла. Первым является параметр load, который устанавливается на значение TRUE по завершении операции загрузки. Вторым и более полезным является управляющий элемент события onLoad, который можно использовать для вызова функции по завершении процедуры загрузки.

Можно использовать управляющий элемент onLoad для выполнения нужного кода сразу после загрузки текстового файла. Для этого нужно присвоить управляющему элементу вызов функции. В случае с приложением "Message of the Day" будет вызываться очень небольшое количество кода, поэтому мы используем анонимную функцию, чтобы оставить код рядом с управляющим элементом.

messageURL = "message2.txt"

myVars_obj = new loadVars() 
myVars_obj.onLoad = function () {
  loadMovie(myVars_obj.photofile, "imgPlace1_mc")
  message = myVars_obj.message 
}

myVars_obj.load(messageURL)

После загрузки текстового файла необходимо импортировать рисунок и отобразить сообщение. Мы загружаем фильм JPEG на соответствующее место рисунка с использованием той же функции, что и ранее. Разница здесь заключается в том, что переменные теперь содержатся внутри объекта myVars_obj, и текстовое сообщение не отображается автоматически. Текстовое поле связано со значением переменной текстового сообщения в фильме _root, а не в объекте myVars_obj. Чтобы обойти эту проблему, мы добавляем строку кода для установки значения переменной _root.message на значение, равное импортируемой переменной сообщения.

Во избежание появления ошибок при чтении, управляющий элемент onLoad возвращает значение типа Boolean, которое равно true в случае успешного завершения операции и false в противном случае. Это значение устанавливается автоматически, и мы можем изменить функцию обратной связи, присвоенную управляющему элементу события, чтобы использовать это, добавляя аргумент функции, как показано ниже. (dynamictext3a.fla)


messageURL = "message2a.txt"

myVars = new loadVars() 
myVars.onLoad = function (success) { 
  if (success) {
    loadMovie(myVars.photofile, "imgPlace1")
    message = myVars.message
  } 
  else {
    message = "Error loading message"
  } 
}

myVars.load(messageURL)

Значение параметра success автоматически устанавливается на "истину", если текстовый файл был успешно считан, или на "ложь", если возникли ошибки. Это можно проверить, удалив текстовый файл и повторно протестировав фильм.

< Лекция 15 || Лекция 16: 12345 || Лекция 17 >
Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip?