Basic - вводный курс


         

Экранные режимы: оператор SCREEN

Наиболее распространены сейчас видеосистемы VGA, а более всего SVGA. Поэтому рассматривать мы будем только их. Во многих школах, конечно, все еще можно встретить разношерстные HGA, CGA, EGA, но не будем ориентироваться на прошлое.
Основными характеристиками видеосистемы являются ее разрешение, т. е. количество экранных точек (что определяет качество выводимого изображения) и количество отображаемых цветов и оттенков. Для видеосистем VGA и SVGA характеристики перечислены в табл. 3.1.

Таблица 3.1. Характеристики видеосистем



Адаптер Разрешение Количество цветов
VGA (Video Graphics Array) 640x480 256
SVGA (Super Video Graphics Array) до 1024x1024 До 16 миллионов

При запуске Бейсика автоматически загружается текстовый экранный режим screen о. А далее адаптеры VGA и SVGA поддерживают режимы, представленные в табл. 3.2. Воспользовав шись этой таблицей, вы сможете устанавливать графический режим с помощью оператора screen.

Таблица 3.2. Экранные режимы для адаптеров VGA и SVGA

Номер режима
Разрешение
Количество цветов
0
текстовый режим
16
1
320x200
4
2
640x200
2
7
320x200
16
8
640x200
16
9
640x350
16
10
640x350
2
11
640x480
2
12
640x480
16
13
320x200
256

Цвет символов и цвет фона: оператор COLOR

Оператор color имеет следующий синтаксис:

COLOR N1, N2

Предназначен он для изменения цвета символов на N1, а цвета фона (т. е. экрана) — на N2. Если в записи оператора опустить параметр ni, to он будет записываться так:

COLOR , N2

и станет изменять только цвет фона. Например:

CLS
SCREEN 9
FOR N2 = 0 ТО 15
COLOR , N2
SLEEP I NEXT N2

Запустив данную программу, вы увидите с паузой в 1 секунду все возможные цвета из табл. 3.3, в которые будет окрашен фон.
Если опустить параметр N2, то оператор color будет менять только цвет символов. Например:

SCREEN 9
FOR I = О ТО 15
COLOR I
PRINT I NEXT I

Таблица 3.3. Возможные цвета

Номер Цвет
0 Черный
1 Синий
2 Зеленый
3 Голубой
4 Красный
5 Фиолетовый
6 Коричневый
7 Светло-серый
8 Темно-серый
9 Светло-синий
10 Светло-зеленый
11 Светло-голубой
12 Светло-красный
13 Васильковый
14 Желтый
15
Ярко-белый

Движущиеся изображения: операторы GET и PUT

Простой способ "оживить" экран состоит в исполнении операторов get и put. Они позволяют "снять" изображение с части экрана и повторить его в другом месте. Это происходит очень быстро, поскольку исходная фигура не перерисовывается теми графическими операторами, которыми она вначале была создана, а просто дублируются все ее точки.
Представленная ниже программа рисует блоху, которая "скачет" по экрану, т. к. сначала оператор get сохраняет ее изображение, а затем оператор put копирует это изображение в любое заданное место экрана. Ощущение движения возникает из-за того, что перед каждым "прыжком" блохи ее старое изображение стирается.

CLS
SCREEN 9
COLOR 9, 1
REM Рис.ание блохи
DRAW "C2 L20 U20 R20 D20 F10 D10 R2"
DRAW "BM300,175 C2 G10 D10 L2"
DRAW "ВМ300Д55 С2 НЮ ЕЮ L2"
DRAW "BM320,155 C2 ЕЮ НЮ R2"
DRAW "ВМ310Д55 С2 U4"
DRAW "ВМ307,151 С2 RIO H6 G6"
PAINT (310, 170), 2, 2
BYTES = INT((55 *2+7)/8)*60
DIM BUG(BYTES)
GET (285, 135)-(340, 195), BUG
CLS
PUT (250, 80), BUG: SLEEP 1
PUT (250, 80), BUG: SLEEP 1
PUT (30, 60), BUG: SLEEP 1
PUT (30, 60) , BUG: SLEEP 1
PUT (460, 130) , BUG : SLEEP 1
PUT (460, 130) , BUG : SLEEP 1
PUT (180, 70), BUG: SLEEP 1
PUT (180, 70), BUG: SLEEP 1
PUT (300, 70), BUG: SLEEP 1
END

Оператор GET

Прежде чем выполнить оператор get, нужно провести важную подготовительную работу: определить местоположение и размер той области экрана, которую вы хотите снять. Большую помощь в этом вам окажет предварительный набросок на миллиметровой бумаге, где каждый квадратик сопоставляется с точкой экрана.
Оператор get запоминает в массиве изображение заданной области экрана. Поэтому нужно заранее описать массив оператором dim. Существует формула, определяющая требуемую длину массива исходя из размеров запоминаемой области и режима работы экрана. Формула для средней разрешающей способности экрана такова:

INT ( (число точек по горизонтали * 2 + 7) /8) * число точек по вертикали

Формула для высокой разрешающей способности экрана:

INT {(число точек по горизонтали + 7) /8) * число точек по вертикали

В строке программы, содержащей присваивание переменной bytes, подсчитывается длина массива, необходимая для изображения блохи при средней разрешающей способности. Рис.ок занимает примерно 55 позиций по .горизонтали и 60 — по вертикали. Результат вычисления определяет длину массива bog в следующей строке.

Оператор

GET (285, 135)-(340, 195), BUG

переписывает в массив bug содержимое прямоугольной области экрана, левый верхний угол которой совпадает с точкой (285, 135), а правый нижний — с точкой (340, 195).

Оператор PUT

Теперь уже совсем просто "посадить" блоху в любое место экрана. Это делается с помощью оператора put. В строках, следующих за оператором get программы, содержимое массива bug размещается на экране с той позиции, которая указана в операторах put. Так, оператор

PUT (250, 80), BUG

накладывает содержимое области экрана, снятое с помощью get, на прямоугольник, левый верхний угол которого находится в точке (250, 80). Эффект наложения таков, что если два одинаковых оператора put следуют подряд, то второй нейтрализует действие первого: изображение сначала рисуется, а затем стирается. Таким образом, несколько сдвоенных операторов put создают иллюзию движения изображения.
Дополнительный параметр оператора put определяет способ наложения рисуемого изображения с тем, что уже есть на экране. Оператор с параметром pset

PUT (250, 80), BUG, PSET

игнорирует прежнее изображение в данной области экрана. Оператор

PUT (250, 80), BUG, PRESET

действует так же, но рисует негативное изображение, а оператор

PUT (250. 80), BUG, XOR

действует так же, как оператор без последнего параметра. Два таких оператора, следующих подряд, рисуют и тут же стирают изображение, оставляя экран неизменным.
Оператор

PUT (250, 80), BUG, AND

оставляет только общую часть нового и старого изображения. Оператор

PUT (250, 80), BUG, OR

"добавляет" изображение к тому, что уже есть на экране. Поэкспериментируйте с оператором put и постарайтесь использовать предоставляемые им возможности.


Цвет точки экрана: функция POINT

Вы можете определить, какой цвет имеет в данный момент любая точка экрана, задав ее координаты в виде аргумента функции point (x,y). Например:

SCREEN 9
LINE (0, 0)-(100, 100), 4
LOCATE 10, 1 FOR у = 1 ТО 10
FOR X = 1 ТО 10
PRINT POINT(x, у);
NEXT x
PRINT NEXT у

Данная программа рисует линию зеленого цвета по диагонали, начиная с верхнего левого угла, а затем во вложенных циклах поточечно сканирует область от точки с координатами (1, 1) до точки с координатами (10, 10) и выдает на экран массив составляющих ее цветов. Он будет выглядеть следующим образом:

2000000000
0200000000
0020000000
0002000000
0000200000
0000020000
0000002000
0000000200
0000000020
0000000002


Одиночный звуковой сигнал: оператор ВЕЕР

Звуковое оформление можно осуществить с помощью оператора веер. Это, вероятно, самый простой, но весьма полезный оператор Бейсика. Он вызывает звуковой сигнал из динамика — гудок продолжительностью четверть секунды — и обеспечивает тот же эффект, что и оператор print chr$(7). Несколько таких гудков подряд дадут длительный сигнал и привлекут, если требуется, ваше внимание к программе. Попробуйте поэкспериментировать со следующими операторами:

FOR В = 1 ТО 10
ВЕЕР NEXT В


Звуковое оформление: оператор SOUND

Запустите программу, приведенную ниже, и вы поймете, как работает оператор sound. Вы услышите звук той частоты и длительности, которые указаны как параметры оператора. Первый параметр х определяет частоту в диапазоне от 37 до 32 767 Гц, хотя высокие частоты едва ли будут приятны (если вообще доступны) для вашего слуха.

FOR S = 37 ТО 3000 STEP 100
SOUND X, 18 NEXT X

Второй параметр 18 задает длительность звучания, измеряемую в тактах часового механизма ("тиках"). Поскольку секунде соответствует 18,2 "тика", в нашем примере звук каждой частоты длится примерно одну секунду.
Обычно оператор sound не исполняется до тех пор, пока не "прозвучит" предыдущий оператор. Однако оператор sound с нулевой длительностью, сам по себе не вызывающий звука, прерывает работу предыдущего оператора sound, даже если тот не отзвучал до конца.
Пример программы, воспроизводящей звуки занятой телефонной линии:

Как работает оператор SOUND
CLS
FOR S = 1 ТО 10
SOUND 25000, 3
LOCATE 20, 11: ?" Занято! "
SOUND 400, 5 NEXT S

Первый оператор sound воспроизводит звук очень высокой частоты, не воспринимаемой человеческим ухом, и прерывает звук, создаваемый вторым оператором sound.


Музыка в Бейсике: оператор PLAY

Оператор play позволяет составлять музыкальные фрагменты и проигрывать их в различных сочетаниях в ходе выполнения программы. Как и оператор draw, оператор play имеет свой набор команд для определения мелодии. С помощью этих команд вы можете задать темп, октаву, паузы и другие музыкальные характеристики. Команды объединяются в строку и присваиваются строковой переменной. Когда вы захотите услышать мелодию, обратитесь к оператору play с командой

"X"+VARPTR (строковая переменная)


В представленной ниже программе оператор play используется для последовательного проигрывания нот в семи октавах.

Последовательно проигрывает все ноты в 7 октавах scale$ = "CDEFGAB" PLAY "LI6" FOR I = 0 ТО 6
PLAY "0" + STR$(1%)
PLAY "X" + VARPTR$(scale$) NEXT I
А вот еще один пример — всем известная мелодия "Happy birthday to you!".
CLS
PLAY "L8 MF MS 03 GG L4 AG 04 С 03 L2 В"
PLAY "L8 MF MS 03 GG Ы AG 04 D L2 C"
PLAY "L8 MF MS 03 GG L4 04 GE L8 CC 03 L4 В А"
PLAY "04 L8 FF L4 ECD LI C"
END

Все команды оператора play перечислены в табл. 3.4. Испытав их, вы убедитесь, что они предоставляют широкие возможности для "музицирования". Таково еще одно замечательное применение двоичного кода.

Таблица 3.4. Команды оператора PLAY

Команда
Действие
Буква от А до G
Исполнение ноты, обозначенной указанной буквой
Буква от А до G, за которой следует знак #, + или -
Исполнение ноты в соответствии с буквой, где знак # или + означают "диез", а знак — соответствует "бемоль"
Lx
Исполнение последующих нот с интервалом 1/х, где х меняется в диапазоне от 1 до 64
Ox
Играть в октаве х. Третья октава начинается со сред­него "ми" (нота С). Всего имеется семь октав (с 0 по 6), расположенных между "ми" и "ре" (от С до В)
Px
Пауза длительностью 1/х (х от 0 до 64)
Tx
Задание темпа или четвертных нот, исполняемых в минуту (х может меняться от 32 до 255; по умолча­нию равно 120)
Nx
Исполнение ноты х, которая может меняться от 0 до 84. Каждая октава имеет 12 нот, включая диезы и бемоли. 0 означает паузу
MN
Нормаль. Каждая нота звучит 7/8 времени, заданного в команде L
ML
Легато. Каждая нота звучит полный интервал, задан­ный в команде L
MF
Стаккато. Каждая нота звучит 3/4 времени, заданного в команде L
MS
Установка режима непосредственного исполнения. Каждая нота, заданная в операторах PLAY н sound, исполняется только после завершения предыдущей. Исполнение программы приостанавливается до окончания музыки. Этот режим принимается по умолчанию
MB
Установка режима фонового исполнения. Каждая нота, заданная в операторах PLAY и SOUND, сохраня­ется в отдельном буфере и исполняется в процессе работы основной программы
. (точка)
Увеличение продолжительности звучания на 50%

Фоновая музыка — весьма эффективное средство, дополняющее визуальное восприятие работы компьютера. Она успокаивающе действует на нетерпеливого клиента, который вынужден ждать, скажем, окончания выполнения программы службы знакомств.
В очередной программе фоновая музыка делает поздравление из ранее рассмотренного примера более теплым. В операторах play команда mf заменена командой мв (фоновое исполнение). В результате программа выводит на экран имя именинника, не дожидаясь окончания музыки. Музыка продолжается в процессе исполнения цикла for. . .next, во время которого на экране пишется имя крокодила Гены.

' Поздравление с днем рождения!
CLS
PLAY "L8 MB MS 03 GG L4 AG 04 С 03 L2 В"
PLAY "L8 MB MS 03 GG L4 AG 04 D L2 C"
PLAY "L8 MB MS 03 GG L4 04 GE L8 CC 03 L4 В А"
PLAY "04 L8 FF L4 ECD LI C"
FOR I = 1 TO 24
LOCATE I, I
PRINT "КРОКОДИЛ ГЕНА, С ДНЕМ РОЖДЕНИЯ!" NEXT I END

В следующей программе параметр х цикла for...next внутри цикла используется для обозначения длительности звучания ноты G (соль) в третьей октаве.

FOR X = 1 ТО 64
PLAY "L" + STR$(X)
PLAY "03G" NEXT

Поскольку аргумент команды L является знаменателем дроби, обозначающей длительность ноты, с возрастанием х длительность звучания становится все короче. Запустите программу и вы услышите музыку, напоминающую звук скачущего пластмассового шарика.