МИНИСТЕРСТВО НАУКИ
И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО
ОБРАЗОВАНИЯ
«ДОНСКОЙ
ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
(ДГТУ)
Колледж экономики,
управления и права
методические указания
для практического занятия
и самостоятельной работы студентов
по
дисциплине «Основы алгоритмизации и программирования»
тема:
МУЛЬТИПЛИКАЦИЯ В DELPHI
автор-составитель Шинакова С.В.
Ростов-на-Дону
2018
Рассмотрены на заседании ЦК
специальности 09.02.04 Информационные системы (по отраслям)
Методические рекомендации по
организации практических занятий
Дисциплина «Основы алгоритмизации и
программирования»
Автор-составитель С.В. Шинакова,
Колледж ЭУП ДГТУ, 2018 г.
В данных методических рекомендациях
представлены задания и пошаговые инструкции по разработке приложений с
мультимедиа, а также даны задания для самостоятельной работы студентов и
вопросы для самоконтроля.
МУЛЬТИПЛИКАЦИЯ В DELPHI
Цель
занятия: формирование навыка работы со
средой программирования Delphi
при создании простой мультипликации графическими средствами, при
воспроизведении звуков и видеоклипов.
Этапы
выполнения работы:
1.
Все студенты на занятии выполняют задание указанное
ниже.
2.
Дома студенты готовят ответы на вопросы для
самоконтроля.
3.
На следующем занятии каждый студент отвечает на
вопросы преподавателя. Вопросы касаются создания мультипликации.
Примечание
Под
мультипликацией
можно
понимать многократное перерисовывание изображения. Мультфильм представляет
собой совокупность множества кадров, каждый из которых немного отличается от
предыдущего, поэтому при быстром поочередном просмотре этих кадров возникает
иллюзия движения.
Задание
1
Создайте
форму, для свойства Caption которой задайте значение
«Движущаяся окружность». Поместите на форму компонент Timer из
палитры System.
1.
Создание нового проекта
|
File/New/VCL
Form Application
|
2.
Самостоятельно создать форму. Поместить компонент
Тimer. Для задания темпа смены кадров
присвойте свойству Timerl.Interval значение 50 мс (0,05 с).
|
3.
Для
запуска анимации создайте обработчик события OnActivate,
наступающего,
когда форма получает или теряет фокус, например, при щелчке по ней мышью.
|
ObjectInspector/
Form1/
Events/
двойной щелчок на пустом поле списка в
событии OnActivate
Добавьте
в раздел описания переменных переменные целого типа х
и
у
— координаты центра окружности и dx —
приращение координаты х при
движении окружности.
var
Form1: TForml:
х.у: byte; {координаты центра окружности}
dx: byte; {приращение координаты х при движении окружности}
Отредактируйте
текст процедуры следующим образом:
procedure TForml.FormActivate(Sender: TObject);
begin
x:=0; {начальная позиция рисунка}
y:=30;
dx:=3; {шаг
изменения координаты х}
Timerl.Interval:=50; {период
возникновения события OnTimer - 0.5 сек}
Forml.Canvas.Brush.Color:=Forml.Color; {цвет
окраски канвы}
end;
|
|
4.
Создайте процедуру обработчика события OnTimer
|
ObjectInspector/
Timer1/
Events/
двойной
щелчок на пустом поле списка в событии Timer1Timer
В
тело процедуры добавьте вызов процедуры рисования Ris
Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
Ris;
End;
Так
как процедура должна быть описана до ее вызова, то выше этой процедуры в
тексте программного модуля опишите процедуру рисования Ris:
procedure Ris; {рисование}
begin
Forml.Canvas.Pen.Color:=Forml.Color; {задать перу цвет формы}
Forml.Canvas.Ellipse(x, у, х+20, у+20); {стереть окружность – нарисовать ее цветом формы}
x:=x+dx; {перейти в следующую позицию}
Forml.Canvas.Pen.Color:=clBlack; {задать перу черный цвет}
Forml.Canvas.Ellipse(x, у, х+20,
у+20); {нарисовать окружность на новом месте}
end;
|
|
5.
Полный
текст программного модуля будет выглядеть следующим образом:
|
unit main;
interface
uses
Windows, Messages, SysUtils,
Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TForml = class(TForm)
Timerl: TTimer;
procedure
TimerlTimer(Sender: TObject);
procedure
FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
End;
var
Forml: TForml;
x.y: byte:
{координаты
центра окружности}
dx: byte;
{приращение координаты
x при движении окружности}
implementation
{SR *.DFM}
procedure Ris;
begin
Forml.Canvas.Pen.Color:=Fortnl.Color;
Forml.Canvas.EllipseCx.у,х+20,у+20);
x:=x+dx;
Forml.Canvas.Pen.Color:=clBlack;
Forml.Canvas.Ellipse(x,у,х+20,у+20);
end;
procedure TForml.TimerlTimer(Sender:
TObject);
begin
Ris;
end;
procedure
TForml.FormActivateCSender: TObject);
begin
x:=0; y:=30; dx:=3; Timerl.Interval:=50;
Forml.Canvas.Brush.Color:=Forml.Color;
end;
end.
|
|
6.
Сохранение изменений
|
Save All
|
|
7.
Запустите
приложение на исполнение
|
Run
|
|
|
|
|
|
Замечание: чтобы не
было мерцания используется буферизация изображения – рисование очередного кадра
производится не на холсте, а на канве невидимого компонента типа Bitmap, а затем
готовый рисунок переносится на видимый холст методами Draw или CopyRect.
Задание
2
Создайте
приложение-мультипликацию, в котором на фоне снежных гор летит самолет. В
качестве значка приложения используйте рисунок самолета.
1.
Создание нового проекта
|
File/New/VCL
Form Application
|
2.
Расположение
окна приложения
|
Object
Inspector/ Position /poScreenCenter
|
3.
Оформление
формы
|
Form1/ Caption/ «Полет
самолета»
Поместите на
форму компоненты Timer и Image.
Image1.Align/ alClient
(компонент занимает всю клиентскую область контейнера и во время выполнения
приложения его размеры изменяются при изменении размеров контейнера)
Timer1Interval/ 100 мс
(0,1 с) – темп смены кадров
|
4.
Сохранение
|
Файл проекта – airplane
Файл модуля – main
|
5.
Описание
переменных добавить в раздел переменных модуля
|
Back, bitmap, buf: TBitmap;
{фон, картинка, буфер}
BackRect, bitmapRect, BufRect: TRect;
{область фона, картинки, буфера}
х,y : integer; {координаты
левого верхнего угла картинки}
W, H: integer; {размеры картинки
– ширина, высота}
|
6.
Создание
кода – обработчика события для запуска анимации
|
procedure TForml.FormActivate(Sender: TObject);
begin
Back := TBitmap.Create; {фон}
bitmap := TBitmap.Create; {картинка}
Buf := TBitmap.Create; {буфер}
{загрузить и вывести фон из файла Backgraund.bmp}
Back.LoadFromFilе('Backgraund.bmp');
Form1.Imagel.Canvas.Draw(0,0,Back);
{загрузить
изображение самолета, которое будет двигаться}
bitmap.LoadFromFi1е('aplane.bmp');
bitmap.Transparent := true;
bitmap.TransParentColor := bitmap.Canvas.Pixels[1.1];
{создать буфер для
созранения копии области фона, на которую накладывается картинка}
W:= bitmap.Width;
Н:= bitmap.Height;
Buf.Width:= W;
Buf.Height:=H;
Buf.Palette:=Back.Palette; {обеспечить соответствие палитр}
Buf.Canvas.CopyMode:=cmSrcCopy;
BufRct:=Bounds(0,0,W,H);
x:=-W;
y:=20;
BackRct:=Bounds(x.y,W,H); {определить сохраняемую область фона}
Buf.Canvas.CopyRect(BufRct, Back.Canvas,BackRct); {сохранить ее} end;
|
7.
Для получения
эффекта мультипликации создайте процедуру обработчика события OnTimer
следующим образом:
|
Выберите
в окне Инспектора объектов объект Timerl и на
странице Events произведите двойной щелчок на пустом поле списка
в событии TimerlTimer.
Отредактируйте
тело процедуры обработчика события:
procedure TForml.TimerlTimer(Sender: TObject);
begin
Forml.Imagel.Canvas.Draw(x, y, Buf); {восстановлением фона (из буфера) - удалить рисунок}
х:=х+2; {смещение самолета по оси х}
if x>Forml.Imagel.Width then X:=-W; {если самолет "вылетел" за пределы рисунка фона}
BackRct:=Bounds(x, y, W, H); {определить сохраняемую область
фона}
Buf.Canvas.CopyRect(BufRct,Back.Canvas, BackRct); {сохранить ее копию}
Forml.Imagel.Canvas.Draw(x,у,bitmap); {вывести рисунок
самолета в новой позиции}
end;
|
8.
Для освобождения памяти от переменных, в которых хранились значения фона, рисунка самолета и буфера с фрагментом фона, создайте процедуру
обработчика события закрытия окна приложения
|
Для этого выберите в окне Инспектора объектов объект Forml и на странице Events произведите двойной щелчок на пустом поле
списка в событии OnClose.
Вставьте в тело
процедуры обработчика события вызов метода Free для освобождения памяти, динамически
выделенной под объекты Back, bitmap и Buf.
procedure
TForml.FormClose(Sender: TObject; var Action: TCloseAction); begin
Back.Free; {освободить память}
bitmap.Free;
Buf.Free;
end;
|
9.
Сохранение
изменений
|
Save All
|
10.
Запустите
приложение на исполнение
|
F9
|
ВОСПРОИЗВЕДЕНИЕ
ЗВУКА
Наиболее простой процедурой, управляющей
звуком, является процедура Веер. Она не
имеет параметров и воспроизводит стандартный звуковой сигнал, установленный в Windows, если
компьютер имеет звуковую карту и задан стандартный сигнал (он устанавливается
в Панели управления Windows после щелчка мышью по значку Звук). Если
звуковой карты нет, или стандартный сигнал не установлен, звук воспроизводится
через динамик компьютера в виде короткого щелчка.
Более
серьезной функцией является MessageBeep. Она определена как
Function
MessageBeep(uType:word):boolean;
Параметр uType указывает воспроизводимый звук как
идентификатор раздела [sounds] реестра, в котором записаны звуки,
сопровождающие те или иные события в Windows. С помощью приложения Звук в Панели управления
Windows пользователь может удалить или установить соответствующие звуки. Для
параметра uType определены следующие константы:
Значение
|
Звук
|
mb_iconasterisk
|
Звездочка
|
mb_iconexclamation
|
Восклицание
|
mb_iconhand
|
Критическая
ошибка
|
mb_iconquestion
|
Вопрос
|
МВ_ОК
|
Стандартный
звук
|
После инициализации воспроизведения звука
функция MessageBeep возвращает управление в точку вызова и
воспроизведение звука производится асинхронно. Если функция MessageBeep не находит указанный тип звука, она пытается
воспроизвести стандартный звук. Если и он не установлен или если компьютер не
снабжен звуковой картой, то звук воспроизводится через динамик компьютера.
При успешном завершении функция возвращает
ненулевое значение (true). Если функция вернула нулевое значение, то
получить информацию об ошибке можно с помощью вызова GetLastError.
Задание 3
Создайте приложение, которое позволит
прослушать стандартные звуки Windows. Для выбора воспроизводимого звука
используйте переключатели, размещенные в панели Radio-Group.
1. Создание
нового проекта
|
File/New/VCL Form Application
|
2.
Создание кода – обработчика события
|
procedure
TForml.ButtonlClick(Sender: TObject); begin
Case RadioGroupl.ItemIndex of {выбор варианта звука}
0 : Веер; {стандартный звуковой сигнал}
1
: MessageBeep(MB_ICONASTERISK); {звездочка}
2
: MessageBeep(MB_ICONEXCLAMATION); {восклицание}
3
: MessageBeep(MB_ICONHAND); {критическая ошибка}
4 : MessageBeep(MB_ICONQUESTION); {вопрос}
else
MessageBeep(MB_OK); {стандартный звук Windows}
end;
end;
|
3.
Сохранение изменений
|
Save All
|
4. Запустите
приложение на исполнение
|
Run
(F9), Alt+F4
|
Функция
PlaySound
Функция PlaySound
воспроизводит указанный волновой файл, или звук системного события, или звук
из ресурса. Функция PlaySound
определена следующим образом:
function PlaySound(pszSound:PChar; hmod:HINST; fdwSound:Cardinal) :boolean;
Параметр pszSound представляет
собой строку с нулевым символом в конце и определяет воспроизводимый звук. В
зависимости от значения флага fdwSound (SND_FILENAME, SND_ALIAS или SND_RESOURCE), параметр pszSound может
определять имя волнового файла, псевдоним системного события или идентификатор
ресурса. Если ни один из этих флагов не указан, то функция ищет в реестре Windows или в
файле Win.ini
указанное имя звука. Если звук найден, он воспроизводится, иначе – параметр pszSound
интерпретируется как имя файла. Если параметр pszSound равен 0, то
воспроизведение любого волнового файла прерывается. Для прерывания
воспроизведения звука, не связанного с волновым файлом, следует указать SND_PURGE в
параметре fdwSound.
Параметр hmod
используется только при параметре fdwSound, равном – SND_RESOURSE. В этом
случае hmod является
дескриптором исполняемого файла, содержащего ресурс, который должен
загружаться. Иначе hmod=0.
Задание 4
Создайте
приложение, которое позволит прослушивать музыкальные файлы, открывая их с
помощью OpenDialog
1. Создание приложения
|
Создайте форму и
задайте для ее свойства Caption значение «Прослушивание звуковых
файлов».
|
2. Изменение свойств компонентов формы
|
Поместите в
любое место формы компонент OpenDialog из палитры Dialogs и
задайте для свойства OpenDialog1.Title значение
«Открыть звуковой файл», которое будет отображаться в заголовке диалогового
окна открытия файла.
Задайте для
свойства OpenDialog1.Filter в
поле FilterName значение
«звуковые файлы *.wav», а в
поле Filter –
значение «*.wav».
Поместите на
форму компонент Button и
задайте для его свойства Caption значение «Прослушать».
|
3. Создание кода обработчика события - щелчка мышью на кнопке Buttonl
|
TForml. Button1Click(Sender: TObject);
Так как в
процедуре обработки нажатия кнопки Button1 используется
вызов функции PlaySound, то
следует включить в раздел описания Uses вызов модуля mmSystem.
Использование OpenDialog1 для
открытия звукового файла реализуется при помощи оператора
if OpenDialogl.Execute
then
PlaySound(PChar(OpenDialogl.FileName),
0, SND_ASYNC);
где параметр SND_ASYNC указывает
на асинхронное воспроизведение звука.
|
4. Сохраните файлы проекта и модуля в папке «Прослушивание звуковых файлов»
|
Save all
|
5. Откомпилируйте и запустите приложение.
|
Щелчком мышью на кнопке Послушать в
окне приложения откройте диалоговое окно Открыть звуковой файл, в котором
выберите звуковой файл, например в папке C:\Windows\Media
|
Примечание: функция PlaySound позволяет
воспроизводить и системные звуки, просто называя их псевдонимы. Например,
оператор PlaySound('SystemStart',0, SND_ASYNC); воспроизведет
тот же звук, что и приведенный ранее оператор, указывавший имя файла и путь к
нему. Оператор PlaySound('C:\Windows\ Меdiа\ Звук Microsoft. wav', 0, SND_ASYNC or SND_LOOP); многократно
асинхронно воспроизводит стандартный звук Microsoft, начиная
воспроизведение снова и снова, как только оно заканчивается.
Примечание: если вы
ввели в свое приложение подобный оператор, то следует предусмотреть какую-нибудь
кнопку, по которой воспроизведение прерывается заданием нового звука или
выполнением оператора PlaySound(0,0, SND_PURGE);.
ВИДЕОКЛИПЫ - КОМПОНЕНТ ANIMATE
Для воспроизведения стандартных видеоклипов Windows (типа
копирования файлов, поиска файлов и т. п.) и не сопровождаемых звуком видеофайлов
формата *.avi (Audio Video Interleaved) используется компонент типа TAnimаte. Эти файлы представляют собой последовательность
кадров битовых матриц. Они могут содержать и звуковую дорожку, но компонент Animate способен воспроизводить только немые клипы AVI. Он работает
только с файлами AVI, не использующими сжатие, или с клипами AVI, сжатыми с
использованием технологии RLE (run-length encoding).
Задание 5
Создайте
приложение, которое позволит проигрывать стандартные клипы Windows и видеоклипы
формата *.avi, открывая их с помощью OpenDialog.
1. Создание
нового проекта
|
File/New/VCL Form Application
|
2. Изменение
свойств компонентов формы
|
Form1/ Caption/ «Воспроизведение
видеоклипов без звуков»
Вверху формы разместить компонент Label1,
свойство Caption очистить
OpenDialog1.Title/ «Открыть файл
видеоклипа»
OpenDialog1.Filter/ «видеоклип (*.avi)|*.avi)»
Поместите 3 кнопки Button/ задайте
им имена - BtWind, BtStop, BtFile
Задайте для свойств Caption этих
кнопок значения «Клипы Windows», «Стоп», «Клип
из файла»
Animate1/ Visible/ False
|
3. Расположение окна приложения
|
Object
Inspector/ Position /poScreenCenter
|
4. Создание обработчика щелчка на кнопке BtWind
|
Var
Forml: TForml;
I : byte;
Отредактируйте текст процедуры
TForml.BtWindClick следующим образом:
procedure TForml.BtWindClick(Sender: TObject);
begin
Animatel.Visible:=True; {сделать видимой область анимации}
I:=1; {указывает
на первый клип Windows}
Animatel.CommonAVI:=aviFindFolder;
{воспроизвести первый стандартный клип - поиск в папке}
Label1.Caption:
= 'Клип Windows: поиск в папке';
Animatel.Active:=True; {активизировать анимацию}
End;
|
5. Создайте процедуру обработчика щелчка мышью
на кнопке BtStop
|
procedure TForml.BtStopClick(Sender:
TObject);
begin
Animatel.Stop; {вызов процедуры смены стандартного видеоклипа Windows}
end;
|
6. Процедуру смены стандартного видеоклипа Windows
реализуйте в виде процедуры обработчика события окончания воспроизведения
видеоклипа OnStop
|
procedure TForml.AnimatelStop(Sender: Tobject);
begin
Inc(I); {увеличить счетчик клипов}
with Animatel do
begin
case I of
2: begin
CommonAVI:=aviFindFi1e;
Labell.Caption:='Kлип Windows: поиск файла';
end;
3: begin
CommonAVI:=avi FindComputer;
Label
1.Caption: = 'Клип Windows: поиск компьютера';
end;
4: begin
CommonAVI:=avi
CopyFi1es:
Label 1.Caption: = 'Клип Windows: копирование файлов';
end;
5: begin
CommonAVI:=aviCopyFile;
Labell.Caption: = 'Клип Windows: копирование файла';
End;
6: begin
CommonAVI:=aviRecycleFile;
Label 1.Caption: = 'Клип Windows: удаление файла в корзину';
end;
7: begin
CommonAVI:=aviEmptyRecycle;
Labell.Caption: = 'Клип Windows: очистка корзины';
end;
8: begin
CommonAVI:=aviDeleteFile;
Labell.Caption:='Клип Windows: удаление файла;
end;
end;
if I<9 then Active:=True
else
begin
Visible:=False;
Label1.Caption:=’’; {очистить поле показа клипов}
end;
end;
end;
|
7. Для воспроизведения видеоклипов из файлов
формата *.avi создайте процедуру обработчика щелчка мышью
на кнопке BtFile
|
procedure TForml.BtFi1eClick(Sender: TObject);
var
FName : string; {переменная для
хранения части имени файла}
begin
if OpenDialogl.Execute then
with Animatel do
begin
I:=9;
Fi1eName:=OpenDialog1.FileName;
FName:=FileName;
repeat {удалить часть имени до '\'}
Delete(FName, l, Pos('\', FName));
until Pos(‘\’, FName)=0;
Visible:=True;
Label1.Caption:='Kлип из файла '+FName;
Active:=True;
end;
end;
|
8.
Сохранение изменений
|
Save All
|
9. Запустите приложение на исполнение
|
F9
|
Универсальный проигрыватель аудио- и видеоинформации MediaPlayer
Для проигрывания аудио
и видеоинформации в Delphi (начиная с Delphi 2) имеется
универсальный проигрыватель аудио- и видеофайлов — MediaPlayer. Этот компонент по
умолчанию входит в состав палитры System и инкапсулирует интерфейс управления
носителями (Media Control Interface, MCI) Windows 95 и Windows NT. MediaPlayer имеет ряд кнопок,
управляющих такими устройствами мультимедиа, как CD-ROM и др., управляемых
мышью.
Кнопка
|
Значение
|
Действие
|
Play
|
btPlay
|
Воспроизведение
|
Pause
|
btPause
|
Пауза воспроизведения или записи (если проигрыватель
в момент щелчка уже находится в состоянии паузы, то воспроизведение или
запись возобновляется)
|
Stop
|
btStop
|
Останов
воспроизведения или записи
|
Next
|
btNext
|
Переход
на следующий трек или на конец записи
|
Prev
|
btPrev
|
Переход
на предыдущий трек или на начало записи
|
Step
|
btStep
|
Перемещение
вперед на заданное число кадров
|
Back
|
btBack
|
Перемещение
назад на заданное число кадров
|
Record
|
btRecord
|
Начало
записи
|
Eject
|
btEject
|
Освобождение
объекта, загруженного в устройство
|
Проигрыватель может управляться как кнопками,
так и непосредственно при помощи соответствующих этим кнопкам методов (Play, Pause, Stop, Next, Previous, Step, Back, StartRecording, Eject). В этом случае сам компонент TMedia-Player может быть сделан невидимым.
Тип устройства мультимедиа (dtWaveAudio или dtVideodisc) определяется свойством DeviceType. Если устройство хранит объект воспроизведения в
файле, то имя файла задается свойством FileName. Если свойство DeviceType задано равным dtAutoSelect, то проигрыватель пытается определить тип
устройства, исходя из расширения имени файла FileName. Если для свойства AutoOpen установлено значение true, то проигрыватель пытается открыть устройство,
указанное свойством DeviceType, автоматически во время своего создания в процессе
выполнения приложения.
ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
1.
Что такое анимация?
Какими способами можно создать в приложении Delphi
анимированное изображение?
2. Каково отличие звуковых файлов форматов *.wav и *.midi?
3. Сравните возможности функций Веер,
MessageBeep и PlaySound.
4. Сравните назначение и возможности компонентов Animate и MediaPlayer.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
1.
Создайте приложение,
в окне которого отображается анимация — движение мяча, брошенного под углом к
горизонту.
2.
Создайте
приложение-мультипликацию, в котором на фоне дороги перемещается автомобиль
(вариант: на фоне звездного неба перемещается космический корабль).
3.
Создайте приложение,
которое позволит прослушивать звуковые файлы формата *.wav, открывая их
с помощью диалогового окна Открыть звуковой файл, вызываемого командой Файл
► Открыть. Для завершения
работы приложения используйте команду Выход в главном меню.
СПИСОК
ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1.
Попов
В.Б. Паскаль и Дельфи. Самоучитель – СПБ.: Питер, 2004. – 544с.
2.
Юнита5.
Система программирования Delphi. Москва, 1999. – 139 с.
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.