- •1. Этапы создания программного обеспечения
- •1.1. Постановка задачи
- •1.2. Анализ, формальная постановка и выбор метода решения
- •1.3. Проектирование
- •8.1. Управление экраном в текстовом режиме.
- •8.2. Управление клавиатурой
- •8.3. Управление динамиком
- •8.5. Управление экраном в графическом режиме
- •8.7. Практикум. Создание движущихся изображений
- •Примеры Пример 8.7. Программа рисует человечка, делающего утреннюю зарядку.
- •Пример 8.10. Программа изображает планету, вращающуюся вокруг Солнца на фоне мерцающих звезд и расходящейся галактики.
- •Демонстрация
- •Создание иллюзии движения
8.3. Управление динамиком
Модуль crt также содержит процедуры, обеспечивающие управление динамиком.
1. Процедура Sound (f:word) - генерирует звук указанной частоты в Гц.
Для справки, основной гамме соответствуют следующие частоты: нота «до» основной октавы - 330 Гц, далее - 349 Гц, 370 Гц, 392 Гц, 415 Гц, 440 Гц, 466 Гц, 494 Гц, 523 Гц, 554 Гц, 588 Гц, 622 Гц и, наконец, нота «до» следующей октавы - 660 Гц. Частоты нот других октав кратны частотам основной.
2. Процедура NoSound - выключает динамик.
3. Процедура Delaу (t:word) - обеспечивает задержку на заданный интервал времени, мс.
Поскольку к настоящему моменту времени быстродействие компьютеров существенно возросло и изменились некоторые принципы их построения, процедура Delay не всегда обеспечивает корректную задержку, как видно из последующей программы. В этих случаях для организации задержки целесообразно использовать процедуру, которая читает реальное время.
4. Процедура GetTime (VarHour, Minute, Second, Sec100:word) – возвращает текущее время суток. Определена в модуле Dos.
Пример 8.3. Разработать программу проигрывания основной октавы.
Проигрывание гаммы осуществляется включением и выключением динамика с разными частотами.
Program ex;
Uses Crt;
Const f: array[1..13] of word = (330, 349, 370, 392, 415, 440,
466, 494, 523, 554, 588, 622, 660);
Var i:byte;
Begin for i:=1 to 13 do
begin
Sound(f[i]);
for j:=1 to 5000 do Delay(1000); {задержка ?!}
NoSound;
end;
End.
Чтобы не подбирать время задержки для конкретного компьютера, построим свою процедуру обеспечения требуемой задержки, использующую процедуру GetTime:
Program ex;
Uses Crt, Dos;
Procedure NewDelay(dTime:word);
Var key:boolean;
Hour, Min, Sec, Sec100, MyHour, MyMin, MySec, MySec100: Word;
Begin
GetTime(Hour, Min, Sec, Sec100); {узнаем текущее время}
{определяем время завершения задержки}
MySec100:=Sec100+dTime; MySec:=Sec+MySecl00 div 100;
MySec100:=MySec100 mod 100;
MyMin:=Min+MySec div 60; MySec:=MySec mod 60;
MyHour:=Hour+MyMin div 60; MyMin:=MyMin mod 60;
key:=false;
while not key do {цикл задержки}
begin
GetTime(Hour, Min, Sec, Sec100); {узнаем текущее время}
{проверяем, наступил ли заданный момент}
if (Ноиr>МуНоиr) or ((Ноиr=МуНоиr) and ((Min>MyMin) or
((Min=MyMin) and ((Sec>MySec) or
((Sec=MySec) and ((Sec100>=MySec100)))))))
then key:=true;
end
End;
Const f array[1..13] of word = (330, 349, 370, 392, 415, 440,
466, 494, 523, 554, 588, 622, 660);
Var i:byte; j:integer;
{описываем массив окон пунктов меню}
Const menu:array[1..4] of win=
((x1:5;y1:4;x2:15;y2:4;text: 'new '),
(x1:5;y1:5;x2:15;y2:5;text: 'open'),
(x1:5;y1:6;x2:15;y2:6;text: save'),
(x1:5;y1: 7;x2:15;y2:7;text: 'exit'));
{процедура рисования пункта меню}
Procedure DrawWin(w:win;attr:byte);
Begin
with w do
begin
TextAttr:=attr; {устанавливаем атрибут окна пункта}
Window(xl,у1,х2,у2); {устанавливаем окно пункта}
Clrscr; {высвечиваем окно пункта}
GotoXY(2,1); {устанавливаем курсор}
Write(text); {выводим название пункта}
end;
End;
{процедура рисования меню с выделенным пунктом npos}
Procedure DrawMenu(npos: integer);
Begin
Clrscr;
for i:=1 to 4 do
if i=npos then DrawWin(menu[i],94) {выводим выделенный пункт}
else DrawWin (menu[i], 30); {выводим невыделенный пункт}
End;
{основная программа}
Begin
npos:=1; {выделенный пункт меню}
DrawMenu(npos); {выводим меню}
repeat
ch1:=ReadKey; if ch1=#0 then ch2:=ReadKey;
case ch1 of
#0: case ch2 of
#72: begin {стрелка вверх}
if npos>1 then {если не верхний пункт}
begin
DrawWin(menu[npos],30); {убираем выделение текущего пункта меню}
npos:=npos-1; {переходим к предыдущему пункту}
DrawWin(menu[npos],94); {выделяем новый пункт}
end;
end;
Begin for i:=l to 13 do
begin
Sound(f[i]):
NewDelay(50);
NoSound;
end;
End.
