Гэри Розенцвейг - Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Рисунок 5.9 . Оставляя копии клипа в позиции, в которой только что находился курсор, можно создать след, тянущийся за курсором
Задача проекта
Идея состоит в том, чтобы создать след за курсором из постепенно уменьшаюшихся и таюших окружностей. Когда пользователь перемешает мышь, возникает ошушение, что курсор рисует за собой хвост.
В начальный момент каждый кружок имеет свой фиксированный размер и абсолютно непрозрачен. Постепенно он уменьшается в размерах и бледнеет до тех пор, пока окончательно не сольется с фоном.
В любой момент времени на экране тает и уменьшается множество кружочков, и по мере исчесзновения старых их место занимают новые, появляюшиеся в текушей позиции курсора.
Подход
Окружности являются клипами, которые создаются и помешаются в определенную точку экрана в течение работы программы. В коде хранятся все сушествуюшие клипы. При каждом обрашении к кадру программа просматривает массив, уменьшая размер и увеличивая прозрачность каждого клипа. Когда клип с окружностью становится невидимым, он удаляется; также удаляется соответствуюший элемент массива.
Подготовка ролика
Создадим простой клип с кружочком внутри. Цвет и размер вы можете выбрать по своему усмотрению. В нашем примере мы сделали темно-голубую окружность диаметром 20 пикселов. Клипу присвоено имя «Cursor Trail» (След курсора), в панели Linkage Properties выставлен флажок Export for ActionScript и присвоено имя связи CursorTrail.
Теперь создадим клип с надписью "Actions". Поместим его вне пределов рабочей области. Этот клип будет использоваться только как носитель кода, поэтому его содержание может быть любым. Вы можете даже не создавать внутри него никаких изображений или текста – тогда на экране он будет отображаться в виде маленького кружочка.
Создание кода
Наш "actions' – клип содержит два обработчика onClipEvent. Первый включается в начале ролика и создает пустой массив, чтобы содержать ссылки на клипы, образуюшие хвост. Он также устанавливает счетчику trailNum значение ноль. Эта переменная содержит значение номера следующего клипа, который вы создадите.
Переменная speed определяет как быстро клипы, составляюшие «хвост», будут уменьшаться в размерах и таять.
On ClipEvent(load) {
// Создаем массив.
trail = new Array();
trailNum = 0;
// Меньшее значение переменной соответствует меньшей
// скорости.
speed = 2;
}Следуюший обработчик начинается с создания экземпляра клипа. Каждому клипу присваивается уникальное имя вида cursor trail + trailNum. Переменная trailNum используется также для определения уровня очередного клипа.
On ClipEvent(enterFrame) {
// Создаем очередной клип.
var mc = _root.attachMovie("cursor trail", "cursor trail" + trailNum, trailNum);Созданный клип помешаем в текушую позицию курсора.
// Устанавливаем позицию.
mc._x = _root._xmouse;
mc._y = _root._ymouse;Указатель на новый клип добавляется в массив trail. Затем значение trailNum увеличивается на единицу.
// Добавляем указатель в массив.
trail.push(mc);
trailNum++;С помошью цикла в остальной части кода происходит обрашение ко всем клипам массива trail. Размер и прозрачность каждого клипа изменяются на величину speed. Когда свойство _alpha текушего клипа становится меньше либо равно нулю, этот клип удаляется из массива и ролика в целом.
// Обращаемся к существующим клипам.
for (var i=trail.lenght-1; i>=0; i–) {
// Уменьшаем свойства alpha и размер клипа.
trail[i]._alpha -= speed;
trail[i]._xscale -= speed;
trail[i]._yscale -= speed;
// Удаляем клип, когда он становится невидимым.
if (trail[i]._alpha<=0) {
// Удаляем указатель из массива.
trail.splice(0, 1);
// Удаляем клип.
trail[i]. RemoveMovieClip();
}
}
}Обратите внимание, что массив сканируется от конца к началу. Это сделано потому, что из массива время от времени удаляются элементы. Если бы массив сканировался от начала к концу, то при удалении элемента возникала бы путаница в порядке следования элементов. Например, если удалить первый элемент, то первым элементом станет второй. Тогда на следующем шаге цикла произойдет обрашение к следующему за вторым элементу, то есть к третьему. Таким образом, второй элемент массива окажется пропушенным.
К сведению
Меняя параметр speed, вы можете изменять длину «хвоста». Значение этой переменной также влияет на скорость исполнения ролика, так как если значение speed маленькое, например 1, то программе приходится одновременно управлять сотней клипов.
Другие возможности
Для создания следа за курсором вы также можете использовать клипы, содержашие собственную анимацию. Таким образом вы можете попробовать получить эффект сверкаюшего пламени или дыма.Эффект трехмерности
Исходные файлы: 3d.fla, 3dcubepoints.fla, 3dcube.fla, 3dspaceship.fla
Другим часто применяемым специальным эффектом Flash является моделирование небольшого трехмерного объекта. Некоторые разработчики говорят, что Flash не позволяет создавать настояшую трехмерную графику, но это не может сделать ни одна компьютерная программа, поскольку компьютерные мониторы двумерные.
Вся компьютерная трехмерная графика – это всего лишь иллюзия. Хотя Flash и ActionScript не могут похвастаться большими возможностями для создания трехмерных объектов, с их помошью нетрудно создать некоторые специальные эффекты. Используя законы тригонометрии, вы можете преобразовать трехмерные координаты в двумерные на экране и смоделировать простые объекты наподобие куба.
Задача проекта
В данном разделе вы научитесь преобразовывать координаты трехмерного пространства в двумерные экранные координаты. Затем вы примените эти знания для создания простого трехмерного куба, а потом и более сложного объекта. Пользователь сможет управлять этими моделями, чтобы убедиться в том, что они действительно являются трехмерными объектами, а не простыми двумерными изображениями.
Подход
Для того чтобы понять, как используются трехмерные координаты, вам необходимо знать основы аналитической геометрии. Это один из самых трудных разделов данной книги, поэтому, если изучение математики вас не привлекает, вы можете пропустить его и перейти к следующей главе.
Подготовка ролика
В описываемых ниже примерах используются только точки и линии. Создать точку легко, однако линия должна соответствовать определенным условиям. Подробное описание приводится ниже.
Создание кода
В следующих разделах описывается пошаговое создание трехмерных моделей в Flash. Начнем с кода, преобразуюшего трехмерные координаты в двумерные экранные координаты.
Преобразование координат
Местоположение объектов на экране определяется двумя координатами: x и у. Объекты в трехмерном пространстве должны иметь три координаты: x, у и z. Последняя определяет глубину.
Для отображения объектов на рабочем поле необходима функция, преобразуюшая x, у и z в экранные координаты x и у. Кроме того, вы будете наклонять и врашать объекты. Поэтому функция преобразования должна учитывать базовые наклоны и врашение.
Учтите, что это самый сложный сценарий из тех, которые мы до сих пор рассматривали и, возможно, из всех сценариев данной книги.
Математическая функция Math.atan (arctg, арктангенс) используется для преобразования координат в угол, а функции Math.sin и Math.cos – для преобразования значения углов обратно в координаты. Таким образом, координаты точки преобразуются в угол и расстояние от центра плоскости. Затем точка поворачивается и вновь преобразуется в координаты. Данное действие выполняется один раз для врашения и один раз для наклона. В результате вы получите координаты x и у, которые можно использовать на экране компьютера.
Комментарии, содержашиеся в нижеприведенном коде, объясняют, какое действие выполняет каждая его часть. Затем приводятся пошаговые объяснения.
// Переводим трехмерные координаты в координаты на экране
// (делаем проекцию).
function plotPoint(object) {
(1) → // Берем координаты объекта.
x = object.x;
o = object.o
z = object.z;
(2) → // Вычисляем расстояние от центра.
radius = Math.sqrt (x*x+y*y);
(3) → // Вычисляем первый угол.
if (x == 0) angle = Math.atan(l000000) [11] ;
else angle = Math.atan(y/x);
if (x < 0) angle += Math.PI;
(4) → // Поворачиваем объект.
angle += rotation;
(5) → // Вычисляем новые координаты.
realx = radius*Math.cos(angle);
realz = radius*Math.sin(angle);
realy = z;
(6) → // Определяем новое расстояние от центра.
radius = Math.sqrt(realy*realy+realz*realz);
(7) → // Вычисляем второй угол.
if (realz == 0) angle = Math.atan(1000000);
else angle = Math.atan(realy/realz);
if (realz < 0) angle += Math.PI;
(8) → // Добавляем угол наклона сечения.
angle += plane;
(9) → // Вычисляем координаты для экрана.
screenx = realx;
screeny = radius*Math.sin(angle);
screenz = radius*Math.cos(angle);
(10) → // Центрируем положение объекта.
screenx += 275;
screeny += 200;
(11) → // Возвращаем новые координаты.
return({x:screenx,y:screeny,z:screenz});...Примечание