Описание
Синтаксис сценария основан на языке Си, но с большим упущением - машина байт-кода SWF
слишком проста, чтобы делать много вещей, которые могут нам понравиться.
Например, мы не можем реализовать вызовы функций без огромного
количества хакерских атак, потому что байт-код перехода имеет жестко закодированное
значение смещения. Не отправляйте ваш вызывающий адрес в стек и не возвращайте его -
каждая функция должна точно знать, куда возвращаться.
Так что осталось? Компилятор распознает следующие токены:
-
break
-
for
-
continue
-
if
-
else
-
do
-
while
Там нет типизированных данных; все значения в компьютере действия SWF хранятся в виде строк.
Следующие функции могут использоваться в выражениях:
-
time()
-
Возвращает количество миллисекунд (?), Прошедших с начала фильма.
-
random(seed)
-
Возвращает псевдослучайное число в диапазоне 0-seed.
-
length(expr)
-
Возвращает длину данного выражения.
-
int(number)
-
Возвращает указанное число, округленное до ближайшего целого числа.
-
concat(expr, expr)
-
Возвращает конкатенацию заданных выражений.
-
ord(expr)
-
Возвращает код ASCII для данного символа
-
chr(num)
-
Возвращает символ для данного кода ASCII
-
substr(string, location, length)
-
Возвращает подстроку длины
length
в расположении location
заданной строки string
.
Кроме того, могут использоваться следующие команды:
-
duplicateClip(clip, name, depth)
-
Дублируйте указанный фильм
clip
(он же спрайт). Новый фильм с названием name
находится на глубине depth
.
-
removeClip(expr)
-
Удаляет указанный фрагмент ролика.
-
trace(expr)
-
Запишите данное выражение в журнал трассировки. Сомнительно, что плагин
браузера делает что-нибудь с этим.
-
startDrag(target, lock, [left, top, right, bottom])
-
Начните перетаскивать фрагмент ролика
target
. Аргумент lock
указывает,
блокировать ли мышь (?) - использовать 0 (FALSE
) или 1 (TRUE
). Необязательные параметры
определяют ограничивающую область для перетаскивания.
-
stopDrag()
-
Хватит тянуть мое сердце. И этот ролик тоже.
-
callFrame(expr)
-
Вызвать ууказанный фрейм как функцию.
-
getURL(url, target, [method])
-
Загрузите указанный URL в названную цель. Аргумент
target
соответствует целям документа HTML (например, "_top" или "_blank").
Необязательный аргумент method
может быть POST или GET, если вы хотите отправить
переменные обратно на сервер.
-
loadMovie(url, target)
-
Загрузите указанный URL в названную цель. Аргументом
target
может
быть имя кадра (я думаю) или одно из магических значений "_level0" (заменяет
текущий фильм) или "_level1" (загружает новый фильм поверх текущего фильма).
-
nextFrame()
-
Перейти к следующему кадру.
-
prevFrame()
-
Перейти к последнему (или, скорее, предыдущему) кадру.
-
play()
-
Начать проигрывать фильм.
-
stop()
-
Перестать проигрывать фильм.
-
toggleQuality()
-
Переключение между высоким и низким качеством.
-
stopSounds()
-
Прекратите играть все звуки.
-
gotoFrame(num)
-
Перейти к номеру кадра
num
. Номера кадров начинаются с 0.
-
gotoFrame(name)
-
Перейти к указанному фрейму
name
. Что очень хорошо,
так как я еще не добавил метки кадров.
-
setTarget(expr)
-
Устанавливает контекст для действия. Или так они говорят - я действительно понятия
не имею, что это делает.
И есть одна странная дополнительная вещь. Выражение frameLoaded (num) может использоваться
в операторах if и while, чтобы проверить, загружен ли еще
данный номер кадра. Ну, так или иначе, но я никогда не проверял это, и я
серьезно сомневаюсь, что это действительно работает. Вы можете просто использовать /:framesLoaded вместо этого.
Видеоклипы (все вместе теперь спрайты) имеют свойства. Вы можете
прочитать их все (или можете?), вы можете установить некоторые из них, и вот они:
they are:
-
x
-
y
-
xScale
-
yScale
-
currentFrame - (только для чтения)
-
totalFrames - (только для чтения)
-
alpha - уровень прозрачности
-
visible - 1=on, 0=off (?)
-
width - (только для чтения)
-
height - (только для чтения)
-
rotation
-
target - (только для чтения) (???)
-
framesLoaded - (только для чтения)
-
name
-
dropTarget - (только для чтения) (???)
-
url - (только для чтения) (???)
-
highQuality - 1=high, 0=low (?)
-
focusRect - (???)
-
soundBufTime - (???)
Итак, установить позицию спрайта x так же просто, как
/box.x = 100;
.
Почему же косая черта перед блоком? Вот так flash отслеживает
спрайты в фильме, точно так же, как файловая система Unix -
здесь показано, что окно находится на верхнем уровне. Если бы в указанном спрайте
блока был бы другой спрайт с именем biff, вы бы установили его позицию x
с помощью /box/biff.x = 100;. По крайней мере, я так думаю; поправьте
меня, если я ошибаюсь.