Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
InvalidateRect(Handle, nil, False); end;{TimerTimer}
procedure TfrmAirPlane.CalcNewCoord(var newX, newY: Integer); var dx, dy:Integer;
begin randomize; dx:=random(20); randomize; dy:=random(20);
if dx>10 then dx:=10-dx; if dy>10 then dy:=10-dy;
if newX+dx+Mask.Width<Width then newX:=newX+dx else newX:=Width-Mask.Width;
if newY+dy+Mask.Height<ClientHeight then newY:=newY+dy else newY:=ClientHeight-Mask.Height;
if newX<0 then newX:=0; if newY<0 then newY:=0;
end;{CalcNewCoord}
procedure TfrmAirPlane.FormDestroy(Sender: TObject); begin
//уничтожение созданных растров
Background.Free;
Mask.Free;
Sprite.Free; end;{FormDestroy} end.{UPlane}
Запустите программу. Обратите внимание, что изображение самолета при анимации не мерцает. Плавность движения спрайта будет зависеть лишь от частоты прорисовки спрайтов.
Для хранения нескольких спрайтов одинаковых размеров удобно использовать компонент TImageList.
Этот компонент не имеет собственного холста, но может вывести изображение на любой предоставленный ему холст. Основной метод компонента для вывода изображений Draw имеет следующий синтаксис
procedure Draw(Canvas: TCanvas; X, Y, Index: Integer; Enabled: Boolean=True);
гдеCanvas – холст, на который выводится изображение; x, y – координаты для вывода изображения;
Enabled – если равно False, то выводится в серых полутонах (вид запрещенной кнопки)/
Значение свойства ImageType отвечает за то, как будет интерпретироваться изображение, как маска спрайта (itMask) или как изображение (itImage).
Обратите внимание, что для изображений помещенных в компонент TImageList не нужно сначала выводить маску спрайта, а затем сам спрайт. Достаточно указать «прозрачный» цвет при загрузке изображения в список (для bmp файлов, для ico файлов этого делать не нужно, т.к. информация о прозрачных областях хранится в самом файле) (рисунок 7).
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Рисунок 7 – Выбор «прозрачного» цвета для изображения.
Иногда требуется воспроизвести короткий звуковой сигнал для привлечения внимания пользователя программы – например, после завершения длительного по времени процесса обновления данных. Стандартная для Delphi процедура без параметров Beep извлекает сигнал из системного динамика только в том случае, если компьютер не оснащен звуковой картой. С другой стороны, мощные возможности компонента TMediaPlayer кажутся излишними для решения этой задачи на компьютерах, оснащенных звуковой картой. В этом случае может пригодиться API-функция MessageBeep, с помощью которой в 32разрядных версиях Windows озвучиваются стандартные диалоговые окна.
function MessageBeep(idSound: word): Boolean;
Единственным параметром обращения к этой функции является один из идентификаторов стандартного звука приведенных в таблице 1.
Таблица 1 – Идентификаторы для стандартных звуков
Значение |
Описание |
|
|
-1 |
Игнорирует звуковую карту и извлекает короткий звуковой сигнал |
|
из системного динамика |
mb_IconAsterisk |
Произошла ошибка |
mb_IconExclamation Произошла ошибка
mb_IconHand |
Запрос на выбор параметра |
mb_IconQuestion |
Запрос подтверждения |
mb_Ok |
Успешное завершение операции |
Сразу после обращения функция возвращает управление программе и воспроизводит звук асинхронно.
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Значительно более богатые возможности по проигрыванию звуковых файлов имеет функция PlaySound, которая способна воспроизводить любые звуковые клипы.
Объявление функции имеет следующий вид:
function PlaySound(pszSound: PChar; hmod: HINST; fdwSound:Cardinal): Boolean;
гдеpszSound – имя воспроизводимого файла;
hmod – дескриптор программы, если звук берется из ресурсного файла противном случае содержит 0);
fdwSound – параметр, уточняющий воспроизведение.
Параметр fdwSound может принимать значения или их комбинацию приведенные в таблице 2.
Таблица 2 – Некоторые возможные значения параметра fdwSound.
Значение |
Описание |
|
|
SND_ASYNC |
Звук воспроизводится асинхронно (функция возвращает управление |
|
сразу после обращения к ней) |
SND_LOOP |
Звук воспроизводится постоянно до тех пор, пока не вызвана та же |
|
функция с параметром pszSound, равным ‘’ |
SND_NOSTOP |
Функция пытается воспроизвести звук, если устройство не занято; в |
|
противном случае не воспроизводит ничего (если устройство |
|
занято, но этот параметр не указан, функция прервет |
|
воспроизведение предыдущего звука и начнет воспроизведение |
|
следующего) |
SND_NOWAIT |
Если устройство занято, функция не будет воспроизводить новый |
|
звук |
SND_PURGE |
Прекращает воспроизведение всех звуков для данной задачи |
SND_SYNC |
Воспроизводит звук синхронно и возвращает управление только |
|
после окончания его воспроизведения |
SND_NODEFAULT |
Отменить проигрывание звука по умолчанию. Если указанный |
|
звуковой файл не найден, PlaySound завершает работу без |
|
проигрывания звука по умолчанию. |
SND_MEMORY |
Звуковой файл загружен в ОЗУ. Параметр fdwSound должен |
|
содержать указатель на звуковые данные. |
SND_APPLICATION Звук проигрывается с использованием приложения ассоциированного с этим файлом
SND_ALIAS |
Параметр fdwSound содержит идентификатор системного события |
|
описанного в реестре или в файле Win.ini. Нельзя использовать |
|
совместно с SND_FILENAME или SND_RESOURCE |
SND_RESOURCE |
Параметр fdwSound содержит идентификатор ресурса, параметр |
|
hmod должен содержать дескриптор загруженного экземпляра |
|
ресурса. |
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Параметр fdwSound может содержать несколько опций одновременно (для объединения используется логическая операция or). В случае успешного выполнения результат возвращаемый функцией равен True, иначе False.
Рассмотрим несколько простых примеров использования функции PlaySound. Озвучим программу, приведенную в листинге 1.
Добавьте в список модулей модуль mmSystem. Измените, обработчик OnCreate формы как показано ниже
procedure TfrmAirPlane.FormCreate(Sender: TObject); begin
//двойная буферизация
DoubleBuffered:=True; //загрузка изображений
LoadImages; //расчет координат
CalcNewCoord(x, y); //включаем звук
PlaySound('ir_inter.wav', 0, SND_LOOP or SND_ASYNC); end;{FormCreate}
Параметр fdwSound содержит флаг SND_LOOP поэтому звук будет повторяться бесконечно. Кроме того установка флага SND_ASYNC приводит к асинхронному выполнению функции PlaySound, т.е. звук будет воспроизводится в фоновом режиме (параллельно с основной программой).
Измените обработчик события OnDestroy формы как показано ниже.
procedure TfrmAirPlane.FormDestroy(Sender: TObject); begin
//уничтожение созданных растров
Background.Free;
Mask.Free;
Sprite.Free;
//проигрываем стандартный звук при выходе из системы
PlaySound('SystemExit', 0, SND_SYNC); end;{FormDestroy}
В данном примере проигрывается стандартный звук, проигрываемый при выходе из операционной системы. Обратите внимание на то, что звук проигрывается в синхронном режиме (SND_SYNC). Это необходимо для того, чтобы приложение было выгружено из памяти после завершения проигрывания звука. Если попытаться проиграть звук в асинхронном режиме, то сразу после вызова функции PlaySound, до завершения ее работы, управление получит основная программа которая завершит свое выполнение. При этом будет принудительно остановлено выполнение функции PlaySound и звук, скорее всего, не будет воспроизведен.
При воспроизведении стандартных звуков необходимо чтобы была настроена звуковая схема. Сделать это можно в панели управления с помощью раздела «Звук и мультимедиа» (рисунок 8).
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Рисунок 8 – Панель управления
Настроить звуковую схему можно на вкладке «Звуки» раздела «Звук и мультимедиа» (рисунок 9). Если событию не сопоставлен ни один звук, то функция PlaySound воспроизведет звук по умолчанию.