Диалекты бейсика для ZX Spectrum 1992 г.

PRO-DOS - Окна.


ОКНА

♦WINDOW, ♦ WSIZE, +NEW, ♦WRAP, +NOWRAP, ♦ROLL, ♦SCROLL, ♦CLEAR, +CLS, ♦TPAT

В PRO-DOS имеется группа операторов, предназначенных для работы с текстовыми окнами. Текстовым окном называется прямоугольная область экрана, в которую может быть направлен вывод символьной информации. В PRO-DOS размеры окна должны составлять целое число знакомест.

До того как выполнен первый оператор работы с окнами, считается, что в PRO-DOS определено восемь одинаковых окон размером во весь экран (32x24 знакоместа). Если такое равноправие Вас не устраивает, прежде всего укажите, с каким окном Вы намерены работать, то есть определите текущее окно. Делается это с помощью оператора

♦ WINDOW п

Параметр п задает номер окна и может быть в пределах от 0 до 255. Однако учитываются лишь три младших бита этого числа, по которым и определяется номер окна (с 0 по 7). Следовательно, подставив вместо п число 8, мы назначим текущим нулевое окно, 9 — первое и т. д. Оператор ^WINDOW п, как и +GPAT, является неиспол-няемым. Он лишь указывает последующим операторам, в какое окно осуществлять вывод.

Оператор ♦WSIZE служит для установки размеров текущего окна. Его формат:

♦WSIZE XI, Y1, Х2, Y2

Параметрами Х1 и Y1 задаются координаты левого верхнего угла окна, Х2 и Y2 — правого нижнего. Мы намеренно обозначили координаты не строчными, как обычно, а прописными латинскими буквами, чтобы показать, что система «оконных» координат отличается от той, в которой работают графические операторы. Вообще говоря, это та же система координат, которая применяется в стандартном Бейсике для обозначения позиций печати, то есть все величины измеряются в знакоместах, а началом отсчета (0, 0) считается верхнее левое знакоместо экрана.

I I 1 I I I I I I I I I

ТТТТТТТТТТТТТ1 TIIITTTTTTTT-H

Рис. 10. «Перекраска» текстуры оператором ♦MATCH.

Оператор

♦NEW

деинициализирует все ранее установленные окна, и опять каждое из 8 окон будет занимать целиком весь экран.

После того, как окно произвольного размера устанавливается текущим (оператор ♦WINDOW), вывод информации в него будет осуществляться так, как будто ничего не изменилось, только экран стал меньше. Правда, при заполнении окна Вы будете избавлены от характерного для стандартного Бейсика вопроса scroll?. Но скроллинг все же происходить будет, причем помимо Вашего желания. Давайте поэкспериментируем:

30 ♦ WINDOW 0: REM Работаем с окном номер О

40 * WSIZE 10, 10, 20, 20: REM Установим его размер

50 PRINT "Window No. 0": REM Где окажется надпись?

60 PRINT AT 3,3; "AT 3,3": REM А эта?

70 PRINT "a string" ' "next string": REM Как работает символ апострофа?

80 PAUSE 200: INK 6: PAPER 7: REM А атрибуты?

90 LIST: REM Неужели листинг тоже выведется в окно?

Из результата выполнения строки 60 видно, что позииия печати отсчитывается от левого верхнего угла окна, а не всего экрана.

Обратите внимание, что работа операторов стандартного Бейсика PRINT и LIST в PRO-DOS имеет некоторые особенности. Как уже отмечалось, введение в программу строки

OPEN #2, "Р"

сделает доступными для вывода две строки (22 и 23), относящиеся к служебному экрану. Встретив эту инструкцию, Speccy уже не станет возражать против команд тина PRINT AT 22,п и PRINT AT 23.n и честно выполнит их, если они имеют смысл для текущего окна. Оператор вывода текста в строку, номер которой больше высоты окна (вплоть до печати в строку номер 255), приведет к скроллингу на соответствующее число строк и присвоит знакоместам новых строк текущие атрибуты. Для лучшего понимания сказанного полезно посмотреть, как работает следующая программа:

30 FOR N=0 ТО 30: REM Попробуем вывести 31 строку

40 PRINT AT N,0; INK INT(RND+7+.5); PAPER INT(RND+7+.5); FLASH INT(RND+.5); N: REM Да еще в цвете

50 PAUSE 100: NEXT N: REM И не спеша

Здесь в качестве окна используется весь экран. Интересно, что PRO-DOS «пропускает» и инструкции типа PRINT AT n,m, где m больше ширины текущего окна (вплоть до 255). Такие операторы просто игнорируются. Добавив в конец предыдущего примера строку

70 PRINT AT 0, 200; "♦**" можно в этом убедиться.

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

В некоторых случаях описанные особенности операторов вывода на экран являются нежелательными. Например, может вызвать трудности отсутствие запроса scroll? при просмотре листинга программы или выводе на экран каких-нибудь длинных таблиц. Эти трудности легко преодолимы. Самый простой способ вернуть операторам PRINT и LIST их исконные, принятые в стандартном Бейсике свойства — отключить на время канал "P", например:

CLOSE #2: LIST: OPEN #2,"Р"

В этом случае листинг будет выдаваться с запросом scroll? и не в текущее окно, а как полагается, на весь экран.

Если в программе требуется выводить данные на экран как «продосовским», так и стандартным способами, проще для последнего открыть специальный поток. Сделать это можно, включив в программу строку

30 OPEN #4, "S"

После этой строки операторы PRINT и LIST будут работать так, как им положено это делать в PRO-DOS, а стандартный бейсиковский вывод будут осуществлять операторы PRINT #4 и LIST #4.

Скроллинг в окне можно заблокировать оператором

♦WRAP

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

♦NOWRAP

После инициализации PRO-DOS всегда по умолчанию устанавливается режим +NOWRAP.

Для принудительного скроллинга изображения в окне служат два похожих оператора: *ROLL и +SCROLL. Оба имеют одинаковый формат:

♦SCROLL m, n

♦ROLL m, n

Параметром n определяется направление скроллинга. Из соображений наглядности разработчик PRO-DOS связал значения этого параметра с цифровыми обозначениями соответствующих курсорных клавиш ZX Spectrum:

п=5 влево;

п=6 вниз;

п=7 вверх;

п=8 вправо;

n=5+6=l 1 влево-вниз; п=5+7=12 влево-вверх;

п=8+6=14 вправо-вниз;

п—8+7=1 5 вправо-вверх.

Вообще говоря, параметр п может принимать любые значения в диапазоне -255.-255, однако предсказуемый эффект дадут лишь приведенные выше.

Параметром m (-255...255) задается количество знакомест, на которое нужно осуществить смещение текста в окне (в направлении, указанном параметром п). Параметр т, равный нулю, заблокирует скроллинг.

В чем же отличие между операторами *SCROLL и *ROLL? Первый осуществляет обычный (нециклический) скроллинг. После его выполнения текст при смещении будет уходить «в никуда». +ROLL реализует циклический скроллинг: символы, исчезнувшие у одной границы окна, тут же будут появляться у противоположной.

♦CLEAR п

Оператор *CLEAR дает возможность быстро очищать окно и устанавливать в нем цветовые атрибуты. Значения параметра п могут быть любыми в диапазоне 0...255, хотя интерес представляют лишь первые четыре числа (дал'ыпе все повторяется). Оператор +CLEAR 3 очистит окно и установит для всех его знакомест значения атрибутов, которые последними встретились при выполнении программы. Причем неважно, какие это были атрибуты: постоянные или временные. Так, приведенная ниже программа, в конечном итоге, очистит указанное окно и окрасит его в красный цвет (PAPER 2) без мерцания (FLASH 0):

30 * WINDOW 0: REM Текущее окно

40 * WSIZE 3, 3, 10, 10: REM Размеры окна

50 FLASH 1: PRINT INK 3; PAPER 4; "***"; INK 1; PAPER 2; "+++";

FLASH 0; 60 *CLEAR 3: REM Очистка окна

♦CLEAR 2 сделает все то же самое, но не удалит ранее выведенные в окно символы. +CLEAR 1, напротив, очистит окно от символов, а атрибуты оставит без изменений. Вы можете убедиться в этом, меняя параметр оператора +CLEAR в строке 60 приведенной программы. Таким образом, результат последовательного выполнения +CLEAR 1 и +CLEAR 2 эквивалентен тому, что получится при выполнении +CLEAR 3. Что касается *CLEAR 0, то он вообще не вызывает никаких изменений.

Но возможности оператора CLEAR шире. Выполните пример:

30 * WINDOW 0 40 * WSIZE 3, 3, 10, 10

50 PRINT'INK 3; PAPER 4: REM Пока все понятно... 60 *ТРАТ BIN 01001100: REM ... а это что-то новенькое 70 *CLEAR 3

и обнаружите, что окно залито текстурой в соответствии с шаблоном, заданным оператором

♦ТРАТ

Попробуйте изменить параметр оператора +CLEAR в строке 70. Вы увидите, что ноль снова не приведет ни к какому эффекту, единица даст черно-белую заливку окна текстурой, а двойка:

закрасит окно атрибутами (в соответствии со строкой 50), но без текстурной заливки. Оператор

*cls

делает в точности то же самое, что и +CLEAR 3, и введен, по-видимому, для удобства. Совместная работа *ТРАТ и *CLS напоминает действие пары *GPAT и +FBOX. Однако для *ТРАТ и *CLS соседние горизонтальные линии заливки смещаются друг относительно друга на один пиксель, и это приводит к тому, что узор в окне имеет вид диагональных полосок. По-видимому, не требует особых пояснений утверждение, что

♦ТРАТ 255: *CLS

даст сплошную заливку окна, а ♦ТРАТ 0: *CLS

очистит окно от текстуры. Повторное использование этих двух операторов в одном и том же окне приведет к замене текстуры на новую.

Напоследок отметим, что графические операторы при выводе на экран игнорируют факт существования окон.

Некоторые дополнительные сведения об окнах приведены в Приложении 4.




СОДЕРЖАНИЕ:
  1. Laser Basic - Вывод спрайтов на экран; Вывод на экран части спрайта; Перенос атрибутов; Преобразование окна экрана; Наборы переменных; Перемещение спрайтов; Наложение спрайтов; Копирование изображения с экрана в спрайт; Преобразование спрайтов; Скроллинг пейзажа; Изменение размеров области спрайт-файла; Вспомогательные графические операторы и функции; Определение столкновений спрайтов; Сервисные операторы и функции; Процедуры; Загрузка и запись программ.


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Demo Party - Zlincon 2e3 party: минирепортаж.
Жил,был Лaмeр - Cкaзaть чтo уж сoвсeм нихрeнa нe дeлaл будeт нe сoвсeм прaвдa - инoгдa мнил сeбя хaкeрoм.
Введение - Сейчас самое главное не позволять себе резко переходить на более высокий уровень.
RestInPain - новости.
О наболевшем III - частухи!

В этот день...   21 ноября