9. Трехкадровые циклы. Программная анимация. Программное изменение свойств объектов позволяет создавать программную анимацию. В отличие от стандартной анимации, которую можно создать в программе Macromedia Flash, программной анимацией можно управлять по ходу ролика.
Казалось бы, достаточно циклично изменять свойства объекта, например координату x и объект начнет движение, но это не так. Дело в том, что во Flash вначале выполняется программный код, а лишь потом происходит изменение, перерисовка экрана. Поэтому объект из начальной точки сразу перенесется в конечную, плавного движения не получится. Преодоление этого противоречия лежит в использовании трехкадровых циклов.
Их идея в следующем:
В первом ключевом кадре задаются начальные константы, начальное положение объекта.
Во втором ключевом кадре происходит изменение свойства объекта на какую-то заданную величину.
В третьем ключевом кадре находится всего одна команда перейти на второй кадр.
Не смотря на то, что явно цикл не задан, будет происходить циклическое изменение свойств. Выполнив программное изменение свойств во втором кадре, компьютер изменит положение объекта, а третий кадр «зациклит этот процесс.
Рассмотрим, как трехкадровый цикл реализуется на практике. Создадим ролик, в котором автомобиль движется от края до края листа, поворачиваясь в противоположную сторону и продолжая движение до бесконечности. У пользователя есть возможность изменять его скорость движения, замедляя или увеличивая его. Внешний вид ролика, разумеется без движения представлен на Рисунок 22. Ниже будет представлен разбор программного кода для реализации данного проекта.
Рисунок 22
Создайте на первом слое рисунок машины, или импортируйте уже готовый рисунок7. Слой переименуйте в «машина», а ключевой кадр продлите до третьего кадра, нажав в третьем кадре клавишу F5.
Конвертируйте рисунок в символ, типа клип видеофрагмента. Дайте имя копии этого символа на плавающей панели «Копия», например, «car».
Создайте новый слой, переименуйте его в «кнопки» и создайте на нем две кнопки «быстрее» и «медленнее».
На новом слое «Действия» создайте три пустых ключевого кадра, три раза нажмите клавишу F7.
В первом ключевом кадре добавьте следующий код:
setProperty ("car", _x, 50);
dx = 5;
MinX = 50;
MaxX = 500;
Обратите внимание, данный код не взят в фигурные скобки и в начале не присутствует on (release), то есть данный код относится именно к кадру, а не кнопке. В данном фрагменте в первой строке у объекта под именем car устанавливается свойство _x (координата по оси x) значение 50. Далее вводится три переменных, вот их смысл: dx – величина единичного перемещение объекта, а также направление движение (смотри дальше), MinX и MaxX соответственно минимально и максимально возможная координата объекта. Вообще можно обойтись без этих переменных, но используя их значительно проще отлаживать ваш проект. Я думаю, более глубокое понимание возникнет при анализе дальнейшего кода.
Во втором ключевом кадре добавьте следующий код:
x = getProperty ( car, _x );
‘ В переменной x сохраняется текущее положение объекта.
if (dx>0) {
if (x<=MaxX) {
setProperty ("car", _x, x+dx);
} else {
setProperty ("car", _xscale, -100);
dx = -dx;
}
}
‘ Конструкция из двух вложенных условных операторов. Первый проверяет dx>0. Если это так, то автомобиль движется вправо. Второе условие x<=MaxX проверяет не достиг ли автомобиль максимально возможной координаты. Если это так то изменяется координата x объекта «car». Если второе условие не выполняется, то максимальная координата достигнута, как результат масштаб по координате х изменяется на -100% (автомобиль переворачивается) и единичного перемещение объект изменяется на противоположное.
if (dx<0) {
if (x>=MinX) {
setProperty ("car", _x, x+dx);
} else {
setProperty ("car", _xscale, 100);
dx = -dx;
}
}
‘ Вновь конструкция из двух вложенных условных операторов. их назначение аналогично предыдущим.
В третьем ключевом кадре добавьте следующий код:
gotoAndPlay (2);
Если вы сейчас запустите проект, то увидите что объект совершает движение вправо-влево. Добавим несложный код, увеличивающий и уменьшающий скорость.
Для изменения скорости нужно увеличить величину единичного перемещения объекта. Код, соответствующие кнопке «быстрее» приведен ниже:
on (release, keyPress "") {
if (dx>0) {
dx = dx+1;
‘ Если единичное перемещение положительно, то нажатие на кнопку увеличивает это перемещение на единицу. Обратите внимание, что тоже действие произойдет если вы нажмете на кнопку на клавиатуре «вправо».
} else {
dx = dx-1;
}
}
Код, соответствующие кнопке «медленнее» приведен ниже:
on (release, keyPress "") {
if (dx>0) {
dx = dx-1;
} else {
dx = dx+1;
}
}
Назначение аналогично предыдущему фрагменту. Вот и все. Запускайте проект, тестируйте его. Полученные знания мы применим в последнем проекте, который объединит в себе два предыдущих и получится игра.
Вопросы для повторения:
Почему программную анимацию невозможно реализовать с помощью обычного цикла «пока»?
Поясните назначение каждого кадра в трехкадровом цикле.
Поясните смысл переменной dx в описанном проекте.
Для чего в программном коде присутствует строка setProperty ("car", _xscale, 100);?
Добавьте к созданному пректу кнопку "остановить".
10. Проект «Интерактивная игра - Тир». Цель проекта: Создать интерактивную игру тир. На игровом поле перемешается заяц (цель) в которого необходимо попасть с помощью перемещаемой мишени. Попадание необходимо произвести за минимальное кол-во шагов (высчитывается). Примерный вид экрана представлен на Error: Reference source not found.
Для реализации этого проекта вам необходимо создать объект цель (в данном случае, это импортированный рисунок зайца). Он должен совершать движения так же как автомобиль из предыдущего проекта. Также необходимо создать объект мишень и набор кнопок, которые перемещают данный объект вправо-влево и вверх-вниз. Также необходимо создать шесть динамических полей вывода. Два для вывода координат мишени, два для вывода координат цели, одно для вывода результата и одно для подсчета кол-ва попыток.
В принципе это – все тот же трехкадровый цикл. В первом кадре задаем начальные параметры:
d = 10;
h = 5;
max_x = 500;
min_x = 50;
rez = 0;
z_x = random (450)+50;
z_y = random (230) + 50;
pr_x = getProperty ( pr, _x );
pr_y = getProperty ( pr, _y );
setProperty ("z", _x, z_x);
setProperty ("z", _y, z_y);
setProperty ("buh", _visible, 0);
d – точность попадания (подробней о этой переменной далее); h – единичный шаг перемещения «зайца»; rez – количество повторений, изначально данная переменная равна нулю; z-x и z-y – начальные координаты «зайца», они задаются с помощью стандартной функции Random, она вызывается с помощью команды Объектов – Математика - Произвольный в окне Действия кадра; далее свойства цели (объект «z») устанавливаются в полученные случайные координаты; и наконец в последней строке устанавливается видимость «выстрела» равной нулю, то есть до поры до времени объект «buh» невидим.
Рисунок 23 А ниже представлен код, соответствующий второму ключевому кадру:
z_x = getProperty(z, _x);
if (h>0) {
if (z_x>=max_x) {
setProperty ("z", _xscale, -50);
h = -h;
}
} else {
if (z_x<=min_x) {
setProperty ("z", _xscale, 50);
h = -h;
}
}
setProperty ("z", _x, z_x+h);
все в точности повторяет аналогичный код второго кадра из прошлой задачи.
В третьем кадре находится всего одна команда:
gotoAndPlay (2);
она позволяет «зациклить» движение цели.
Добавьте код для кнопок, перемещающих мишень вправо-влево, вверх-вниз. В качестве примера приведем код, для перемещения мишени вправо:
on (release, keyPress "") {
pr_x = getProperty ( pr, _x );
setProperty ("pr", _x, pr_x + 10);
pr_x = getProperty ( pr, _x );
}
в этом фрагменте команда pr_x = getProperty ( pr, _x ) повторяется дважды, это – не ошибка. Просто первый раз эта команда нужна для того, чтобы определить положение мишени до перемещения, а второй раз нам нужна новая координата мишени, чтобы при выстреле сравнивать ее с координатой цели.
Осталось добавить код для кнопки «огонь». Он представлен ниже:
on (release, keyPress "") {
rez = rez + 1;
‘ Вне зависимости от результативности выстрела переменная rez увеличивается на единицу.
setProperty ("buh", _x, pr_x);
setProperty ("buh", _y, pr_y);
setProperty ("buh", _visible, 1);
‘ Символ имитирующий «выстрел» перемещается в координаты где в данный момент находится мишень и его видимость становится равной единице.
tellTarget ("buh") {
gotoAndPlay (2);
}
‘ В проекте «выстрел» - это клип в котором проявляется красный круг. Для того, чтобы этого не происходило постоянно в первом и последнем кадре клипа стоит команда stop(). Команда TellTarget показывает компьютеру, что следующие в фигурных стрелках команды относятся только к объекту «buh» и выполняются в нем. Переходя во второй кадр тем самым запускается анимация внутри клипа «buh».
if (Math.abs (pr_x - z_x) text = "Точно в цель!";
stop ();
‘ В каком случае считать что мы попали в цель – в том случае, если разница между координатами цели и мишени меньше точности попадания (переменная d в первом кадре). Все дело втом, что одновременно выполняться оба условия идля координат x и для координат y, поэтому используется логическая связка И (смотри урок 4). И последнее, мы должны сравнивать модуль разности координат для этой цели используется стандартная математическая функция Math.abs (). Если все условия выполняются, динамическое поле «text» принимает значение "Точно в цель!" и ролик останавливается.
} else {
text = "мимо!";
}
}
Вот и все. Проект работает, цель бегает от нас, а текстовые поля отслеживают его положение. Мишень перемещается по полю, и результаты выводятся на экран. Можно поздравить себя мы прошли весь путь.
Вопросы для повторения:
Какие изученные технологии использованы в этом проекте?
Какое назначение у команды tellTarget ("buh")?
Что нужно изменить в программе, чтобы уменьшить поле движения зайца на 100 пикселей?
Почему сравнивая координату цели и координату мишени, мы должны вычислять модуль данных координат? Как это реализуется во Flash?
Предложите варианты усложняющие игру, предложите пути их реализации.
Мы только прикоснулись к программированию во Flash. Остались не затронутыми такие вопросы, как работа с массивами, мы не работали со звуком и с прокручиваемыми текстовыми полями, мы не работали с объектными переменными. В Flash еще много тайн и сюрпризов, их изучение – это отдельный разговор. Возможно у автора найдется время, чтобы описать и эти интересные аспекты.
Если вас заинтересовали эти первые уроки, заинтересовало программирование во Flash, то эти несколько ночей, что я описывал первые шаги в замечательной программе Macromedia Flash не пропали даром. Вы можете связаться со мной по E-mail, высказать свои пожелания и замечания, задать вопросы, но в любом случае спасибо, что вы дочитали этот текст.
|