
- •Саблукова н.Г. Программирование в среде 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. Элементы мультимедиа
- •Литература
Задания
Создать проект, в котором два автомобиля движутся навстречу друг другу.
Рис. 13 Графический интерфейс проекта
Создать проект, в котором один автомобиль едет за другим и обгоняет его.
Создать проект, в котором движутся навстречу два автомобиля. Машины сталкиваются друг с другом.
Разработать проект, в автомобиль неподвижен, а фон вокруг него перемещается.
Создать проект, в котором по диагонали двигаются два мяча. При ударе о стенки мячи отскакивают от них. Если мячи столкнутся друг с другом, то они должны разлететься в разные стороны.
Создать проект, в котором мячик движется по диагонали и отскакивает от стенок. Стенка, с которой столкнулся мячик, должна изменить свой цвет.
Составить программу движения на экране точки, которая перемещается по орбите а) квадрата; б) увеличивающегося квадрата.
Составить программу движения на экране точки, которая перемещается по орбите окружности.
Составить программу имитации движения секундной стрелки.
2.2 Изменение форм и видов объектов
Следующим видом анимации является изменение объектов.
Для периодичного изменения формы и вида объектов обычно используется переменная-счетчик целого типа. Каждое значение этой переменной фиксирует определенное состояние объекта.
Пример. Создать проект, в котором демонстрируются различные фазы луны. |
Для оформления графического интерфейса проекта поместим на форму таймер и три компонента TImage: в Image1 загрузим изображение круглой луны, в Image2 – половины луны и в Image3 – месяца (рис. 14). Все три компонента наложим друг на друга так, чтобы они практически совпадали (рис. 15) и установим свойство Visible равным False.
Рис. 14 Фазы луны
Рис. 15 Графический интерфейс окна
Введем переменную-индикатор n целого типа. Эта переменная будет соответствовать различным фазам луны. При n = 1 выводится изображение полной луны (Image1.Visible = true), при n = 2 – половины луны (Image2.Visible = true), при n = 3 – месяца (Image3.Visible = true). Если n = 4, то луна на небе вообще отсутствует. Переменная-счетчик может менять свои значения с помощью оператора n:= n+1.
Обработчик события OnTimer будет иметь вид:
procedure TForm1.Timer1Timer(Sender: TObject); |
var n: integer; |
Begin |
n: = n+1; |
if n = 1 then begin |
Image1.Visible:=true; |
Image2.Visible:=false; |
Image3.Visible:=false; |
end; |
if n=2 then begin |
Image1.Visible:= false; |
Image2.Visible:= true; |
Image3.Visible:=false; |
end; |
if n=3 then begin |
Image1.Visible:= false; |
Image2.Visible:= false; |
Image3.Visible:= true; |
end; |
if n=4 then begin |
Image1.Visible:=false; |
Image2.Visible:=false; |
Image3.Visible:=false; |
end; |
if n>4 then n:=0; |
end; |
Текст программного кода значительно сократится, если использовать вывод изображения различных фаз луны во время выполнения программы. В этом случае достаточно будет одного компонента TImage, размещенного на форме:
Рис. 16 Графический интерфейс окна.
При n = 1 в Image1 загружается файл с полной луной (1.bmp), при n = 2 – с половиной луны (2.bmp), при n = 3 – с месяцем (3.bmp).
Обработчик события OnTimer будет иметь следующий вид:
procedure TForm1.Timer1Timer(Sender: TObject); |
var n: integer; |
Begin |
n: = n+1; |
if n=1 then Image1.Picture.LoadFromFile('1.bmp') |
if n=2 then Image1.Picture.LoadFromFile('2.bmp') |
if n=3 then Image1.Picture.LoadFromFile('3.bmp') |
if n>3 then n:=0 |
end; |
Движение объектов и изменение их форм можно совместить в одном проекте. Рассмотрим пример такой программы.
Пример. Создадим проект «Зарядка», в котором помещенный на форму человечек выполняет следующие упражнения:
|
В данном проекте будет использоваться и изменение вида объекта (человека), и движение объекта (мяча).
Для создания графического интерфейса проекта нарисуем в графическом редакторе Paint следующие изображения:
изображение человечка с опущенными руками – 1.bmp (рис. 17, а);
изображение человечка с поднятыми руками – 2.bmp (рис. 17, б);
изображение приседающего человека – 3.bmp (рис. 17, в);
изображение мяча – ball.bmp (рис. 17, г);
изображение подставки – floor.bmp (рис. 17, д).
а) б) в) г) д)
Рис. 17 Изображения, используемые в проекте.
Начнем с программирования первого упражнения. Для этого поместим на форму 3 объекта TImage со следующими свойствами:
У объекта Image1 в свойство Picture загрузим рисунок 1.bmp; transparent = true; visible = true; stretch = true.
У объекта Image2 в свойство Picture загрузим рисунок 2.bmp; transparent = true; visible = false; stretch = true.
У объекта Image3 в свойство Picture загрузим рисунок floor.bmp; transparent = true; visible = true; stretch = true.
При этом изображения Image1 и Image 2 должны практически точно накладываться друг на друга.
Для организации повторения первого упражнения поместим на форму компонент Timer1 с интервалом 500. В результате получим графический интерфейс подобно тому, как изображено на рис. 18.
Рис. 18 Графический интерфейс проекта «Зарядка»
для выполнения первого упражнения
Далее поместим на форму еще один объект TImage – Image4, в который загрузим изображение приседающего человечка (3.bmp). Свойство Visible у этого объекта должно равняться false. Чтобы организовать повторение приседаний, разместим на форме еще один таймер Timer2 с интервалом 500.
Рис. 19 Графический интерфейс проекта «Зарядка»
для выполнения двух упражнений
Аналогично добавим на форму изображение мяча в компоненте Image5 и компонент Timer3 с интервалом 100 для работы с мячом (рис. 20).
Рис. 20 Графический интерфейс проекта «Зарядка»
Создадим обработчик события OnTimer для компонента Timer1. Чтобы получить эффект мультипликации нужно организовать чередование видимости изображений человека с опущенными и поднятыми руками. Для этого введем переменную-индикатор n, которая может принимать последовательно значения 1 и 2. Если n = 1, то виден человек с опущенными руками. Если n = 2, то виден человек с поднятыми руками.
Текст программы обработчика события для Timer1 будет следующим:
Var |
Form1: TForm1; |
n:integer; |
… |
procedure TForm1.Timer1Timer(Sender: TObject); |
Begin |
n:=n+1; |
if n>2 then n:=1; |
if n = 1 then |
Begin |
Image1.Visible:=true; |
Image2.Visible:=false; |
end; |
if n = 2 then |
Begin |
Image2.Visible:=true; |
Image1.Visible:=false; |
end; |
end; |
Зададим число повторов (15 раз) для первого упражнения и организуем переход ко второму упражнению. Для этого введем еще одну переменную-индикатор k. При k =15 первый таймер должен прекратить свою работу, а второй таймер – начать.
Текст программы обработчика события для первого таймера с заданием числа повторов будет следующим:
Var |
Form1: TForm1; |
n, k: integer; |
… |
procedure TForm1.Timer1Timer(Sender: Tobject); |
Begin |
n:=n+1; |
k:=k+1; |
if n>2 then n:=1; |
if n = 1 then |
Begin |
Image1.Visible:=true; |
Image2.Visible:=false; |
end; |
if n = 2 then |
Begin |
Image2.Visible:=true; |
Image1.Visible:=false; |
end; |
if k =15 then |
Begin |
Timer1.Enabled:=false; |
Timer2.Enabled:=true; |
end; |
end; |
Аналогично составляется обработчик события для второго таймера. Только здесь при f = 15 должно исчезнуть изображение приседающего человека и появиться изображение мяча и человека с опущенными руками.
Var |
Form1: TForm1; |
n, k, g, f:integer; |
… |
procedure TForm1.Timer2Timer(Sender: TObject); |
Begin |
g:=g+1; |
f:=f+1; |
if g>2 then g:=1; |
if g = 1 then |
Begin |
Image1.Visible:=true; |
Image4.Visible:=false; |
end; |
if g = 2 then |
Begin |
Image4.Visible:=true; |
Image1.Visible:=false; |
end; |
if f =15 then |
Begin |
Timer2.Enabled:=false; |
Timer3.Enabled:=true; |
Image4.Visible:= false; |
Image5.Visible:= true; |
Image1.Visible:=true; |
end; |
end; |
Создадим обработчик для третьего таймера, который отвечает за движение мячика. Мяч должен лететь вниз, отскакивать от пола и возвращаться в исходное положение. Организовать движение мяча можно с помощью следующей конструкции: Image5.Top:=Image5.Top + 40. Если верхняя граница мяча плюс его высота будет больше, чем верхняя граница подставки, то свойство Image5.Top должно принять начальное значение. Число повторов упражнения с мячом задается аналогично.
Текст программы обработчика события для Timer3 будет следующим:
Var |
Form1: TForm1; |
n, k, g, f, m:integer; |
… |
procedure TForm1.Timer3Timer(Sender: TObject); |
Begin |
m:=m+1; |
Image5.Top:=Image5.Top+40; |
if (Image5.Top+Image5.Height)>Image3.Top then Image5.Top:=130; |
if m =15 then Timer3.Enabled:=false; |
end; |
Проект «Зарядка» можно усложнить, добавив новые упражнения.