
- •Саблукова н.Г. Программирование в среде delphi
- •Часть II
- •Создание проектов
- •Содержание
- •§1 Добавление графических изображений в проект
- •§2 Использование элементов анимации и мультипликации
- •Движение объектов
- •Задания
- •2.2 Изменение форм и видов объектов
- •Задания
- •2.3 Изменение размеров объектов
- •2.4 Пример программы движения объектов с элементами анимации и мультипликации типа «Тараканьи бега»
- •§3 Управление объектами
- •3.1 Управление объектом с помощью мыши
- •Создание проекта с использованием управления объектом с помощью мыши
- •Задания
- •3.3 Управление объектом с помощью клавиатуры
- •Задания
- •§4 Работа со строками
- •4.1 Строковый тип данных
- •4.2 Использование компонента tMemo для работы со строками
- •4.3 Работа со строками с помощью компонентов
- •Задания
- •5. Массивы
- •5.1 Одномерные массивы
- •Доступ к элементам массива
- •Задания
- •Многомерные массивы. Пример создания проекта с границами типа «Лабиринт»
- •Задания
- •6. Создание меню
- •6.1 Главное и вложенное меню
- •6.2 Создание текстового редактора с изменяемыми настройками типа «меню» и элементами диалога
- •7. Элементы мультимедиа
- •Литература
§2 Использование элементов анимации и мультипликации
Движение объектов
Наиболее простым способом создания анимации и мультипликации в Delphi является задание движущегося и изменяющегося рисунка. В простейшем случае рисунок может либо двигаться, либо изменяться.
В первой части пособия уже были разобраны примеры с перемещением объектов при использовании компонента TTimer. В данном параграфе рассмотрим движение более подробно.
Чтобы задать движение необходимо объекты всегда привязывать к форме. На форме начало координат – точка (0,0) совпадает с левым верхним углом формы. Положение каждого объекта задается горизонтальной (по оси Ox) и вертикальной (по оси Oy) координатами.
Рис. 7. Форма с координатной сеткой
Координаты
автомобиля - (0, 216)
Рис. 8. Координаты автомобиля
Двигаясь горизонтально, объект меняет координату по оси Ox: x = x + a. Параметр а может принимать произвольные значения: постоянные или случайные числа (задаваемые датчиком случайных чисел). При а>0 объект перемещается вправо, при а<0 – влево. По оси Oy в данном случае координата не меняется.
(0, 216)
(15, 216)
(30, 216)
Рис. 9. Движение автомобиля по оси Ox при а = 15 (x = x + 15).
Координате по оси Ox соответствует свойство Left, которое указывает положение объекта относительно левого края формы. Например, задать движение автомобиля (Image1), изображенного на рис. 9 вправо можно с помощью следующей конструкции: Image1.left:=Image1.left + 15;
Пример. Разработать проект, в котором по горизонтальной дороге равномерно перемещается автомобиль. |
Создадим графический интерфейс проекта, подобно тому, как изображено на рис. 10.
Рис. 10 Графический интерфейс окна
Для вывода изображений дороги и автомобиля используем соответственно компоненты Image1 и Image2. Необходимые картинки создадим в графическом редакторе Paint и загрузим при проектировании формы в компоненты Image1 и Image2. Также поместим в любое место на форме компонент TTimer с интервалом 100. Таймер необходим в программе для организации повторения действий.
Перемещение автомобиля вправо задается изменением его свойства Left: Image2.left:=Image2.left+5.
Если автомобиль достигнет правой границы окна, то его можно вернуть на исходную позицию. То есть, если положение автомобиля относительно левой границы (свойство Left) будет больше ширины окна (свойство Width), он возвращается в исходную точку с помощью оператора:
If Image2.Left>Image1.Width then Image2.Left: = 0.
В обработчик события OnTimer компонента Timer1 введем следующий текст программного кода:
procedure TForm1.Timer1Timer(Sender: TObject); |
Begin |
Image2.left:=Image2.left+5; |
If Image2. Left>Image1.Width then Image2.Left: = 0; |
end; |
Вообще движение в Delphi можно задать двумя способами:
1 способ заключается в движении объекта по форме, как в разобранном примере. В этом случае окружающая обстановка остается неподвижной.
2 способ состоит в том, что сам объект стоит на месте, а окружающий его фон перемещается.
Аналогично горизонтальному движению задается перемещение по вертикали, при котором изменяется координата по оси Oy: y = y + b. При b>0 объект движется вниз, при b<0 – вверх.
Координата по оси Oy соответствует свойству Top, которое показывает положение относительно верхней границы окна. Например, оператор Image1.Top:=Image1.Top – 5 перемещает объект Image1 на 5 позиций вверх.
Пример. Создать проект, в котором мячик скачет вверх и при достижении верхней позиции опускается вниз. Изображение мяча загрузить при выполнении программы. |
Поместим на форму компоненты TImage и TTimer с интервалом 100, сохраним проект. Файл с изображением мяча boll.bmp переместим в папку с проектом.
Рис. 11 Графический интерфейс окна.
Рисунок по условию задачи необходимо загрузить в компонент Image1 в процессе выполнения программы, для этого используем метод Image1.Picture.LoadFromFile ('boll.bmp'). При движении вверх свойство Top у мяча будет уменьшаться:
Image1.Top:=Image1.Top – 10.
Возвратить мячик в исходную позицию после достижения им верхнего края окна можно с помощью условного оператора:
if Image1.Top<=0 then Image1.Top:= Form1.Height - Image1.Height.
Текст обработчика события OnTimer, в котором описывается движение мячика, будет следующим:
procedure TForm1.Timer1Timer(Sender: TObject); |
Begin |
Image1.Picture.LoadFromFile ('boll.bmp'); |
Image1.Top:=Image1.Top - 10; |
if Image1.Top<=0 then Image1.Top:= Form1.Height - Image1.Height; |
end; |
При перемещении объектов по произвольным траекториям у них изменяются одновременно координаты х и y. Движение объектов описывается системой двух уравнений:
x
= x
+a
y = y + b.
Соответственно одновременно будут изменяться и положения относительно левого и нижнего края окна, то есть свойства Left и Top.
Пример. Создать проект, в котором мячик движется по диагонали и, достигая стенки, отскакивает от нее. |
Разработаем графический интерфейс проекта, подобно тому, как изображено на рис. 12. В компонент Image1 загрузим изображение мячика, в компонент Image2 – изображение рабочей области. В произвольном месте на форме расположим компонент TTimer с интервалом 50 и кнопку TButton с заголовком Пуск.
Рис. 12 Графический интерфейс окна.
Для удобства введем дополнительные переменные:
x – горизонтальная координата мяча или его положение относительно левой границы;
y – вертикальная координата мяча или его положение относительно верхней границы;
а – величина приращения по оси Ox;
b – величина приращения по оси Oy.
Значения этих переменных установим в обработчике события OnClick для кнопки Пуск (Button1). Также после нажатия кнопки выполняется запуск мяча, т.е. свойство Enabled у компонента Timer1 должно стать равным True:
procedure TForm1.Button1Click(Sender: TObject); |
Begin |
a:=5; |
b:=5; |
x:=Image1.Left; |
y:=Image1.Top; |
Timer1.Enabled:=true; |
end; |
Для реализации данного проекта необходимо рассмотреть 8 вариантов движения мяча.
Мяч отскакивает от нижней границы:
при движении слева направо
до удара координаты
мяча описывались уравнениями:
,
после удара
уравнения изменились:
.
Из уравнений видно, что у мяча вертикальная координата y изменила свое приращение с b на –b. Таким образом, если начальные значения a=5 и b=5, а также y>(Image2.Height-Image1.Heught), то после отскока переменная b станет равной -5.
if (a=5) and (b=5) and (y>Image2.Height-image1.Height) then b:=-5.
при движении справа налево
д
о
удара:
,
после удара:
.
Условие движения будет следующим:
if (a=-5) and (b=5) and (y>Image2.Height-image1.Height) then b:=-5.
Мяч отскакивает от правой границы:
при движении сверху вниз
до удара:
,
после удара: .
Условие: if (a=5) and (b=5) and (x>Image2.Width-Image1.Width)
then a:=-5.
при движении снизу вверх
д
о
удара:
,
после удара: .
Условие: if (a=5) and (b=-5) and (x>Image2.Width-Image1.Width)
then a:=-5.
Мяч отскакивает от верхней границы:
при движении справа налево
д
о
удара:
,
после удара: .
Условие: if (a=-5) and (b=-5) and y<Image2.Top then b:=5.
при движении слева направо
д
о
удара:
,
после удара:
.
Условие: if (a=5) and (b=-5) and y<Image2.Top then b:=5.
Мяч отскакивает от левой границы:
при движении сверху вниз
д
о
удара:
,
после удара: .
Условие: if (a=-5) and (b=5) and x<Image2.Left then a:=5.
при движении снизу вверх
д
о
удара:
,
после удара: .
Условие: if (a=-5) and (b=-5) and x<Image2.Left then a:=5.
Обработчик события OnTimer будет выглядеть следующим образом:
procedure TForm1.Timer1Timer(Sender: TObject); |
Begin |
x:=x+a; |
y:=y+b; |
image1.Left:=x; |
Image1.Top:=y; |
if (a=5) and (b=5) and (y>Image2.Height-image1.Height) then b:=-5; |
if (a=-5) and (b=5) and (y>Image2.Height-image1.Height) then b:=-5; |
if (a=5) and (b=-5) and (x>Image2.Width-Image1.Width) then a:=-5; |
if (a=5) and (b=5) and (x>Image2.Width-Image1.Width) then a:=-5; |
if (a=-5) and (b=-5) and y<Image2.Top then b:=5; |
if (a=5) and (b=-5) and y<Image2.Top then b:=5; |
if (a=-5) and (b=5) and x<Image2.Left then a:=5; |
if (a=-5) and (b=-5) and x<Image2.Left then a:=5; |
end; |