Определение размеров фильма и величины окна плейера

Стандартные размеры фильма определяются размерами рабочего поля среды разработки. По умолчанию оно представляет собой прямоугольник размером 550x400 пикселей. Изменить величину его сторон можно в окне Document Properties, открываемом кнопкой Size Инспектора Свойств. Ограничений на размеры сторон рабочего поля не существует. Та часть фильма, которая входила при публикации в пределы рабочего поля, будет полностью отображаться тогда, когда размеры окна плейера будут совпадать со стандартными размерами фильма. Данный, казалось бы, частный случай наблюдается гораздо чаще остальных. Это связано как с тем, что при открытии фильма напрямую плейером окно последнего масштабируется под стандартные размеры фильма, так и с тем, что на HTML-странице SWF-фильм обычно публикуется исходя из своих стандартных размеров.

Однако важно понимать, что никакой жесткой привязки размеров окна плейера к размерам фильма нет. При таких режимах масштабирования, как «showAll» и «noScale» растяжение или сжатие окна плейера может привести к тому, что будут показаны области фильма, не входящие в зону, ограниченную его стандартными размерами. Наоборот, если используются режимы масштабирования «noBorder» и «noScale», то изменение размеров окна плейера может вызвать обрезку приграничных частей фильма, относящихся к отображаемой по умолчанию области.

Стандартные размеры фильма — это одна из его фундаментальных характеристик.


Именно поэтому данные о них хранятся в заголовке SWF-файла. Невозможно динамически изменить стандартные размеры фильма. И до выхода Flash MX их нельзя было даже прочитать. Только в предпоследней версии Flash появились свойства width и height объекта Stage, позволяющие решать эту задачу.

Свойство Stage.width возвращает стандартную ширину, а Stage.height, соответственно, — стандартную высоту фильма в пикселях. Эти значения постоянные и не зависят от реальных размеров области фильма. Дело в том, что при изменении размеров окна плейера меняется масштаб фильма.

Координаты же каждой точки фильма в абсолютном выражении остаются одними и теми же. Просто меняется расстояние, соответствующее единице измерения. Поэтому, например, стандартная ширина фильма, принятая по умолчанию, всегда будет равна 550 пикселей, даже если реально между левой и правой границами стандартной области фильма имеется всего 10 пикселей.

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

Свойства width и height объекта Stage обычно используются, если движение объекта должно происходить в пределах границ стандартной области фильма (или если нужно зарегистрировать пересечение объектом границы этой области).


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

Сейчас же в качестве примера использования свойств width и height приведем код, управляющий движением упругого шарика. Когда этот шарик будет достигать границы стандартной области фильма, он будет от нее отражаться, как от жесткого препятствия.

// Создайте клип в виде шарика и назовите его ball
// Значение скорости вдоль каждой оси определяем случайным образом
var xSpeed:Number=5*Math.random(); // Скорость вдоль оси X
var ySpeed:Number=5*Math.random(); // Скорость вдоль оси Y
this.onEnterFrame=function():Void {
// Проверяем, достиг ли шарик границы по горизонтали. Если да, то изменяем
// направление скорости на противоположное
if (ball._x-ball._width/2<0 || ball._x+ball._width/2>Stage.width) {
xSpeed*=-1;
}
// То же, но для границ по вертикали
if (ball._y-ball._height/2<0 || ball._y+ball._height/2>Stage.height) {
ySpeed*=-1;
}
// Смещаем шарик на шаг
ball._x+=xSpeed, ball._y+=ySpeed;
};

Созданный код работает весьма неплохо, но только до тех пор, пока размеры окна плейера не будут изменены.


Если же в результате сжатия или растяжения окна начнет отображаться приграничная область (что возможно в режиме масштабирования «showAll»), то получится, что шарик отпрыгивает от пустоты.

Наоборот, если изменение размеров окна происходит в режиме масштабирования «noBorder», то часть стандартной области фильма окажется скрытой. В итоге шарик будет уходить за пределы видимой части фильма, что уничтожит сам смысл эффекта. Нельзя ли как-то определять реальные размеры отображаемой области? При этом совсем несложно было бы сделать эффект, не зависящим от размеров окна плейера.

Чтобы определить размеры окна плейера, предварительно нужно решить, какие единицы измерения будут использоваться. Это могут быть реальные пиксели экрана или же масштабированные пиксели, характерные для системы координат отображаемого фильма. В любом случае возникнут довольно существенные сложности с пересчетом одних координат в другие. Из-за этих сложностей размеры окна плейера стоит определять лишь тогда, когда пиксели системы координат фильма будут совпадать с пикселями экрана. А это условие всегда соблюдается лишь в том случае, если используется режим масштабирования «noScale».

В режиме масштабирования «noScale» свойства width и height объекта Stage хранят ширину и высоту окна плейера в пикселях.


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

Зная, при каких условиях мы можем определить размеры окна плейера, перепишем код эффекта так, чтобы шарик отпрыгивал от границ всегда. Это несложно сделать при любом типе выравнивания фильма. Мы будем создавать алгоритм, считая, что применяется выравнивание по центру (оно используется по умолчанию). Нетрудно догадаться, что при этом границы будут удалены от центра фильма на расстояния, равные половине ширины и высоты окна плейера.

Таким образом, чтобы узнать, достигли шарик данной границы, нужно сопоставить его координату с суммой (или разностью, в зависимости от того, какая это граница) соответствующей координаты центра фильма и половины ширины (высоты) окна плейера. Единственная сложность в том, как узнать координаты центра фильма, если в режиме масштабирования «noScale» свойства width и height объекта Stage возвращают ширину и высоту окна плейера, а не стандартные размеры фильма.

Решение данной проблемы очень простое. М ы можем определить ширину и высоту фильма в режиме масштабирования «showAll», записать полученные данные в переменные и лишь затем перейти к необходимому режиму «noScale».

Описанные выше идеи материализуются следующим кодом:

var mov_width:Number=Stage.width; // Ширина и высота фильма
var mov_height:Number=Stage.height;
Stage.scaleMode="noScale"; // Переходим в нужный режим масштабирования
var xSpeed:Number=5*Math.random(); // Скорости по осям X и Y
var ySpeed:Number=5*Math.random();
this.onEnterFrame=function() {
// Проверяем, не пересечены ли правая и левая границы
if (ball._x-ball._width/2 ball._x+ball._width/2>mov_width/2+Stage.width/2) {
xSpeed*=-l;
}
// Проверяем, есть ли пересечение с верхней и нижней границами
if (ball._y-ball._height/2 ball._y+ball._height/2>mov_beight/2+Stage.height/2) {
ySpeed*=-1;
}
// Смещаем шарик
ball._x+=xSpeed, ball._y+=ySpeed;
};

Созданный код работает вполне удовлетворительно.


Независимо от того, как вы растянете или уменьшите окно плейера, шарик все равно будет отпрыгивать от его границ. Правда, сбой возникает, если в результате смешения границы окна шарик оказывается за пределами отображаемой части фильма. При этом он никогда в границы окна не вернется (так как его движение просто прекратится). Как можно справиться с этим недостатком эффекта, мы покажем чуть ниже, когда разберем событие onResize.

Можно ли изменить размеры окна плейера не «вручную», а динамически, при помощи
ActionScript? Увы, напрямую это сделать невозможно. Однако используя побочные эффекты некоторых операций — вполне.

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

К примеру, представим, что мы хотим реализовать следующий эффект: мяч ударяет по границе окна плейера, и она сдвигается. Чтобы этого добиться, нужно создать два фильма. В первом должна быть последовательность кадров с анимацией движущегося мяча. На кадр, в котором изображено, как мяч касается границы рабочего поля, необходимо поместить код, подгружающий на нулевой уровень второй фильм. Стандартная высота этого фильма должна быть где-то на треть больше, чем у первого. В результате граница окна плейера как бы сдвинется. Разместив на первом кадре второго фильма мяч в точке с такими же координатами, как и у точки. в которой мяч находился на последнем кадре первого фильма, можно создать иллюзию, что это один и тот же объект.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Взаимодействие с принтером
Взаимодействие со средой разработки
Взаимодействие со средствами чтения с экрана
Объект CustomActions
Получение информации об использующемся аппаратном и программном обеспечении