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

ПРИМЕЧАНИЕ. Достаточно странная на первый взгляд система координат Flash берет свое начало из профессионального программирования

Читайте также:
  1. F) Подготовить примечание к балансу, показывающее движение по счёту отложенного налога для каждого вида временных разниц.
  2. КонсультантПлюс: примечание.
  3. КонсультантПлюс: примечание.
  4. КонсультантПлюс: примечание.
  5. КонсультантПлюс: примечание.
  6. Примечание
  7. Примечание
  8. Примечание
  9. Примечание
  10. Примечание
  11. Примечание
  12. Примечание

 

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

 

• Аналогичным образом определяем координату экземпляра по Y. Так как мяч должен начать движение где-то с точки, расположенной на уровне 3/5 от всей ширины рабочей области (равной 400 рх), а ось направлена сверху вниз, то подходящим значением будет 170.

 

Полный текст скрипта, позиционирующего «тело» мяча в нужной точке:

 

ball._х=-50; bаll._у=170;

 

Теперь нужно поместить в ту же точку, что и сам мяч, его контур:

 

contour,_х=-50; contour._y=170;

 

Чтобы убедиться в том, что введенный код действует, нажмите <Ctrl> + <Enter>. Вы увидите, что первоначально расположенные стихийно объекты совмещены и выглядят как один цельный предмет.

 

Далее необходимо решить, как именно мы будем производить изменения в положении объектов, связанные с их движением. Пожалуй, создадим специальный объект — функцию-обработчик события, которая будет запускаться с каждым новым кадром и менять положение мяча и тени.

 

Для этого:

 

Вводим «_root.onEnterFrame». Это означает, что мы заставляем объект _root (основную временную диаграмму) «слушать» событие onEnterFrame (системное событие наступления нового кадра), В принципе, вместо _root можно использовать любой «слушающий» это событие объект (листенер), например, клип contour. Событие onEnterFrame регистрирует не непосредственный переход проигрывающей головки на новый кадр, а лишь промежуток времени (1/12 секунды по умолчанию), соответствующий выбранной частоте кадров. Поэтому это событие работает, даже если в вашем фильме только один кадр (или промотка остановлена функцией stop()).

Указываем системе, что именно следует выполнять при наступлении «прослушиваемого» события. В нашем случае это функция, содержащая управляющий движением объекта код:

 

_root.onEnterFrame=function() {

}

 

Чтобы убедиться, что созданный код работает, введите в ажурные скобки функции следующий скрипт и протестируйте фильм:

 

ball._x+=2; contour._x+=2;

 

Вы увидите, как мяч заскользит по горизонтали и исчезнет через несколько секунд за границей листа. Закончив проверку, удалите код из тела функции.

 

Самое трудное. Нужно описать в ажурных скобках созданной функции движение мяча. Для этого придется немного вспомнить курс механики.

 

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

 

Если вы помните, в механике координата ускоренно движущегося тела определяется по формуле Y = Y 0 + Vy 0 t +1/2 at 2,где Y 0 − начальное положение, Vy 0 — начальная скорость вдоль соответствующей оси, a — ускорение, t — время движения. Ее-то мы и используем, присваивая в каждом новом кадре координате (у) мяча вычисляемое по ней значение:

 

ball._y=Y0+Vy*t+a*t*t/2;

 

Символом «*» в ActionScript задается умножение. Через него же определен и квадрат времени, так как использование для этого специального метода слишком громоздко.

 

Движение мяча по горизонтали равномерно, поэтому и формула используется более простая:

X = X 0 + Vxt,где X — 0 координата по оси абсцисс начальной точки, V x — скорость в рассмат-

риваемом направлении. t — время движения. В форме скрипта:

 

ball._x=X0+Vx*t;

 

При задании уравнений движения нами были использованы переменные. Теперь необходимо их явно определить и присвоить им подходящие значения. Сделать это надо вне пределов тела функции, так как некоторые из переменных будут изменять свои значения в ходе движения мяча (записанные же в ее фигурных скобках, они будут принимать свою первоначальную величину при каждом ее вызове). Поэтому выше функции вводим:

 

var t=0;

 

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

То, почему время задается равным нулю, очевидно. Будем считать, что мяч начинает движение в верхней точке траектории, поэтому вертикальную составляющую начальной скорости заладим равной нулю. Ускорение и горизонтальную составляющую начальной скорости прописываем произвольным образом (оптимальное их значение определится при тестировании).

Итак, данному выше описанию должен соответствовать следующий скрипт:

 

var Х0=50; // Координата начальной точки по X var Y0=170; // Координата начальной точки по Y var t=0; // Время движения var a=2; // Ускорение

var Vy=0; // Начальное значение вертикальной составляющей скорости var Vx=6; // Начальное значение горизонтальной составляющей скорости

 

Теперь нужно определиться, что будет выступать в качестве времени. Сделать привязку к номеру кадра мы не можем — он у нас только один. Поступим по-другому: при каждом запуске функции будем прибавлять к переменной t некоторую величину (ее подходящее значение подберем потом эмпирически). Это даст тот же эффект, что и привязка к реальным «часам». Необходимый код:

 

t+=0.6;

 

Оператор «+=» служит для увеличения переменной или свойства на определенную величину. Аналогичные операторы для вычитания значения — «-=», для умножения на значение — «*=», для деления на значение — «/=» (что достаточно очевидно).

 

«Счетчик» следует поместить в самый коней скрипта в теле функции, так как время должно быть пересчитано л ишь тогда, когда система рассмотрит все выражения с его участием.

 

Тестируем фильм. В том случае, если мяч не будет двигаться по параболе, набирая скорость, проверяем верность введенного кода.

 

Далее следует описать то, что должно произойти при столкновении мяча с «полом». Однако прежде нужно разобраться, как мы будем узнавать об ударе. Так как единичное перемещение объекта в нашем случае невелико, то наиболее простым признаком этого будет превышение у-координатой мяча некоторого порогового значения:

 

if (bаll._у>350) {

}

 

В фигурных скобках оператора условия следует прописать следующие действия:

• Изменение направления движения мяча на языке физики означает инверсию знака вертикальной составляющей скорости. Но ее значение в точке, которую мы приняли за уровень пола, неизвестно. Чтобы обойти эту проблему, вводим переменную, в значении которой будет фиксироваться текущая величина вертикальной составляющей скорости мяча. В основу ее вычисления положим известную физическую формулу для скорости тела при ускоренном движении:

 

newV=Vy+a*t;

 

• Переменной Vy присваиваем значение, равное переменной newV. Помимо этого, так как при

ударе мяч должен потерять часть энергии, вводим понижающий коэффициент:

 

Vy=-newV*0.85;

 

• В результате удара должна уменьшиться и горизонтальная (ранее неизменная) составляющая

скорости:

 

Vx=0.85*Vx;

• Изменение знака скорости — это операция, требующая, чтобы координаты начальной точки (X0,Y0) были заменены координатами точки отскока (подумайте, почему). Поэтому аналогичным образом, что и для вертикальной составляющей скорости, вводим «следящие» переменные в теле функции и для координат мяча:

newY=ball._у; newX=ball._х;

 

При выполнении условия отскока их значения должны быть присвоены переменным Х0 и Y0:

 

X0=newX;

Y0=newY;

 

• Так как была изменена начальная точка, время должно быть обнулено. Но чтобы код не прокру-

тился вхолостую, присваиваем переменной t ее шаговое значение:

 

t=0.6;

 

• В ActionScript явно объявлять переменные совсем необязательно. Но это стоит делать для повышения общей стройности и читабельности кода. Поэтому вне (-обработчика события onEnterFrame объявляем переменные newV, newX и newY равными null:

 

var newV=null; var newX=null; var newY=null;

 

Величина null используется, если переменной при объявлении не может быть присвоено какого-то конкретного значения.

 

Скрипт условного оператора должен быть помешен выше остального кода в теле Функции.

 

Тестируем фильм. Если мячик не двигается или двигается неправильно, сравниваем код со следующим эталоном (приведен только текст функции, так как в определении переменных нет никакой сложности):

 

_root.onEnterFrame = function () { if (ball._y>350) {

Vy = -newV*0.85; Vx = 0.85*Vx; t = 0.6; X0 = newX;

У0 = newY;

}

ball._y = Y0+Vy*t+a*t*t/2; ball._x = X0+Vx*t; newV = Vy+a*t; newY = ball._y; newX = ball._x; t += 0.6;

}

 

Описываем движение контура мяча. В качестве тренировки добавьте необходимый код самостоятельно (для этого достаточно всего двух строк скрипта).

 

Помимо простого перемещения, контур должен еще и вращаться. Угол поворота (в градусах) объекта определяет свойство _rotation. Оптимальная величина поворота определяется подбором:

 

contour._rotation+=8;

Готовый fla-файл данного проекта, выполненный автором, вы можете найти в папке Проект1 библиотеки проектов. Он называется ball 1.Па. Обратитесь к нему, если вы не сможете описать движение контура мяча самостоятельно.

 

Код для перемещения тени придумайте сами. Это будет неплохое домашнее задание, выполнив которое вы без труда разберетесь со всеми тонкостями созданной нами программы. Подсказка: изменять размеры тени (в процентах) вы сможете при помощи свойств xscale и yscale. Если вы не справитесь с этим заданием, то сильно не огорчайтесь — оно достаточно непростое для новичков. Обратитесь к созданному автором «исходнику» ball2.fla, который расположен в папке этого проекта. Код в нем снабжен комментариями, так что вы без проблем разберетесь в его основной идее. Итак, мы добились большой победы — описали движение мяча при помощи языка программирования так, что получившаяся анимация ничем не уступает той, которую могли бы создать при помощи традиционных средств мультипликации во Flash. Более того, наша анимация превосходит традиционную:

 

• Она физически адекватна, так как в основу движения положены формулы механики.

• Она предельно компактна. Конечный swf-файл занимает всего 800 байт.

• Мы можем наблюдать движение мяча при разных значениях скорости, начальной точки, точки отскока, упругости, ускорения (что трудно реализуемо или невозможно при использовании непрограммных средств). Исходя из этого будут получаться самые различные траектории. На рис. 1.19 представлены линии движения мяча при коэффициентах упругости 90 % и 80 % (эти графики были получены при помощи средств программного рисования, о которых мы поговорим немного позже). Поэкспериментируйте с величинами параметров, найдя наиболее подходящие их значения. Для этого обратитесь к файлу ball3.swf, в котором с целью облегчения работы с моделью созданы специальные поля ввода и кнопка повторного запуска мяча.

 

Рис. 1. 19. Траектории движения.мяча при различных значениях коэффициента упругости: а—90%, b —80%

 

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

 

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

 


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.)