4. ПОДРОБНОЕ ОПИСАНИЕ КОМАНД ЛАЗЕР-БЕИСИКА.
ПРОЦЕДУРЫ ОБРАБОТКИ СПРАЙТОВ.
Все процедуры, описанные в этом разделе, доступны во время
работы программы, но пользоваться ими надо осторожно. Мы настойчиво
рекомендуем малоопытному пользователю создавать свои спрайты через
ГЕНЕРАТОР СПРАЙТОВ.
.SPRT. Предназначается для задания новых спрайтов. Область
спрайтов расширяется вверх. Начало области остается неизменным, а
верхняя граница поднимается на величину: 9*HGT*LEN+5 байтов.
Если номер этого спрайта был ранее задан, то сначала стирается
"старый" спрайт (при этом нижняя граница не сдвигается, а верхняя
понижается), а затем размещается новый.
Если спрайт задается впервые, то данные в него должны быть
внесены оператором, например, .GTBL.
Параметры команды Назначение
SPN Номер помещенного спрайта (1-255)
LEN Длина спрайта в символах (1-255)
HGT Высота спрайта в символах (1-255)
Примечание. Поскольку эта команда расширяет область спрайта
вверх, она имеет ограниченную применимость. Чаще
используется команда .ISPR. Неаккуратное
использование может привести к выходу программы из
строя.
.ISPR. Все то же самое, что и .SPRT, но здесь область спрайтов
развивается вниз. Если спрайт с данным номером уже существует, то
дается сообщение об ошибке.
Если при исполнении этой команды начало области спрайтов
опустится ниже RAMTOP, то программа может выйти из строя.
.WSPR. Служит для стирания существующего спрайта. Верхняя
граница области понижается. Обычно для этой цели применяют .DSPR.
При попытке стереть файл, которого нет, генерируется сообщение об
ошибке. Например:
.SPN= 1: .WSPR
Параметр Назначение
SPN Номер* спрайта, подлежащего стиранию (1 - 255)
.DSPR. Аналогична предыдущей. При стирании спрайтов нижняя
граница области повышается.
ГОРИЗОНТАЛЬНЫЙ "СКРОЛЛИНГ" ЭКРАНА.
Горизонтальный "скроллинг" выполняется на 1,4 или 8 пиксел
влево или вправо с возвратом или без него. Команды:
.WL1V скроллинг влево на один пиксел с возвратом
.WR1V скроллинг вправо.на один пиксел с возвратом
.SL1V скроллинг влево на один пиксел без возврата
.SR1V скроллинг вправо на один пиксел без возврата
. WL8V" —
.WR8V то же на 8 пикселов
. SL8V
.SR8V —1
Параметры команд Назначение
COL Номер левого крайнего столбца (0-31)
ROW Номер строки (0-2 3)
LEN Длина окна (1-32)
HGT Высота окна (1-24)
Вышеописанные команды работают с экраном, выполняя "скроллинг"
окна, размеры которого - LEN и HGT, а координаты COL и ROW.
"Скроллинг" на произвольное количество пикселов Вы можете
выполнить последовательной подачей ряда вышеописанных команд.
ВЕРТИКАЛЬНЫЙ "СКРОЛЛИНГ" ЭКРАНА.
Работа этих команд похожа на работу команд горизонтального
"скроллинга", но в добавление к параметрам окна COL, ROW, HGT, LEN
добавляется переменная NPX, которая задает размер и направление
"скроллинга" в пикселах.
.NPX =-1 - на один пиксел вниз
.NPX = 1 - на один пиксел вверх
Команды Действие
.WCRV Вертикальный "скроллинг" с возвратом
.SCRV Вертикальный "скроллинг" без возврата
Примечание: Все вертикальные "скроллинги" пикселов или
атрибутов экрана или спрайтов требуют пространства
в буфере. Потребное пространство определяется
перемножением NPX и LEN. Его объем не должен
превышать 256 байтов, поскольку в качестве
временного хранилища используется память
принтерного буфера.
Проверка может быть выполнена следующей строкой
LET Х= ?NPX: LET Y= ?LEN:
IF ABS(X)*Y<256 THEN .WCRV
"СКРОЛЛИНГ" АТРИБУТОВ ЭКРАНА.
"Скроллинг" атрибутов похож на "скроллинг"
выполняется на ширину символа и всегда с возвратом.
пикселов,
Команда Действие
.ATLV скроллинг атрибутов влево
.ATRV скроллинг атрибутов вправо
.ATUV скроллинг атрибутов вверх
.ATDV скроллинг атрибутов вниз
Параметры
COL(0-31) ROW(0-23)
HGT(1-32) LEN(1-24)
ГОРИЗОНТАЛЬНЫЙ "СКРОЛЛИНГ" СПРАЙТОВ.
Выполняется на 1, 4 или 8 пикселов влево, вправо, как с
возвратом, так и без. Если спрайт не присутствует в памяти, то
генерируется сообщение об ошибке.
Команды
. WL1M
. WR1M
.SLIM
. SR1M
Действие
влево на один пиксел с возвратом
вправо на один пиксел с возвратом
влево на один пиксел без возврата
вправо на один пиксел без возврата
Команды
. WL1M
. WR1M
.SLIM
. SR1M
Параметр SPN - номер спрайта.
ВЕРТИКАЛЬНЫЙ "СКРОЛЛИНГ" СПРАЙТОВ.
Работа аналогична вертикальному "скроллингу" экрана.
Команда Действие
.WCRM Вертикальный скроллинг с возвратом
.SCRM то же без возврата
Параметр Примечание
SPN номер спрайта (1-255)
NPX направление и количество пикселов
"скроллинга".
"СКРОЛЛИНГ" АТРИБУТОВ СПРАЙТА.
4 команды для "скроллинга" в 4-х направлениях на 1 символ с
возвратом.
Команда Действие
.ATLM влево
.ATRM вправо
.ATUM вверх
.ATDM ВНИЗ
Параметр: SPN - номер спрайта (1-255).
ОПЕРАТОРЫ GET И PUT. ГРУППА 1.
Операторы PUT помещают спрайт на экран или в другой спрайт.
GET выполняет противоположное действие - берет данные с экрана или
из спрайта и помещает их в спрайт. Имеются 3 группы операторов GET
и PUT. Первая группа, наиболее быстродействующая, выполняет опера-
ции между целым спрайтом и предварительно заданным окном. Всем этим
командам предшествует "GT" или "РТ". Эта первая группа не имеет
специальных команд для перемещения пикселных данных и атрибутов, а
вместо этого имеет переключатель атрибутов (см. .ATOF, .ATON) для
перемещения пикселов без атрибутов или с ними.
Команды Действие
.GTBL поместить блок из экрана в спрайт
.GTOR наложить по принципу "OR" (ИЛИ) блок экрана на спрайт.
.GTXR наложить по принципу "XOR" (исключающее ИЛИ) блок окна
экрана в спрайт.
.GTND наложить по принципу "AND" (И) блок окна в спрайт
.PTBL поместить спрайт в окно экрана
.PTOR наложить по принципу "OR" спрайт на окно экрана
.PTXR то же по принципу "XOR"
.PTND то же по принципу "AND".
Параметры:
COL - номер левой колонки требуемой позиции экрана (0...31)
ROW - номер верхнего ряда (О...23)
SPN - номер спрайта
Например: .SPN= 30: .R0W= 1: . COL= 1: .PTBL - помещает спрайт
номер 30 на экран в позицию (1,1).
Наберите .ATOF (отключение переноса атрибутики), теперь .ROW^S:
.PTBL - спрайт номер 30 появится на экране в другой позиции, но без
атрибутов (обратите внимание на то, что SPN и COL отключать не надо,
поскольку они остаются теми же самыми).
Наберите: .ATON: .PTBL - и спрайт появится с атрибутами.
Оператор GET берет данные *з окна экрана в заданной позиции,
размеры которого равны размеру спрайта, и помещает их в спрайт.
ОПЕРАТОРЫ GET И PUT. ГРУППА 2.
Эти операторы выполняют операции между окнами экрана и окнами
спрайтов. .ATON и .ATOF имеют то же назначение, что и раньше. Здесь
необходимы 4 новых параметра для задания столбца и строки,
определяющих положение окна в спрайте, а также высоты и длины этого
окна. Этим командам предшествует "GW" или "PW".
Команды |
Действие |
|
. GWBL |
перенос блока с экрана в окно спрайта; |
|
. GWOR |
наложение по принципу "OR"; |
|
. GWXR |
то же по принципу "XOR"; |
|
. GWND |
то же по принципу "AND"; |
|
. PWBL |
перенос блока из окна спрайта на экран; |
|
. PWOR |
наложение по принципу "OR"; |
|
. PWXR |
наложение "XOR"; |
|
. PWND |
наложение "AND"; |
|
. GWAT |
перенос атрибутов блока с экрана в окно |
спрайта; |
. PWAT |
перенос атрибутов блока из окна спрайта |
на экран |
Параметры:
COL - номер столбца позиции на экране (0...31)
ROW - номер строки позиции на экране (0...23)
SCL - координата левой границы окна спрайта (от 0 до длины
спрайта минус 1)
SRW - координата верхней строки окна спрайта (от О до
высоты спрайта минус 1)
HGT - высота окна (1...24)
LEN - длина окна (1...32)
SPN - номер спрайта (1...255)
ОПЕРАТОРЫ GET И PUT. ГРУППА 3.
Эта группа, по-видимому, наиболее широко применяемая, содержит
команды для операций между спрайтом и окном в другом спрайте. Эти
команды начинаются с "РМ" или "GM".
Команды Действие
.GMBL перенос спрайта в окно другого спрайта
.GMOR наложение по принципу "OR"
.GMXR то же, но по принципу "XOR"
.GMND то же, но по принципу "AND"
.PMBL перенос окна спрайта в другой спрайт
.PMOR наложение по принципу "OR"
.PMXR то же по "XOR"
.PMND то же по "AND"
.GMAT перенос атрибутики спрайта в окно другого спрайта
.РМАТ перенос атрибутики окна спрайта в другой спрайт
Параметры:
SP1 - номер первого спрайта (1...255)
SP2 - номер второго спрайта (1...255)
SCL - координата левой границы окна спрайта (от 1 до длины
спрайта)
SRW - координата верхней строки окна спрайта (от 1 до
высоты спрайта)
ОПЕРАТОР .MOVE
Используется для эффекта мультиплицированного перемещения
спрайтов. Операция выполняется только по "OR" или "XOR". Поэтому,
прежде чем перемещать спрайт по экрану, его надо сначала туда по-
местить через .PTXR.
Параметры.
COL - номер столбца спрайта, подлежащего перемещению
(О. . .31)
ROW - номер его строки (0...23)
HGT - величина перемещения по вертикали (-24...+24)
LEN - длина перемещения по горизонтали (-32...+32)
SP1 - номер спрайта, подлежащего перемещению (1...255)
SP2 - его номер после перемещения (1...255)
По команде .MOVE берется через PUT спрайт SP1 с позиции экрана,
заданной ROW и COL и помещается спрайт SP2 в позицию COL + LEN, HGT
+ ROW.
ОПЕРАТОРЫ .ATON, .ATOF.
Эти две команды определяют, надо ли переносить атрибуты
спрайтов при выполнении команд PUT и GET.
Команды Действие
.ATON включение переноса атрибутов.
•ATOF выключение.
ИЗМЕНЕНИЕ ИЗОБРАЖЕНИЯ.
.INVV - инвертирование окна экрана. Инвертирование - включение
выключенных пикселов и выключение включенных. Цвета INK и PAPER
меняются местами. Параметры для окна: COL, ROW, HGT, LEN.
•INVM - аналогичная операция, но выполняется над спрайтом,
номер которого задан переменной SPN. Параметры: SPN.
.MIRV - содержимое окна зеркально отображается относительно
вертикальной оси, проходящей через его центр. Параметры COL, ROW,
HGT, LEN.
♦MIRM - содержимое спрайта, номер которого задан SPN, зеркально
отображается относительно вертикальной оси, проходящей через его
центр. Параметр SPN
.MARV - зеркальное отражение атрибутов окна относительно
вертикальной оси. Параметры: COL, ROW, HGT, LEN.
.MARM - то же для спрайта. Параметр SPN.
♦SPNM - поворот спрайта SP2 на 90 градусов по часовой стрелке.
После поворота присваивается номер SP1. Если первый имел размеры,
например, 3*8, то второй должен иметь 8*3. Параметры: SP1, SP2.
Замечание. Спрайт SP1 должен быть предварительно очищен
командой .CLSM.
.DSPM - увеличение размеров спрайта SP2. После увеличения
присваивается номер SP1. Спрайт SP1 должен иметь точно вдвое большие
размеры по сравнению с SP2. Параметры: SP1, SP2.
ПРОЧИЕ КОМАНДЫ.
♦SETV - установка постоянных атрибутов INK и PAPER в заданном
окне. Параметры: COL, ROW, HGT, LEN.
.SETM - то же, но для спрайта, заданного в SPN. Параметр SPN.
.CLSV - очистка заданного окна экрана (атрибуты не
задействованы).
.CLSM - то же, но для спрайта. Параметр SPN.
.ADJM - эта команда служит для настройки переменных COL, ROW,
HGT, SCL, SRW, SPN таким образом, чтобы отдельный спрайт мог быть
взят командами PUT или GET 2-ой группы. Значения ROW, HGT, LEN, SCL,
SRW могут меняться при исполнении команды. До исполнения SCL и SRW
должны быть равны нулю.
Параметры.
SPN - номер спрайта, который надо взять.
C0L - номер столбца.
ROW - номер строки.
SCL - установить в О до исполнения команды.
SRW - то же.
.ADJV - назначение то же, что и в предыдущей команде, но не для
спрайта, а для окна. Параметры: COL, ROW, HGT, LEN.
ПРИСВАИВАНИЕ.
Команд этой группы всего 11. Эти команды присваивают графичес-
ким переменным значения Бейсиковских выражений (использовать коман-
ды режима "Е" нельзя).
.COL= .ROW= .HGT= .LEN=
.SP1= .SP2= .SPN= .SRW=
. SCL= .NPX= .SET=
ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ.
Их всего 16:
?COL ?ROW ?HGT ?LEN
?SPN ?SP1 ?SP2 ?SET
?SCL ?SRW ?NPX ?KBF
?SCV ?SCM ?TST ?PEK
Их форма: LET Var= ?FUN,
где: VAR - обычная Бейсиковская переменная;
?FUN - одна из этих 16 функций.
Эти функции не должны быть частью Бейсиковских выражений. 7C0L
- выдает значение переменной COL. Аналогично: ?ROW, ?HGT, ?LEN,
?SPN, ?SP1, ?SP2, ?SCL, ?SRW, ?SET, ?NPX.
?KBF - эта функция предназначена для определения нажатия кла-
виши. Она проверяет заданную клавишу и выдает ненулевой результат,
если клавиша была нажата или нулевой, если нет. Параметры ROW и COL
служат для задания полуряда и столбца на клавиатуре "Спектрума".
Ряд |
|
Клавиши |
1 |
от |
CAPS SHIFT |
2 |
от |
А до G |
3 |
от |
Q ДО Т |
4 |
от |
1 ДО 5 |
5 |
от |
0 до 6 |
6 |
от |
Р ДО Y |
7 |
от |
ENTER ДО Н |
8 |
от |
SPACE ДО В |
Примечание: Пользователи "Спектрума" с расширенными клавиату-
рами должны иметь в виду, что при расчете COL и ROW дополнительные
клавиши не учитываются. Отсчет "COL" ведется по рядам снаружи вов-
нутрь .
?SCV - По этой команде элементарный блок экрана (8*8), положе-
ние которого задано пременными COL и ROW, проверяется на предмет
включения пиксела. Если есть включенные пикселы, то выдается ре-
зультат, отличный от нуля, в противном случае нуль. Если ROW и COL
выходят за пределы экрана, то результат будет случайным.
Эта функция применяется очень часто, например, для определения
момента столкновения спрайтов. Для этого проверяется состояние
пикселов элементарного блока (8*8), находящегося впереди движущегося
спрайта.
?SCM - по этой команде проверяются пикселы спрайта, номер
которого содержится в SPN. Если есть включенные пикселы, выдается
ненулевой результат и наоборот.
?TST - отыскивается спрайт, номер которого хранится в SPN.
Если его нет, то выдается сообщение об ошибке Q. Если он найден,
выдается его адрес, а переменные HGT и LEN принимают значения,
равные его размерам.
Примечание: Спрайты хранятся в памяти в следующем формате:
Байт 1 - номер спрайта;
Байт 2 - младший байт адреса следующего спрайта;
Байт 3 - старший байт адреса следующего спрайта;
Байт 4 - длина спрайта;
Байт 5 - высота спрайта.
8* HGT*LEN +5 байтов - данные о состоянии пикселов.
HGT и LEN - атрибуты.
?РЕК<> - это 16-битная версия оператора РЕЕК. В отличие от
прочих функций она имеет при себе выражение о, в котором содержится
адрес. Например:
LET Х=?РЕК (64264) эквивалентно: LET Х=РЕЕК(64264)+256*РЕЕК(64265)
ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ.
POKE X,Y - это 16-битная версия обычного Бейсиковского РОКЕ. Она
помещает младший байт числа Y в X, а старший байт Y в Х+1. Диапазон
Y - (О...65535), а X - (О...65534).
ПРОЦЕДУРЫ.
Одной из сильных возможностей языков, позволяющих выполнять
структурное программирование, как PASCAL, BASIC ВВС - является
возможность использования процедур. Что такое процедура?
Часто какая-то последовательность инструкций нужна во многих
частях программы. Для этого многие языки программирования используют
подпрограммы. Например, АССЕМБЛЕР имеет инструкцию CALL, a BASIC
GO SUB. Часто пользователю бывает необходимо передать переменную в
подпрограмму так, чтобы не были нарушены значения переменных из
других частей программы. Для этого необходимы ЛОКАЛЬНЫЕ переменные,
а этого понятия в стандартном Бейсике нет.
ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ.
При задании процедуры ее описание содержит список параметров,
которые могут быть строками, но не массивами, например:
10 DEF FN A#(X,Y,Z,A$,B$)
Необходимо помнить, что DEF FN - это ключевое слово на клавише
1, т.е. набирается не по буквам.
Здесь параметры X,Y,Z,A$,B$ - локальные переменные. Это
означает, что значения, полученные ими внутри процедуры А# не
повлияют на их значения в других частях программы.
Все другие переменные, задействованные в процедуре, будут
глобальными, т.е. значения, полученные ими в данной процедуре, будут
задействованы и во всех других частях программы.
ВЫЗОВ ПРОЦЕДУРЫ.
Для выполнения приведенной выше процедуры используется опера-
тор:
.PROCFN А#(3,2,К,"HELLO",В$)
Здесь FN - ключевое слово на клавише 2. Тогда локальные
переменные примут значения:
X = 3 Y = 2 Z = К
А$ = "HELLO" В$ = В$
Процедура должна всегда заканчиваться командой .RETN (аналог
RETURN). После него управление передается оператору, следующему за
вызовом процедуры.
Следует отметить, что исполнение процедур, как и функций
заданных пользователем, идет тем быстрее, чем ближе к началу
программы расположено их определение.
Разрешается применять до 52 процедур (26 букв латинского
алфавита + 26 букв со знаком $). Чтобы отличить процедуры от функций
пользователя, после имени процедуры должен стоять знак #. Например:
DEF FN А# = О
DEF FN С# = О
DEF FN С$# = О, и т.д.
ВЛОЖЕННЫЕ ПРОЦЕДУРЫ.
Определение процедуры может включать в себя определение другой
процедуры, но при этом надо помнить, что значения локальных
переменных для внутреннего вызова распространяются и на первый
(внешний) вызов. Рассмотрим далее ряд примеров для пояснения всего
вышеизложенного.
Процедура для того, чтобы напечатать на экране слово "HELLO"
будет выглядеть так:
10 DEF FN А$#( )
20 PRINT "HELLO"
3 0 .RETN
Здесь в процедуре скобки пустые, поскольку никакие параметры не
нужны. Вызывается эта процедура для исполнения командой
.PROC FN А$#( )
Если Вы хотите, чтобы слово "HELLO" было напечатано в заданном
месте экрана с координатами X,Y, то процедура выглядит так:
10 DEF FN А$ #(X,Y)
20 PRINT AT X,Y; "HELLO"
3 0 .RETN
Вызов, например, такой: .PROC FN A$#(1,10) - слово "HELLO"
будет напечатано в позиции 1,10, т.е.: X = 1; Y = 10.
Если Вы хотите, чтобы по Вашей процедуре печаталось любое
слово, то:
10 DEF FN А$ #(X,Y,А$)
20 PRINT AT X,Y;А$
3 0 .RETN
Чтобы печаталось слово "GOODBYE", вызывайте процедуру теперь
так:
PROC FN А$#(5,8,"GOODBYE").
И, наконец, чтобы посмотреть, насколько локальные переменные не
зависят от переменных с тем же именем в основной программе,
наберите:
10 DEF FN А$ #(X,Y,А$)
20 PRINT AT X,Y;A$
3 0 .RETN
40 LET A$ = "GOODBYE": LET X = 1: LET Y = 2
50 PRINT Y,X;A$
60 .PROC FN A$(3,4,"HELLO")
70 PRINT Y,X,A$
Предупреждаем! Включение процедур в ЛАЗЕР-БЕЙСИК
затрагивает систему защиты собственного
стека "Спектрума". Поэтому возвраты из
подпрограммы RETURN после GO SUB и .RETN
после .PROC должны выполняться в правильном
порядке. Иначе программа может выйти из
строя.
5. ТЕХНИКА ПРОГРАММИРОВАНИЯ.
Последующие разделы дадут начинающим некоторые полезные советы
по технике программирования на языке ЛАЗЕР-БЕЙСИК.
ДВИЖЕНИЕ СПРАЙТОВ.
Существует много способов организации перемещения спрайтов по
экрану. Проблема состоит в выборе наиболее удобного. Они
отличаются скоростью, простотой, плавностью перемещений и
необходимым объемом памяти. Начнем с самых простых способов и
перейдем к более изысканным.
СКРОЛЛИНГ ЭКРАНА ПОД УПРАВЛЕНИЕМ ОТ КЛАВИАТУРЫ.
Используется, когда спрайт движется по окну экрана, не
содержащему других спрайтов или данных. Выполним скроллинг окна на
один пиксел, используя функцию ?KBF.
10 |
INK 6: |
PAPER 0: BRIGHT 1: BORDER 0:CLS |
|
|
20 |
.COL = |
14 |
: .ROW = 10: .SPN = 2: |
: .PTBL |
|
|
30 |
.SET = |
5 : |
•COL = 5: .ROW = 4 |
|
|
|
40 |
• SET = |
6: |
.COL = 3: .ROW = 5 |
|
|
|
50 |
.SET = |
7 : |
•COL = 0: .ROW = 10: |
.LEN = 32: |
.HGT = 2 |
|
60 |
.SET = |
5: |
LET KB = ?KBF: IF KB |
<> 0 THEN |
.SET = 7: |
. WL1V |
70 |
.SET = |
6: |
LET KB = ?KBF: IF KB |
<> 0 THEN |
.SET = 7: |
. WR1V |
80 |
GO TO |
60 |
|
|
|
|
ИСПОЛЬЗОВАНИЕ ОПЕРАТОРА PUT.
ИСПОЛЬЗОВАНИЕ ОПЕРАТОРА PUT.
Второй простой метод состоит в помещении спрайта на экран
оператором PUT, меняя при этом значения ROW и COL.
Спрайт, используемый для этой техники, должен иметь вокруг себя
бордюр шириной в один символ.
Возьмем спрайт номер 30 размером 3*3. Сначала очистим данные в
спрайте:
.SPN = 30: .CLSM
Теперь поместим в его центр спрайт номер 51 (размер 1*1).
SP1 = 51: .SP2 = 30: .SCL = 1: .SRW = 1: .GMBL
Программа для его перемещения с помощью курсорных клавиш
(нажатие их проверяется ?KBF) будет выглядеть так:
10 |
.ATOF: |
INK 5: BRIGHT 1: PAPER 0 |
: BORDER 0:CLS |
|
20 |
.SET = |
1 : |
: .ROW = 4: |
.COL = 5 |
|
|
30 |
.SET = |
2 : |
: .ROW = 5: |
.COL = 5 |
|
|
40 |
.SET = |
3 : |
: .ROW = 5: |
.COL = 4 |
|
|
50 |
.SET = |
4 : |
: .ROW = 5: |
.COL = 3 |
|
|
60 |
.SET = |
7 : |
: .ROW =10 |
: .COL = 13: |
.SPN = 30 |
|
70 |
.LET X |
= |
13: LET Y |
= 10 |
|
|
80 |
.SET = |
1: |
: LET KB = |
?KBF: IF KB |
<> 0 THEN LET X |
= X-l |
90 |
.SET = |
2 : |
; LET KB = |
?KBF: IF KB |
<> 0 THEN LET Y |
= Y+l |
100 .SET = 3: LET KB = ?KBF: IF KB <> 0 THEN LET Y = Y-l
110 .SET = 4: LET KB = ?KBF: IF KB <> 0 THEN LET X = X+l
120 IF X > 30 THEN LET X = 30
130 IF X < -1 THEN LET X = -1
140 IF Y > 22 THEN LET Y = 22
150 IF Y < -1 THEN LET Y = -1
160 .SET = 7: .COL = X: .ROW = Y: .PTBL
170 GO TO 80
Большим ограничением этого метода является то, что данные,
имеющиеся на экране, будут стираться в результате прохождения
спрайта по ним. Для устранения этого недостатка применяют логические
операции. В ЛАЗЕР-БЕЙСИКе их три - "OR" ("ИЛИ"), "XOR" ("ИСКЛЮЧАЮЩЕЕ
ИЛИ"), "AND" ("И").
Если два спрайта накладываются по принципу "OR", то в
результате будут включены те пикселы, которые были выключены в одном
из этих спрайтов или в обоих вместе.
По принципу AND" результат будет содержать включенными только
те пикселы, которые были включены и в первом и во втором спрайте
одновременно.
По принципу "XOR" - включены те, которые были включены в одном
из двух, но те, которые были включены в обоих вместе, будут
выключены.
Использовать "OR" или "XOR" можно через операторы .PTOR или
.PTXR.
Так, через .PTOR данные экрана накладываются после перемещения
спрайта в новую позицию, что исключает стирание.
Через .PTXR спрайт снимается с экрана и снова помещается рядом,
что также дает движение спрайта без стирания основного изображения.
ИСПОЛЬЗОВАНИЕ КОМАНДЫ .MOVE
После того, как заданы значения COL и ROW и задано их
перемещение на каждом шаге HGT и LEN, каждое исполнение команды
.MOVE приводит к увеличению COL и ROW.
10 INK 0: PAPER 0: BRIGHT 1: BORDER 7: CLS: .ATOF
20 FOR N = 1 TO 100
30 LET X = INT(RND*32): LET Y = INT(RND*22)
40 PRINT AT Y,X;"*"
50 NEXT N
60 LET DR = 1: .HGT = DR: LET DC = 1: .LEN = DC
70 .SP1 = 50: .SP2 = 50: LET R = 10: .ROW = R:
LET С = 13: .COL = C: .SPN = 50: .PTXR
80 .MOVE
90 LET С = ?COL: LET R = ?ROW
100 IF С = 29 OR R = 0 THEN LET DC = DC-1:
.LEN = DC: BEEP 0.01,5
110 IF R = 19 OR R = 0 THEN LET DR = DR-1:
.HGT = DR: BEEP 0.01,5
120 GO TO 80
ПОМЕЩЕНИЕ СПРАЙТА НА ЭКРАН С ПОВЫШЕННОЙ ТОЧНОСТЬЮ.
ЛАЗЕР-БЕЙСИК не имеет команд для установки спрайтов на экран с
точностью до пиксела. Для тех, кто хочет перемещать спрайты по
экрану с более высокой разрешающей способностью, можно рекомендовать
следующий метод.
Если Вам надо переместить спрайт слева направо с шагом по 2
пиксела, а скроллинг экрана при этом делать нельзя, то нужно сначала
с помощью программы ГЕНЕРАТОР СПРАЙТОВ создать 4 спрайта, каждый из
которых сдвинут относительно предыдущего вправо на 2 пиксела. Если
их пронумеровать от 1 до 4, то программа будет выглядеть так:
10 FOR С = 0 ТО 31
20 .COL = С: .SPN = 1: .PTBL: .SPN = 2: .PTBL
30 .SPN = 3: .PTBL: .SPN = 4: .PTBL
4 0 NEXT С
ОПРЕДЕЛЕНИЕ СТОЛКНОВЕНИЯ СПРАЙТОВ.
Для этого служат команды ?SCV, ?SCM. ?SCV служит для проверки
позиции символа на экране. Если в позиции заданной COL и ROW нет
ничего, выдается нуль, в противном случае какое-либо число. Иногда
этого бывает недостаточно, тогда пользуются более мощной, хотя и
более медленной командой ?SCM. Она проверяет спрайт, номер которого
находится в SPN и выдает нуль, если там нет включенных пикселов, в
противном случае какое-либо число. Эта команда обычно используется
для выполнения следующих функций:
- для проверки "столкновения" спрайтов;
- для определения, что находится в данном квадрате;
- для отыскания заданного объекта на экране.
Проверка на "столкновение" наиболее часто проводится для
определения наложения движущегося спрайта на какой-либо графический
символ, находящийся на экране.
В основе лежит следующий метод. Примем часть экрана в том
месте, где предполагается размещение спрайта за квази-спрайт. Затем
.PTND спрайт и этот квази-спрайт, а затем проверить ?SCM. Если
значение не нуль, то столкновение (коллизия) произошло. Но здесь
есть недостаток в том, что если новый спрайт перекрывает старый, то
старый спрайт будет удален до того, как начнется вышеописанная
процедура, и, соответственно, до помещения нового спрайта на экран.
Наилучшее решение - работать через "XOR", т.е. через .PTXR. Надо
взять содержимое окна, наложить по "XOR" его на содержимое старого
спрайта в памяти (чтобы удалить все данные из спрайта), затем
сделать проверку на коллизию с немедленным помещением спрайта на
экран.
Если коллизия произошла, часто бывает полезным узнать, с чем же
спрайт столкнулся. Для начала предположим,что окно экрана, которое
мы обследуем, содержит известный набор символов и никаких прочих
данных там нет. Метод состоит в том, чтобы загрузить квази-спрайт с
графическим объектом и затем сравнить его со спрайтами из набора.
Для этого нужно только наложить проверяемый спрайт на квази-спрайт
по "XOR", а затем сделать ?SCM. Если в результате нуль, то они
идентичны, если же нет, то сделать "XOR" для другого спрайта и т.д.
И, наконец, рассмотрим случай, когда исследуемый объект
содержит кроме одного из возможных спрайтов еще целый ряд данных. В
этом случае проверяемые объекты сначала накладываются по "AND" для
удаления всех лишних данных, затем "XOR", затем "?SCM".
СКРОЛЛИНГ ПЕЙЗАЖА.
Эта операция настолько часто встречается в видеоиграх, что ее
надо рассмотреть отдельно.
Первое правило - это двигать ровно столько, сколько нужно и не
больше. Например, если у Вас есть горный пейзаж, причем горы
занимают в нем три верхних ряда, то надо эти три ряда и двигать.
Самый простой и эффективный метод плавного перемещения - это
пожертвовать одним столбцом экрана для организации обмена со
спрайтом, подлежащим скроллингу. Вы двигаете спрайт шириной 4 или 5
экранов и расположенный в строках с 8 по 10 (3 строки).
Предположим, что скроллинг идет на пиксел и горизонтального
перемещения атрибутов нет, фактически все равно, каким столбцом мы
пожертвуем - самым правым (31) или самым левым (0). Давайте
используем столбец 0. Нам надо задать окно в левом столбце шириной в
один символ и высотой в три символа, задав в нем одинаковые INK и
PAPER, т.е. пикселы в нем видны не будут. Это делается командой
.SETV.
Теперь 31 столбец спрайта помещаются на активную часть экрана
по команде .PWBL. Если скроллинг идет вправо, то в это
вспомогательное окно помещается 32-й столбец спрайта, затем
выполняется скроллинг на один пиксел 8 раз, в дополнительный столбец
помещается 3 3-й столбец спрайта и т.д.
Если скроллинг идет влево, то вспомогательное окно организуется
на правом краю экрана.
ПЕРЕЗАДАНИЕ НАБОРА СИМВОЛОВ И СИМВОЛОВ ГРАФИКИ ПОЛЬЗОВАТЕЛЯ.
21 символ UDG (графики пользователя), имеющиеся в стандартном
Бейсике, здесь недопустимы. Но тем не менее, многие пользователи
знают о существовании системной переменной CHARS, указывающей на
адрес в памяти, который на 256 байтов меньше, чем начало набора
символов в ROM (от 32-го символа ASCII до 128-го). Пользователь
может заслать новое значение в CHARS, чтобы эта переменная указывала
на другую область памяти где будет размещен новый набор символов.
Очевидным местом хранения набора символов является область спрайтов.
НАБОРЫ ПЕРЕМЕННЫХ.
Широкое применение 16 наборов переменных значительно повышает
скорость программных вычислений. Если, например, Вы хотите
перемещать 4 окна на экране, Вы можете задать параметры для каждого
окна в виде набора переменных, например:
SET = |
1: |
.HGT = |
5 : |
.LEN = |
5 : |
.ROW = |
0 : |
.COL = |
0 |
SET = |
2 : |
.HGT = |
4 : |
.LEN = |
6 : |
.ROW = |
0 : |
.COL = |
5 |
SET = |
3 : |
.HGT = |
6 : |
.LEN = |
4 : |
.ROW = |
0 : |
.COL = |
12 |
SET = |
4 : |
.HGT = |
7 : |
.LEN = |
3 : |
.ROW = |
0: |
.COL = |
18 |
Теперь для того, чтобы выполнить скроллинг для каждого окна,
достаточно задать:
Теперь для того, чтобы выполнить скроллинг для каждого окна,
достаточно задать:
.SET = 1: .WR1V: .SET = 2: .WL2V: .SET = 3: .WL8V:
.SET = 4: .WR1V
6. ЗАГРУЗКА И ЗАПИСЬ ПРОГРАММ В ЛАЗЕР-БЕЙСИКЕ.
Программы могут быть загружены или выгружены как подачей прямой
соответствующей команды, так и из программы.
ЗАГРУЗКА И ЗАПИСЬ ПРЯМОЙ КОМАНДОЙ.
Чтобы записать неавтостартующую программу напрямую, используй-
те :
для ленты: SAVE "filename"
для микродрайва: SAVE * "m"; N; "filename"
Если хотите, можете помещать несколько "SAVE" и "LOAD" в одну
инструкцию, например:
SAVE "filename": LOAD "filename" CODE
Если дальше Вы хотите подать прямую команду стандартного
Бейсика, то действуйте обычным порядком, а если команда из
расширенного интерпретатора, то между ней и LOAD или SAVE должно
стоять RANDOMISE USR 58841, например:
SAVE * "m";N;"filename": LOAD * "m";N;"filename" CODE:
RANDOMISE USR 58841: .RENK: .RNUM
Большинство пользователей делят такую инструкцию на две. В этом
случае нет необходимости давать RANDOMISE USR 58841. Например:
SAVE * "m";N;"filename": LOAD * "m";N; "filename" CODE
с последующей подачей .REMK: .RNUM
ЗАПИСЬ АВТОСТАРТУЮЩЕЙ ПРОГРАММЫ ПРЯМОЙ КОМАНДОЙ.
SAVE "filename" LINE N
SAVE * "m";N; "filename" LINE N
Записанная таким образом программа должна выполнять одну из
нижеописанных команд до того, как встретится какая-либо команда из
расширенного интерпретатора:
RUN, GO ТО, GO SUB - для ленты
RANDOMISE USR с последующим RUN, GO ТО или GO SUB -
для микродрайва.
ЗАПИСЬ ПРОГРАММЫ ИЗ ПРОГРАММЫ.
Программы, записанные из программы, могут быть загружены тоже
только из программы. Программы, записанные прямой командой, загру-
жаются также прямой командой.
Примечание. Прежде, чем пользоваться одной из приведенных схем
загрузки (выгрузки), необходимо загрузить и
запустить программу "LASER BASIC". Она должна быть
резидентной.