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

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


ИНТЕРПРЕТАТОР

Интерпретатор Laser Basic не накладывает никаких ограничений на использование операторов стандартного Spectrum-Бейсика. В этом плане единственным его недостатком можно считать то, что он «затирает» область символов, определяемых пользователем44.

Операторы Laser Basic задаются ключевыми словами, состоящими из пяти символов: первый — точка (.), четыре последующих— прописные (и только прописные) буквы латинского алфавита. Например: .PTBL, .MOVE. Набираются ключевые слова посимвольно.

При вводе строки программы интерпретатор Laser Basic проверяет ее на правильность синтаксиса. Строка с ошибкой «не вводится», а в сомнительном месте обычно появляется мерцающий знак вопроса (?).

Параметры операторов Laser Basic передаются интерпретатору иначе, чем в стандартном Бейсике и других его диалектах, — не указанием значений вслед за ключевым словом, а через специальные графические переменные. Перед выполнением оператора необходимо присваивать требуемые значения определенным графическим переменным45.

Имена графических переменных состоят из четырех символов: первый — точка, остальные — строчные буквы латинского алфавита.

Всего графических переменных десять:

.ROW, .COL - вертикальная и горизонтальная координаты в знакоместах (пределы, соответственно, 0...23 и 0...31);

.HGT, .LEN - высота и ширина графического объекта

(окна экрана, спрайта) в знакоместах (0...24 и 0...32);

Строго говоря, переменные .ROW, .COL, .HGT и .LEN могут принимать любые значения от О до 255, в том числе и отрицательные. Однако в этом случае может возникнуть ситуация, когда спрайт или окно частично или полностью выйдет за пределы экрана. Кроме того, надо помнить, что положительные значения, превышающие 127, будут интерпретироваться как отрицательные и, наоборот, отрицательные в пределах -128...-255 — как положительные. Например, 255 приравнивается к -1, а -251 приравнивается к 5.

- вертикальная и горизонтальная координаты внутри спрайта в знакоместах;

- величина и направление вертикального скроллинга в пикселях (-1 28... 127);

- номер спрайта в спрайт-файле (1 ...255);

- номера первого и второго спрайтов (1...255) для операторов, работающих с двумя спрайтами.

В отличие от переменных стандартного Бейсика графические переменные всегда определены: после загрузки Laser Basic их значения равны нулю.

Присвоение значений графическим переменным происходит без использования оператора LET. Например:

.SRW, .SCL

.NPX

.SPN

.SP1, .SP2

.ROW=1 или .COL=c или .LEN=s+d*3

Графические переменные не могут быть параметрами операторов, аргументами функций Spectrum-Бейсика или частью выражений. Нельзя, например, писать:

LET a=.ROW или PRINT .COL или ,SPN=.COL

Для присвоения значений графических переменных обычным числовым переменным используются специальные графические функции. Имена их идентичны именам соответствующих графических переменных, только вместо точки в них ставится знак вопроса (например, ?ROW, ?COL).

Графические функции могут использоваться только с оператором присвоения в строках типа:

LET r=?ROW

- где г — обычная числовая переменная, ?ROW — функция, возвращающая значение графической переменной .ROW.

Аналогично, с помощью соответствующих графических функций (?COL, ?LEN, ?HGT, ?SPt, ?SP2, ?SPN, ?NPX, ?SCL, ?SRW) числовым переменным могут быть присвоены значения остальных девяти графических переменных.

Нужно учитывать, что если какая-либо графическая переменная принимает отрицательное значение, то результат выполнения соответствующей функции окажется положительным числом больше 127. Например:

10 .COL=—5: LET Z=?COL

20 PRINT Z: REM Z равна не -5, a 251 (256-5)

Загрузка и запуск интерпретатора

Фирменный вариант пакета Laser Basic предусматривает возможность работы всех входящих в него программ с лентой и микродрайвом46. По ряду причин микродрайв в нашей стране не получил распространения. Поэтому довольно быстро появилась версия, поддерживающая работу и с магнитофоном, и с диском в системе TR-DOS. Именно о ней и пойдет речь в предлагаемом описании.

Все примеры программ, приведенные в описании, кроме специально оговоренных, будут работать и с лентой, и с диском. Если Вы пользуетесь дисководом, то перед операторами LOAD, SAVE, MERGE и VERIFY следует вставлять RANDOMIZE USR 15619: REM:

В пакет Laser Basic включена программа-диспетчер Laser. Загрузим ее, и через некоторое время на экране появится меню (рис. 13) (для ленточной версии пятая и шестая позиции будут несколько отличаться от изображенных на рисунке). Рассмотрим позиции меню (опции):

1 EXECUTE LASER BASIC

Запуск интерпретатора Laser Basic. При выборе этой опции бейсик-программа «сбросится» и в ОЗУ останутся только коды интерпретатора. После этого можно выполнять операторы Laser Basic, загружать и сохранять файлы и т. д.;

2 LOAD YOUR OWN SPRITES

Загрузка спрайт-файла, созданного пользователем. На запрос INPUT SPRITE START ADDRESS нужно ввести адрес загрузки (нижнюю границу) спрайт-файла47;

3 LOAD "SPRITE2A" SPRITES

Загрузка спрайт-файла SPRITE2A;

4 LOAD "SPRITE2B" SPRITES

Загрузка спрайт-файла SPRITE2В (этот файл используется в демонстрационной программе Demo);

$ SAVE LASER BASIC TO 5'25 FLOPPY DISK либо

5 PRINT CATALOGUE

Копирование Laser Basic с ленты на диск в системе TR-DOS (для «ленточного» меню) или выдача каталога диска (для «дискового» меню);

6 RETURN ТО ТАРЕ MENU либо RETURN ТО DISK MENU

LASER BASIC © OASIS SOFTWARE

вСТЯ-DISK VERSION 1....EXECUTE LASER BRSIC 2. . . .LOAD YOUR OUN SPRITES 3....LOAO 5РЯ1ТЕ2Я' SPRITES ♦ ....LOAD ' 5PRITE2B ' SPRITES 5... PRINT CATALOGUE 6....RETURN TO TAPE MENU

PLEASE SELECT OPTION.

Рис. 13. Главное меню программы LASER.

Переход из ленточного меню в дисковое и обратно.

Вывод спрайтов на экран

Загрузим один из спрайт-файлов, например, фирменный файл SPRITE2B48 (опция 4 меню), запустим интерпретатор Laser Basic (опция 1) и выведем на экран один из спрайтов, например, первый. Для задания номера спрайта и его местоположения на экране

(координат верхнего левого угла) воспользуемся соответствующими графическими переменными:

10 .SPN=1: REM Зададим номер спрайта 20 .ROW=10:.COL=W: REM Определим место в 10-й строке и 10-м столбце экрана

Теперь можно выполнить самый простой и самый популярный оператор Laser Basic .PTBL:

30 .PTBL REM Поместим спрайт на экран

Вывод на экран части (окна) спрайта

Если нет необходимости переносить на экран весь спрайт, можно вывести лишь его часть — окно спрайта. Делает это оператор .PWBL. Кроме номера спрайта и координат размещения изображения на экране, для работы этого оператора следует задать размеры и координаты окна спрайта, то есть присвоить требуемые значения переменным: .HGT, .LEN — высота и ширина окна, .SCL — левая колонка, .SRW — верхняя строка окна спрайта относительно границ спрайта:

10 .SPN=1:.ROW=15:.COL=15 20 .HGT=2:.LEN=3: REM Размеры окна спрайта 30 .SCL=1 :.SRW=0: REM Координаты окна спрайта 40 .PWBL

Перенос атрибутов

Описанные выше операторы вывода спрайтов по умолчанию переносят на экран и их атрибуты. Но можно и запретить перенос атрибутов, выполнив оператор .ATOF. Вновь разрешает перенос оператор .ATON. Проиллюстрируем на примере:

10 . ROW=0:.COL=0:.SPN=4:. PTBL: REM Поместим спрайт на экран 20 .ATOF: REM Запретим перенос атрибутов 30 .COL=8:.PTBL: REM Выведем «гчерно-белое» изображение 40 .ATON: REM Вновь разрешим перенос атрибутов 50 .COL=16:.PTBL: REM Выведем как прежде — в цвете

Следует учитывать, что операторы .ATON и .ATOF воздействуют не только на вывод спрайтов, но и на все операции типа «спрайт— экран» и «экран—спрайт», которые будут описаны ниже.

Преобразование окна экрана_

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

картинок*. И, что ценно, можно преобразовывать не только все экранное изображение, но и его часть, в пределах заданного окна экрана.

Расположение и размеры окон определяются четырьмя графическими переменными: .ROW, .COL, .HGT и .LEN. Если окно выходит за пределы экрана, оно автоматически обрезается по его размеру.

Операторы, выполняющие графические преобразования, легко узнать по букве V (Video), завершающей ключевое слово.

Простейший из операторов, преобразующих картинку,— .INVV. Он инвертирует изображение в пределах установленного окна экрана, то есть меняет цвет фона на цвет тона и наоборот.

Оператор .MIRV выполняет зеркальное отображение картинки в окне относительно его вертикальной оси симметрии. Действие этого оператора распространяется только на изображение и не затрагивает раскраску (атрибуты) окна. Атрибуты отображаются специальным оператором .MARV. Приведем пример:

10 .ROW=1:.COL=1:.LEN=14:.HGT=1: REM Зададим окно 20 PRINT AT 1,1; INK 1 ;"LEFT": REM Поместим в окно текст 30 PRINT AT 1,10; INK 2;"R1GHT"

40 PAUSE 100:.MIRV: REM Отобразим текст без атрибутов 50 PAUSE 100:.MARV: REM Теперь отобразим атрибуты

Laser Basic позволяет уже после создания экранного изображения перекрашивать его части. Оператор .SETV присваивает всем знакоместам окна текущие (постоянные) атрибуты.

Ну и, конечно же, можно очистить окно экрана: выполняет это действие оператор .CLSV. Он похож на стандартный CLS, только действует не на весь экран, а на его часть — окно, и, кроме того, не изменяет атрибутов знакомест:

10 .HGT=3:.LEN=6:.ROW=4: REM Задание окна 20 PRINT AT 5,1 ;"RED";AT 5,6;"YELLOW": REM Вывод в окно 30 .COL=6: PAPER 6:.SETV: REM Изменение цвета фона в окне 40 .COL=0: PAPER 2:.SETV: REM Изменение цвета фона в окне 50 .LEN=12: PAUSE 100:.INVV: REM Инверсия окна 60 PAUSE 100:.CLSV: REM Очистка окна

Следующий блок операторов, занятых преобразованием изображения, — это операторы, смещающие картинки в окнах экрана на заданное число пикселей, то есть производящие скроллинг. Laser Basic обеспечивает как простой скроллинг, при котором изображение, вытесненное за пределы окна, бесследно пропадает, так и циклический, выводящий смещенное за границу окна изображение с противоположной стороны.

Горизонтальный скроллинг изображения (без атрибутов) может быть выполнен вправо или влево на фиксированный шаг: 1, 4 и 8 пикселей. Операторы горизонтального скроллинга .SL1V, .WL1V,

161

* Здесь картинка — не только помещенный на экран спрайт, но и построения, выполненные с помощью графических операторов Spectrum-Бейсика, тексты, выведенные оператором PRINT и пр. ^

6 Зак. № 192

.SL4V f .WL4V, .SL8V , .WL8V, .SR1V, .WR1V, .SR4Vr .WR4V, .SR8V и .WR8Y по отдельности описаны в Приложении 1. Но и без подсказки можно легко.разобраться, «кто есть кто»: первая буква ключевого слова сообщает о виде скроллинга (S — нормальный, W — циклический), вторая — о направлении (L — левый, R — правый), а цифра — о шаге (1, 4 и 8 пикселей).

Операторов, отвечающих за вертикальный скроллинг изображения, в Laser Basic лишь два: .SCRV выполняет простой скроллинг, .WCRV — циклический. Мало? Вполне достаточно, поскольку величина и направление смещения при вертикальном скроллинге задаются специальной графической переменной .NPX. Она может принимать значения от — 128 до 127. Модуль значения задает шаг скроллинга в пикселях. Направление определяется знаком: положительное значение соответствует скроллингу вверх, отрицательное — вниз.

Горизонтальный и вертикальный скроллинг атрибутов (на целое знакоместо) выполняется операторами .ATLV — влево и .ATRV — вправо, .ATUV — вверх, .ATDV — вниз. Правда, обеспечивают они лишь циклический скроллинг.

В операциях вертикального скроллинга задействована область буфера принтера (см [1]) И так как ее объем ограничен 256 байтами, то вертикальный скроллинг возможен лишь, если результат перемножения значений графических неременных .NPX и .LEN не превышает 256 (в противном случае может произойти сбой программы). Непосредственно в программе проверить это условие можно следующей строкой:

LET X=?NPX: LET Y=?LEN: IF ABS (X*Y) <= 256 THEN .WCRV

Наборы переменных

Специальная переменная .SET позволяет, единожды задав набор переменных, в последующем присваивать целой группе графических переменных нужные значения указанием только номера набора. Задаются наборы переменных строками типа:

10 .SET=1:.HGT=5:.LEN=5:.ROW=0:.COL=0: REM Окно 1 20 .SET=2:.HGT=4:.LEN=5:.ROW=5:.COL=7:.NPX=1: REM Окно 2 и параметр вертикального скроллинга .NPX

В данном примере наборам графических переменных присвоены номера 1 и 2. Всего в программе может быть определено 16 наборов (от 0 до 15).

Теперь, чтобы выполнить, например, горизонтальный скроллинг 1-го окна и вертикальный 2-го окна, достаточно задать: 50 .SET=1:.WR4V:.SET=2:.WCRV

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

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

Перемещение спрайтов (1-й способ)_

От преобразования картинки в статичном окне до движения спрайта — один шаг. Поместим на экран спрайт. Зададим окно, по размерам покрывающее спрайт, и произведем скроллинг. Спрайт переместится. Как уже упоминалось, при движении по горизонтали шаг может быть 1, 4 и 8 пикселей, по вертикали — произвольный. Например, это может выглядеть так (рис. 14):

10 .SPN=4:.ROW=0:.COL=0 20 .PTBL: REM Вывод спрайта на экран 30 .LEN=30:.HGT=4: REM Окно 40 FOR N=1 ТО 240

50 .WR1V: REM Скроллинг вправо на один пиксель 60 NEXT N

Рис. 14. Перемещение спрайта путем скроллинга окна.

Существенным недостатком такого способа «оживления» спрайтов является то, что перемещение происходит вместе с фоном49. Ведь скроллинг захватывает все изображение в окне, не разбирая, спрайт ли это или что-то иное.

Перемещение спрайтов (2-й способ)

Этот способ лишен недостатков предыдущего. Он основан на последовательном вызове спрайта на экран оператором .PTBL с изменением на единицу значений .ROW и .COL. Меняя одну из переменных, заставим спрайт двигаться параллельно границам экрана, меняя обе — по диагонали. Спрайт, перемещаемый таким способом, должен иметь по краям пустое пространство шириной в одно знакоместо. Иначе спрайт, помещенный на экран в предыдущем шаге, не будет затираться следующим выводимым спрайтом, и по экрану протянется след.

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

Избежав одной неприятности. возникающей при перемещении спрайта скроллингом (смещение фона), мы получили другую — спрайт, перемещаемый с помощью оператора .PTBL, затирает фон.

Справиться с проблемой сохранения фона при перемещении спрайтов можно, только умело пользуясь операторами наложения спрайта на экран по различным принципам.

1 знакоместо

•} 6}

Рис. 15. Подготовка спрайта к перемещению.

Наложение спрайтов

Приведенный рисунок

(рис. 16) поясняет принципы наложения спрайтов.

Кроме операторов наложения целых спрайтов в Laser Basic имеются инструкции, осуществляющие те же действия с окнами спрайтов: .PWOR, .PWND и .PWXR. Действуют они аналогичным образом, но предварительно должны быть определены переменные .SRW, .SCL, .HGT и .LEN, задающие положение и размеры окна в спрайте. Присваивая значения этим переменным, нужно следить, чтобы окно не выводило за пределы спрайта, иначе команда не пройдет, хотя сообщения об ошибке и не появится. Если добавить в предыдущий пример строку

35 .SRW=0:.SCL=0:.HGT=2:.LEN=2

и в строках с 40-й по 70-ю заменить буквы РТ на PW, то получившаяся программа проиллюстрирует действие операторов наложения окна спрайта на экран.

Перемещение спрайтов (3-й способ) ром .SP1. В завершение значениями.

Для перемещения спрайта с помощью оператора .MOVE переменным .SP1 и .SP2 присваивают одинаковые значения, то есть задают один спрайт50. Затем помещают оператором .PTXR спрайт с этим номером в исходную точку, заданную .ROW и .COL. На первом шаге выполнения .MOVE спрайт будет стерт, на втором — помещен на другое место. Далее можно еще и еще раз выполнять .MOVE без каких-либо дополнительных действий, если, конечно, не потребуется изменить скорость и направление движения спрайта. Делается это присвоением переменным .HGT и .LEN других значений. Приведем пример:

переменные .SP1 и .SP2 обмениваются

10 .SP1=5:.SP2=5: REM Перемещать будем спрайт с номером 5 20 .ROW=0:.COL=0:.SPN=5:.PTXR: REM Поместим его на экран 30 .HGT=1 :.LEN=1: REM Зададим смещение 40 FOR n=1 ТО 15:.MOVE: PAUSE 4: NEXT n: REM Сдвинем на 15 знакомест по диагонали

Копирование изображения с экрана в спрайт

В Laser Basic имеется группа операторов, которые копируют изображение с экрана в спрайт (или окно спрайта), то есть помещают изображение в спрайт-файл, находящийся в памяти. Самый употребительный из них — .GTBL, он переносит изображение из окна экрана в спрайт с номером, заданным переменной .SPN. Остальные операторы этой группы описаны в Приложении 1.

Перемещение спрайтов (4-й способ)

Используя оператор копирования изображения из окна экрана в память .GTBL, можно реализовать еще один способ перемещения спрайтов с сохранением фона. Суть его проста: окно экрана, в которое будет помещен спрайт, сохраняется оператором .GTBL в буфере (пустом спрайте), после этого предназначенный для перемещения спрайт выводится на экран оператором .PTOR, а через некоторое время (в зависимости от требуемой скорости перемещения) изображение из буфера копируется обратно на экран, восстанавливая фон. Далее в буфер помещается изображение из

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

Поскольку для примеров мы пользуемся готовым спрайт-файлом SPRITE2B, то не будем формировать пустой спрайт, а «пожертвуем» спрайтом .SPN=2 — используем его в качестве буфера. Размеры его равны размерам спрайта .SPN=1. Следующая программа перемещает спрайт .SPN=1 слева направо на 10 знакомест с сохране- I нием фона:

10 .ROW=0:.LEN=4:.HGT=2: REM Окно в размер спрайта номер 1 20 .COL=5:.SPN=3:.PTBL: REM Фоном служит спрайт номер 3 30 FOR N=0 ТО 10:.COL=N

40 .SPN=2:.GTBL: REM Копирование окна с фоном в буфер 50 .SPN=1 :.PTOR: REM Вывод спрайта на экран 60 PAUSE 10

70 .SPN=2:.PTBL: REМ Восстановление окна 80 NEXT N: REM Следующий шаг

Преобразование спрайтов

Для работы со спрайтами в памяти существуют и операторы, которым нет «экранных» аналогов. Например, можно повернуть спрайт на 90°. Оператор .SPNM копирует спрайт с номером .SP1 в спрайт .SP251 с поворотом изображения на 90° по часовой стрелке. Предварительно второй спрайт (.SP2) должен быть очищен. Особо следует обратить внимание на то, чтобы высота второго спрайта равнялась ширине первого, а ширина, соответственно, — высоте.

Оператор .DSPM позволяет прямо в процессе работы программы получить в спрайте с номером .SP1 увеличенное в четыре раза изображение спрайта .SP2. Естественно, что для успешного выполнения этой операции высота и ширина спрайта .SP1 должны быть в два раза больше, чем у исходного .SP2. Спрайт .SP1 предварительно должен быть очищен.

Наложения «спрайт—окно спрайта»

Операторы взаимодействия спрайта с окном другого спрайта (напомним, что эти преобразования происходят в памяти) во многом похожи на соответствующие инструкции для окон экрана. Ключевые слова операторов этой группы начинаются с букв GM и РМ (от англ. Get Memory и Put Memory). Например, операторы .GMBL, .GMOR, .GMXR и .GMND переносят или накладывают по различным принципам спрайты на окна в других спрайтах, a .PMBL .PMOR, .PMXR52 и .PMND, наоборот, окно спрайта переносят в «целый» спрайт. Номер «целого» спрайта заносится в переменную .SP1, номер спрайта с окном — в .SP2. Размеры окна в спрайте .SP2 не задаются: подразумевается, что они равны размерам спрайта .SP1, а координаты окна внутри спрайта .SP2 определяются переменными .SCL и .SRW. Необходимо следить, чтобы окно в спрайте не «вылезло» за его край, иначе появится сообщение Parameter error.

Действие операторов этой группы не затрагивает атрибуты. Для перемещения атрибутов в этом случае используются операторы .GMAT и .РМАТ

Следует заметить, что при работе инструкций наложения «спрайт—окно спрайта» возникает побочный эффект: после выполнения любой из них запрещается перенос атрибутов для операций типа «спрайт—экран» и «экран—спрайт» (то есть автоматически выполняется .ATOF). Поэтому каждый раз нужно вновь разрешать перенос атрибутов оператором .ATON.

Перемещение спрайтов (5-й способ)

Развивая далее принцип перемещения спрайтов с сохранением фона в буфере (см. стр. 166), можно реализовать движение спрайта с шагом меньше знакоместа. Эта задача решается с помощью скроллинга спрайта в памяти (шаг скроллинга может быть равным 1, 4 и 8 пикселей) с выводом спрайта на каждом шаге в одно и то же окно экрана. При создании спрайта следует предусмотреть пространство для скроллинга — ободок шириной 8 пикселей (см. рис. 15).

Для примера рассмотрим, как можно реализовать перемещение спрайта с номером .SPN=1 слева направо на 10 знакомест с шагом в 1 пиксель и сохранением фона53:

10 .ROW=0:.LEN=4:.HGT=2: REM Окно в размер спрайта номер 1

20 .COL=5:.SPN=3:.PTBL: REM Фоном служит спрайт номер 3

30 FOR n=0 ТО 10:.COL=n

40 .SPN=2:.GTBL: REM Помещение окна с фоном в буфер

50 .SPN=1 :.PTOR: REM Вывод спрайта на экран

52 FOR m=1 ТО 7:.WR1M: REM Скроллинг спрайта в памяти

54 ,SPN=2:.PTBL: REM Восстановление окна из буфера

55 .SPN=1 :.PTOR: REM Печать сдвинутого спрайта

56 PAUSE 10: NEXT m

58 .WR1M:.WL8M: REM Восстановление спрайта

60 PAUSE 10

70 .SPN=2:.PTBL: REM Восстановление окна из буфера

80 NEXT n

Скроллинг пейзажа

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

Если шаг скроллинга — знакоместо (или несколько знакомест), то особых проблем не возникает. Такой вид скроллинга позволяет прокручивать изображение с атрибутами, хотя и не обеспечивает плавности движения. Для примера рассмотрим перемещение пейзажа высотой 3 строки и длиной 96 знакомест. Допустим, что спрайт с изображением пейзажа имеет номер 1 (отметим, что в сПрайт-файле SPRITE2B такой спрайт отсутствует):

10 .SRW=0:.HGT=3:.ROW=10:.SPN=1: REM Начальные параметры 20 .COL=Or.PTBL: REM Вывод первых 32 столбцов пейзажа

30 FOR n=32 TO 96

40 .COL=0:.LEN=32:.SL8V:.ATLV: REM Скроллинг окна влево 50 .COL=31 :.LEN=1 :.SCL=n:.PWBL: REM Вывод п-го столбца спрайта

в 31-й столбец экрана 60 NEXT п

Чтобы обеспечить перемещение пейзажа с шагом меньше знакоместа, придется применить небольшую хитрость. Нужно сделать 31-й столбец невидимым: задать в нем одинаковый цвет фона (PAPER) и тона (INK). Добавим к предыдущему примеру 15-ю строку и изменим 40-ю и 50-ю:

15 .COL=31:.LEN=1: PAPER 7: INK 7:.SETV: REM Обесцвечивание 31-го столбца

40 FOR m=1 TO 8: .COL=0:.LEN=32:.SL1 V: NEXT m: REM

Скроллинг с шагом в 1 пиксель 50 .COL=31 :.LEN=1 :.SCL=n:.ATOF:.PWBL:.ATON: REM Вывод n-ro столбца спрайта в 31-й столбец экрана

Если скроллинг идет вправо, то «скрытое» окно организуется у левого края экрана.

Изменение размеров области спрайт-файла

Mi

L 1Мм?

XOR AND OR

Рис. 16. Наложение спрайтов по различным принципам.

Таблица 8. Формат хранения спрайта в памяти.

данные об атрибутах спрайта данные о состоянии пикселей спрайта высота спрайта (.HGT) ширина спрайта (.LEN) адрес следующего спрайта номер спрайта

.HGTx.LEN байт

8x.HGTx.LEN байт

1 байт

1 байт

2 байта

1 байт

Laser Basic позволяет в процессе работы программы расширять область спрайт-файла: резервировать место для нового спрайта иг наоборот, «выбрасывать» спрайты из этой области.

Чтобы расширить область спрайт-файла для нового спрайта, нужно после задания номера спрайта, его высоты и ширины (переменные .SPN, .HGT и .LEN) выполнить один из операторов: .ISPR или .SPRT. Они отличаются друг от друга тем, что .ISPR расширяет область спрайт-файла за счет понижения его нижней границы, a .SPRT — повышения верхней. Обратим внимание на то, что этими операторами только резервируется место под новый спрайт, а само изображение нужно записывать в спрайт-файл с помощью оператора .GTBL.

При создании спрайта с уже существующим номером с помощью оператора .SPRT старый спрайт уничтожается и замещается новым. Оператор же .ISPR в этом случае просто не выполняется. Поэтому перед использованием .ISPR нужно убедиться в отсутствии спрайта с заданным номером (о том, как это сделать, будет сказано позже). Если же спрайт существует, то его следует предварительно уничтожить оператором .DSPR или .WSPR (о них будет рассказано в этом разделе).

Расширение области спрайт-файла требует особой осторожности. Необходимо следить, чтобы нижняя граница спрайт-файла (START) не пересекла RAMTOP и не испортила бейсик-программу, а верхняя (END) не затерла коды интерпретатора, начинающиеся с адреса 56576. Напомним, что адрес RAMTOP можно определить так:

LET RAMTOP=PEEK 23730+256*РЕЕК 23731: PRINT RAMTOP

Приведем пример создания спрайта в спрайт-файле:

10 .SPN=240:.PTBL: REM Такого спрайта еще мет 20 CLEAR 50289: REM Опустим RAMTOP 30 .HGT=1:.LEN=1:.SPN=240:.ISPR: REM Создадим его 40 .SPN=240:.PTBL: REM И выведем на экран

При выполнении 10-й строки компьютер выдаст сообщение об ошибке Parameter error (ошибочный параметр) и будет прав: спрайта с номером 240 в спрайт-файле SPRITE2B нет. Выполнив GO ТО 20, убедимся, что все в порядке — спрайт создан, хотя информации в нем нет (точнее, она случайная).

Чтобы удалить спрайт номер .SPN из области спрайт-файла, существуют операторы .DSPR и .WSPR. Один, соответственно, сдвигает нижнюю границу спрайт-файла, другой — верхнюю.

Иногда может возникнуть необходимость переместить спрайт-файл в памяти, к примеру, чтобы зарезервировать пространство между верхней границей области спрайтов и началом интерпретатора под какие-либо подпрограммы в кодах. Для этих целей служит оператор .RLCT. Перед его выполнением нужно присвоить значение специальной переменной .MLN, задающей смещение спрайт-файла (в байтах). Теоретически эта неременная может принимать значения из интервала от 0 до 65535. Реально же нужно следить, чтобы перемещаемый спрайт-файл не попал в «жизненно важные» области памяти. Если спрайты нужно переместить вверх, то необходимо .MLN приравнять величине смещения. Если вниз, то .MLN должна равняться 65536-< смещение>.

Вспомогательные графические операторы и функции_

Операторы и функции данной группы сами не выполняют преобразований графических объектов, но имеют к этому непосредственное отношение.

Оператор .ADJV «обрезает» переменные .HGT и .LEN так, чтобы окно, заданное значениями .ROW, .COL, .HGT и .LEN, но выходило за границы экрана. Оператор .ADJV выполняет действия, эквивалентные работе следующей программки.

10 LET h=?HGT: LET l=?LEN: LET r=?ROW: LET c=?COL

20 IF r+h>24 THEN .HGT=24-r

30 IF c+l>32 THEN .LEN=32-i

Оператор .ADJM изменяет значения графических переменных .HGT, .LEN, .SCL и .SRW таким образом, чтобы спрайт (или окно спрайта) при переносе на экран не выходил за его пределы. К примеру, если выполнить строку

10 .SPN=1:.ROW=1:.COL=31:.ADJM

- то переменная .LEN примет значение 1, так как на экране может поместиться только одна колонка спрайта.

Функция 1SCV проверяет знакоместо экрана, заданное переменными .ROW и .COL, на наличие изображения. Если в тестируемом знакоместе есть включенные пиксели, то после выполнения программной строки

LET S=?SCV

переменной S присваивается ненулевое значение. Если знакоместо пусто, функция возвращает ноль.

Функция ISCM таким же образом проверяет спрайт с номером .SPN. Понятно, что любой непустой (содержащий изображение) сйрайт имеет включенные пиксели и функция возвратит ненулевое значение, если же спрайт пустой — ноль.

С помощью функции 1TST можно выяснить некоторые параметры спрайта. Для этого задается номер проверяемого спрайта (.SPN) и выполняется строка

LET W=?TST

Если спрайт с указанным номером существует, то переменной W присваивается значение адреса его расположения в памяти, а графическим переменным .HGT и .LEN — значения размеров спрайта. При отсутствии тестируемого спрайта переменной W присваивается нулевое значение, а в переменных .HGT и .LEN может оказаться все чго угодно.

Определение столкновений спрайтов

Одна из часто встречающихся задач при создании динамических игр — это определение факта столкновения спрай-;ов. В Laser Basic для этого используются уже описанные функции ?£CV и ?SCM.

Сначала рассмотрим наиболее простую задачу: как определить столкновение спрайта не с конкретным объектом, а с любой картинкой-препятствием на экране:

10 PRINT AT 10,20;"STOP": REM Создание препятствия на экране 100 .ROW=10:.COL=0:.SPN=1:.PTBL: REM Вывод на экран спрайта 110 FOR n=1 ТО 25:.HGT=0:.LEN=1:.SP1=1:.SP2=1 120 .MOVE: GO SUB 130: NEXT n: REM Перемещение спрайта 125 STOP

130 LET c=?COL: REM Сохранение значения переменной .COL 140 .COL=c+4: LET crash=?SCV: REM Проверка знакоместа перед

спрайтом на наличие включенных пикселей '50 IF crash=0 THEN .COL=c: RETURN: REM Если препятствие не обнаружено, то .COL присваивается исходное значение 1000 ВЕЕР 1,1: REM Столкновение

Сложнее определить столкновение спрайта с конкретным объектом. В следующем примере в качестве такого объекта используется спрайт .SPN=2. К программе, фиксирующей в предыдущем примере факт столкновения, добавлены строки 200...240. В них происходит сравнение объекта, с которым произошло столкновение, и спрайта .SPN=2. Спрайт .SPN=5 используется в качестве буфера. Его размеры должны быть равны размерам спрайта .SPN=2.

200 .SPN=5: LET T=?TST:.GWBL: REM Копирование препятствия в буфер

210 .SP1=5:.SP2=2

220 .PMXR: REM Наложение изображения заданного объекта на

содержимое буфера по принципу XOR 230 LET crash=?SCM: REM Проверка буфера на наличие включен-ных пикселей

240 IF crash<>0 THEN .COL=c: RETURN: REM Если включенных

пикселей нет (crash=0), значит заданный объект и препятствие совпадают

10ОО ВЕЕР 1,1: REM Столкновение с заданным объектом

В этом примере факт столкновения зафиксирован не будет, поскольку препятствие на экране не совпадает со спрайтом .SPN=2. Но если теперь заменить 10-ю строку на

10 . ROW= 10:. COL=20:. SPN=2:. PTBL

- то столкновение произойдет.

В приведенных примерах предполагалось, что столкновение спрайтов происходит на чистом экране. Для решения усложненной задачи — определения столкновения спрайтов на неком фоне, перед проверкой совпадения спрайтов необходимо содержимое буфера очистить от фона, наложив на буфер спрайт .SP2=2 по принципу AND (например, оператором .PMND), а после этого уже выполнить оператор .PMXR в строке 220.

Сервисные операторы и функции

Инструкции, описанные в этом разделе, расширяют возможности Spectrum-Бейсика и не имеют никакого отношения к преобразованию графических объектов.

Функция ?KBF используется для контроля нажатия конкретной клавиши. Как и все другие функции Laser Basic, она может использоваться только в строке типа

LET b=?KBF

?KBF возвращает ненулевое значение, если в момент выполнения оператора LET была нажата проверяемая клавиша.

Клавиша, на нажатие которой будет реагировать функция, задается переменными .ROW и .COL в соответствии с табл. 9.

Таблица 9. Задание клавиши для опроса функцией IKBF.

«ROW

.cot

i

г

г

4

1

cs

z

X

С

V

Z

А

s

D

F

G

3

О

W

Е

R

Т

4

1

2

3

4

5

5

0

9

8

7

6

6

Р

О

1

и

Y

7

Enter

L

К

J

Н

а

Break

SS

м

N

В

Приведем пример программки, ожидающей нажатия клавиши К:

10 .ROW=7:.COL=3: REM Указываем клавишу

20 LET s=?KBF: IF s=0 THEN GO TO 20: REM Цикл ожидания

30 BEEP 1,1: REM Дождались

Оператор .POKE addr,x является 16-битовой версией оператора Spectrum-Бейсика РОКЕ55: он записывает двухбайтовое число х в последовательно расположенные ячейки памяти с адресами addr и addr+1, то есть эквивалентен инструкциям

POKE addr,INT(x/256): POKE(addr+1 ),x-INT(x/256)

Нетрудно догадаться, что функция JPEK — это 16-битовый аналог функции РЕЕК стандартного Бейсика. Она возвращает значение двухбайтового числа, записанного в двух ячейках памяти: адрес первой равен аргументу функции, адрес второй на единицу больше. Например, оператор

LET х=?РЕК 23606

эквивалентен

LET х=РЕЕК 23606+256*РЕЕК 23607

Laser Basic позволяет осуществлять отладку (трассировку) программ: оператор .TRON включает пошаговое выполнение программы56. Во время трассировки на экран выводится текст выполняемой в данный момент строки. Эта особенность резко сужает сферу применения оператора .TRON, так как после выполнения нескольких операторов весь экран заполнится строчками листинга программы. Отключается трассировка с помощью оператора .TROF. Оба описываемых оператора могут находиться только в тексте программы, ввод их с клавиатуры не вызовет никакого действия.

Оператор .RNUM N , М, S перенумеровывает строки программы: строке N присваивается номер М, следующей строке M4-S и т. д. (по умолчанию параметр S принимается равным 10). Так, например, .RNUM 1, 20, 15 перенумерует все строки программы с шагом 15, первой строке будет присвоен номер 20. При этом соответствующим образом заменяются параметры операторов GO ТО, GO SUB и RESTORE, но только в том случае, если они представляют собой численные значения, а не выражения. Если использовать .RNUM без параметров, то у первой строки номер не меняется, а последующие перенумеруются с шагом 10.

Оператор .REMK для уменьшения объема памяти, занимаемой программой, удаляет из нее комментарии (все операторы REM и следующие за ними тексты). Необходимо быть осторожным при использовании этого оператора в программах, обращающихся к дисководу. Иначе вместо строчки

RANDOMIZE USR 15619: REM: LOAD "NAME" CODE можно получить

RANDOMIZE USR 15619

Процедуры

Laser Basic не только расширяет графические возможности стандартного Spectrum-Бейсика, но и дополняет его новыми средствами структурного программирования: инструментом процедур.

Процедура — это, по сути дела, подпрограмма, имеющая свои собственные внутренние переменные, называемые локальными. Значения локальных переменных в процессе выполнения процедуры могут меняться, но при выходе из процедуры им возвращаются значения, которые они имели в основной программе. А главное, посредством локальных переменных в процедуру передаются необходимые параметры. Таким образом, процедура, в отличие от подпрограммы, позволяет создавать независимые структурные блоки, которые можно использовать в других программах, не боясь «конфликта переменных».

Процедуры отличаются от подпрограмм также способом их определения и вызова. В Laser Basic каждой процедуре присваивается имя: буква латинского алфавита со знаком $ или без него (всего возможно 52 имени). Определяются процедуры в любом месте программы оператором DEF FN с именем процедуры (набирается DEF FN способом, принятым для Spectrum-Бейсика, клавишами CS/SS+SS/1)57. А чтобы различить процедуру и функцию, определяемую пользователем, после имени процедуры ставится знак #. Например: DEF FN А# или DEF FN q$#.

Блок программы, оформляемый как процедура, начинается с так называемого заголовка процедуры, который может выглядеть, например, так:

100 DEF FN A#(x,y,z,a$,b$)

В заголовке после имени процедуры в скобках58 приводится перечень формальных параметров, то есть числовых и строковых переменных, с которыми надлежит работать процедуре. Формальными параметрами не могут быть массивы.

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

Текст процедуры должен оканчиваться оператором .RETN (аналог RETURN).

Процедуры вызываются оператором .PROCFN с указанием вслед за ним имени процедуры и, в скобках, списка фактических параметров, то есть значений всех переменных, упомянутых в заголовке процедуры. Набирается этот оператор необычным способом: первая его часть (.PROC) — по буквам, a FN — как в Spectrum-Бейсике (CS/SS+SS/2).

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

Рассмотрим несколько примеров. Вот так будет выглядеть определение процедуры, выводящей на экран слово HELP!:

100 DEF FN а$#() 200 PRINT "HELP!" 300 .RETN

Вызывается она просто: 50 .PROCFN а$#()

Можно сделать так, чтобы процедура выводила любой текст в заданном месте:

100 DEF FN а$#(х,у,Ь$) 200 PRINT AT х,у;Ь$ 300 .RETN

После определения этой процедуры для печати, например, слова LASER с 8-й позиции 5-й строки, в программу достаточно вписать:

50 .PROCFN a$#(5,8,"LASER")

Загрузка и запись программ

При запуске записанная таким образом программа должна до встречи какого-либо оператора Laser Basic выполнять один из перечисленных операторов:

RUN, GO ТО или GO SUB (для ленты)

RANDOMIZE USR 58841 и RUN, GO ТО или GO SUB (для дисковода)

Ниже приведен пример загрузчика, который подгружает интерпретатор Laser Basic, программу и спрайт-файл:

10 CLEAR START—1: REM Установка RAMTOP на 1 байт меньше,

чем нижняя граница спрайт-файла 20 LOAD "LASOBJ" CODE: REM Загрузка кодов интерпретатора 30 LOAD "LASLOBJ" CODE 40 RANDOMIZE USR 62464 50 LOAD "GRAPH" CODE

60 RANDOMIZE USR 58841: REM Запуск интерпретатора

70 LOAD "имя" CODE START: REM Загрузка спрайт-файла

80 GO TO 90: REM Выполнение оператора перехода (необходимо

перед первой командой Laser Basic) 90 .POKE 62464,START:.POKE 62466,56575: REM Заполнение ячеек,

хранящих адреса START и END 100 POKE 56575,0

Если в программе не используется спрайт-файл, то выбрасываются строки 70 и 90, а 10-я заменяется на 10 CLEAR 56574

В заключение описания интерпретатора Laser Basic представим распределение памяти при его использовании (табл. 10).

Таблица 10. Распределение памяти при работе с интерпретатором.

P_RAMT (23732)- 65535

Интерпретатор Laser Basic

END (62466/67)- 56575

Область спрайт-файла START (62466/67)-

R AMTOP=ST ART-1 (23730)-

EJJNE (23641)-

Переменные Бейсика

VARS (23627)-

Бейсик-программа PROG (23635)-




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


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

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



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

Похожие статьи:
Coding - о библиотеках в программировании на спектруме.
Партийная зона - Официальные результаты Paradox'99. Paradox'альное путешествие в Ростов.
От авторов - Задержка с выходом номера.
WANTED - Розыск программ...
Что-где-почем - новая поpция пpогpаммного обеспечения от VELа из г.Ковpова.

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