Системные программы для ZX-Spectrum 1992 г.

LASER-BASIC - продолжение описания. Работа с изображением.


ИЗМЕНЕНИЕ ИЗОБРАЖЕНИЯ

. INW — инвертирование окна экрана. Инвертирование — включение/выключение пикселей. Цвета INK и PAPER меняются цветами. Параметры для окна: .COL,

.ROW, .HGT, .LEN.

. invm — такая же операция, но над спрайтом, номер которого задан SPN. Параметры: .SPN.

•MIRV — содержание окна, зеркально отображенного

относительно вертикальной оси, проходящей через его центр.

. MIRM — содержание спрайта, номер которого задан SPN, зеркально отображается относительно оси, проходящей через его центр.

. MARV — зеркальное отображение атрибутов окна относительно вертикальной оси. Параметры: .COL, .ROW, .HGT, .LEN . MARM — то же самое для спрайта. Параметры: .SPN.

•SPNM — поворот спрайта SP2 на 90 градусов по часовой стрелке. После поворота присваивается номер SP1.

ПРИМЕР: Если первый имел размер 3*8, то второй — 8*3. Спрайт SP1 должен быть предварительно очищен командой .CLSM.

•DSPM — увеличение размеров спрайта SP1. После увеличения присваивается номер SP1. SP1 должен иметь точно вдвое большие размеры но сравнению с SP2.

 

ДРУГИЕ КОМАНДЫ

. SETV — установка постоянных атрибутов INK и PAPER в заданном окне.

. SRTM — то же для спрайта, заданного в SP2. Параметры:

SPN

.CLSV — очистка заданного окна экрана (атрибуты не задействованы).

. CLSM — то же, но для спрайта. Параметры: SPN

. ADJM — эта команда служит для настройки переменных: COL, ROW, HGT, SCL, SRW, SPN, таким образом, чтобы отдельный спрайт мог быть взят командами PUT или GET второй группы. Значения ROW, HGT, LEN, SCL, SRW, могут меняться при исполнении команды. До исполнения SCL и SRW должны быть равны 0.

• ПАРАМЕТРЫ:

. SPN — номер спрайта, который нужно взять,

. COL — номер столбца,

. ROW — номер строки,

. SCL — установить в 0 до исполнения команды,

. SRW — то же,

. ADJV — то же, но не для спрайта, а для окна. Параметры:.COL, .ROW, .HGT, .LEN.

 

ПРИСВАИВАНИЕ

Их всего 11. Эти команды присваивают графическим переменным значение выражений бейсика. Использовать команды режима "Е" нельзя.

.COL=    .ROW=    .HGT=    .LEN=

.SP1=  .SP2=  .SPN=  .SRW= .SCL=  .NPX=  .SET==

• ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ

Их всего 16:

?COL PROW ?NGT ?LEN

?SPN   ?SP1   ?SP2   ?SET

?SCL   ?SRW   ?NPX   ?KBF

?SCV   ?SCM   ?TST   ?PEK

Их форма: LET VAR = ?FUN, где VAR — переменная беисика, ?FUN — одна из 16-и функций.

Эти функции не должны быть частью выражений беисика.

7COL — выдает значение переменной COL. и т.п.

?KBF — эта функция предназначена для определения нажатия клавиши. Она проверяет заданную клавишу и выдает ненулевой результат при нажатии.

Переменные ROW и COL служат для задания полуряда и столбца на клавиатуре.

РЯД

КЛАВИШИ

1

ОТ CS ДО V

2

ОТ А ДО G

3

ОТ Q ДО Т

4

ОТ I ДО S

5

ОТ 0 ДО G

6

ОТ Р ДО Y

7

ОТ ENTER ДО Н

8

ОТ SPACE ДО В

 

Отсчет COL ведется по рядам снаружи внутрь.

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

?SCM — по этой команде проверяются пиксели спрайта, номер которого содержится в SPN. Если есть включенные пиксели, выдается нулевой результат и наоборот.

?TST — отыскивается спрайт, номер которого хранится в SPN. Если его нет, то выдается сообщение об ошибке. Если он

найден, выдается его адрес, а переменные HGT и LEN принимают значения, равные его размерам.

Спрайты хранятся в памяти в следующем формате:

Байт 1 — номер спрайта.

Байт 2 — младший байт адреса следующего спрайта.

Байт 3 — старший байт адреса следующего спрайта.

Байт 4 •*- длина спрайта.

Байт 5 — высота спрайта.

8 * HGT * LEN — данные о состоянии пикселей.

HGT * LEN — атрибуты.

ИТОГО: 9 * HGT * LEN + 5 байтов.

?РЕК — это 16-битовая версия оператора PEEK. В отличие от прочих функций она имеет при себе выражение в скобках, в котором содержится адрес. ПРИМЕР: LET Х - ?РЕК ( 64264 ) эквивалентно

LET Х = PEEK ( 64264 ) + 256 * PEEK ( 64265 )

• ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ

POKE X, Y — это 16-и битовая версия POKE из беисика ZX. Она помещает младший байт числа Y в X, а старший байт Y в Х+1.

Диапазон Х ( 0 — 65534 ), Y (0 — 65535 ).

 

ПРОЦЕДУРЫ.

Одной из сильных сторон языков ПАСКАЛЬ, BASIC ВВС, позволяющих выполнять структурное программирование, является возможность использования процедур. Часто бывает надо передать переменную в программу так, чтобы не были нарушены значения переменных из других частей программы. Для этого нужны локальные переменные. В БЕЙСИКЕ этого понятия нет.

 • ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

При задании процедуры ее описание содержит список параметров, которые могут быть строками, числами. Но не массивами.

Пример:

10 DEF FN A$# (X,Y.Z,A$,B$)

Надо помнить, что ключевое слово DEF FN набирается не по буквам. Здесь параметры X,Y,Z,A$,B$ — локальные переменные, т.е. значения, полученные ими внутри процедуры А, не повлияют на их значения в других частях программы. Все другие переменные, задействованные в процедуре, будут глобальными.

• ВЫЗОВ ПРОЦЕДУР

Для выполнения приведенной выше процедуры используется оператор:

PROC FN А$# (3,2,К."HELLO",B$)

Здесь: FN — ключевое слово на клавиатуре. Тогда локальные переменные примут значения: Х-3; Y-2; Z=K; A$="HELLO"; В$=В.

Процедура должна всегда заканчиваться командой .RETN, после чего управление передается оператору, следующему за вызовом процедуры. Исполнение команд идет тем быстрее, чем ближе к началу программы расположено их определение. Разрешается применять до 52-х процедур (26 букв латинского алфавита +26 букв со знаком $). Чтобы отличить процедуры от функций пользователя, после процедуры должен стоять знак #.

Пример:

DEF   FN   А$#   =   0:    DEF   FN   C$#   =   0

• ВЫПОЛНЕНИЕ ПРОЦЕДУРЫ

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

Пример: Процедура для печати на экране слова "HELLO":

10 DEF FN A$#( )

20 PRINT AT X, Y; "HELLO-30 .RETN

Скобки пустые, поскольку никакие параметры не нужны.

Вызывается эта процедура командой .PROC FN А$#().

Для задания координат надписи ( X, Y):

10 DEF FN А$#( X, У )

20 PRINT AT X, Y; "HELLO"

30    .RETN

Чтобы напечатать "GOOD", теперь вызов:

.PROC FN A$#( 5, 8, GOOD).

Включение процедур в LB затрагивает систему защиты собственного стека ZX, поэтому возвраты из подпрограммы RETURN после GOSUB и .RETN после PROC должны выполняться в правильном порядке.

 

ТЕХНИКА ПРОГРАММИРОВАНИЯ

• ДВИЖЕНИЕ СПРАЙТОВ

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

Выполним скролинг окна на 1 пиксель, используя функцию ?KBF.

10   INK   G:    PAPER   0:    BRIGHT   1:

BORDER 0: CLS 20 ,COL=14 : .ROW=10 : .SPN=2 :.PTBL

30 .SET=5 : .COL=5 s': .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--7KBF : IF KB=0 THEN .SET-7 : .WL1V

70 .SET=6 : LET KB='?KBF : IF KB=0 THEN .SET-7 : .WL1V

80 GOTO 60

• ИСПОЛЬЗОВАНИЕ PUT

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

Возьмем спрайт #30 размером 3*3.

Сначала очистим данные в спрайте:

.SPN;=30 : .CLSM

Теперь поместим в его центр спрайт номер SP1 (Разм. 1*1):

,SP1=50 : .SP2=30 : .SCL=1 : .GMBL

Программа для его перемещения с помощью курсорных клавиш (нажатие их проверяется с помощью ?KBF):

10 .ATOF :  INK 5 : BRIGHT 1  :PAPER :  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-1

90  .SET=2    LET KB='?KBF  :  IF KB<>0   THEN   LET   Y=Y-1

100 .SET=3 : LET KB="''KBF : IF KB<>0 THEN LET X=X+1

110 .SET=1 : LET KB=''KBF : IF KB <>0 THEN LET Y=Y+1

120 IF X>30 THEN LET X=30

130   IF   X<-1   THEN   LET   X=22

140 IF Y>22 THEN LET Y=22

150   IF   Y<-1   THEN   LET   Y=-l

160 .SET=7 : .COL=X : .ROW=Y : •PTBL

170 .GOTO 80

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

OR, XOR, AND.

Если два спрайта накладываются по принципу OR, то в результате будут включены те пиксели, которые были включены в одном из этих спрайтов или в обоих вместе.

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

По принципу XOR — включены те, которые были включены в одном из двух, но те, которые были включены в обоих вместе, будут включены.

Использовать OR или XOR при движении спрайта можно через оператор .PTOR или .PTXR. Так, через .PTOR данные экрана накладываются после перемещения спрайта в новую позицию, что исключает стирание. Через .PTXR спрайт снимается с экрана и снова помещается рядом, что также дает движение спрайта без стирания основного изображения.

ИСПОЛЬЗОВАНИЕ КОМАНДЫ MOVE

После задания значения COL и ROW задается их приращение на каждом шаге HGT и LEN. Каждое исполнение команды •MOVE приводит к увеличению COL и ROW.

10 INK 0 : PAPER 6 : 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 X, Y ; "*"

50 NEXT N

60 LEN DR=1 : .HGT=DR : LET DC=1: .LEN=DC

70 .SP1=50 : .SP2=50 : LET R=10 : .ROW=R : LET C=13 : .COL=C :.SPN=50 : .PTXR

80 .MOVE

90 LET C="COL : LET R='''ROW

100 IE C=29 OR 0=0 THEN LET DC=DC-1 : .LEN=DC : BEEP 0.0,5

110 IF R=19 OR R=0 THEN LET DR=DR-1 : .HGT=DR ; BEEP 0.0,5

120 GOTO 80

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

10 FOR C=0 TO 31 20 .COL=C: .SPN=1: .PTBL: .SPN=2: .PTBL

30 .SPN=3: .PTBL: .SPN=4: .PTBL 40 NEXT С

ОПРЕДЕЛЕНИЕ СТОЛКНОВЕНИЯ СПРАЙТОВ

Для этого служат команды ?SCV и ?SCM.

—SCV служат для проверки позиции символа на экране. Если в позиции, заданной COL и ROL, нет ничего — выдается 0, в противном случае — число. Иноща пользуются более мощной, но более медленной командой ?SCM. Она проверяет спрайт, номер которого находится в SPN, и выдает 0, если там нет включенных пикселей, или число в противном случае. Эта команда обычно используется для выполнения следующих функций:

— для проверки столкновения символов,

— для определения, что находится в заданном квадрате,

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

В основе лежит следующий метод. Примем часть экрана в том месте, где предполагается размещение спрайта, за квазиспрайт. Затем вызвать .PTND для спрайта и квази-спрайта, а затем проверить ?SCM. Если значение не 0, то столкновение (коллизия) не произошло. Но здесь есть недостаток в том, что если новый байт перекрывает старый, то старый спрайт будет удален до того, как начнется вышеописанная процедура, и соответственно до помещения нового спрайта на экран. Наилучшее решение — работает через XOR, т.е. через .PTXR. Надо взять содержимое окна, наложить по XOR его на содержимое.старого спрайта в. памяти (чтобы удалить все данные из спрайта), затем сделать проверку на коллизию с немедленным перемещением спрайта на экран.

Если коллизия произошла, часто бывает полезным узнать, с чем же спрайт столкнулся. Для начала предположим, что окно экрана, которое мы обследуем, содержит известный набор символов и никаких прочих данных там нет. Метод состоит в том, чтобы загрузить квази-спрайт с рабочим объектом и затем сравнить его со спрайтами из набора.

Для этого нужно только наложить проверяемый спрайт на квази-спрайт по XOR, затем сделать ?SCM. Если в результате О, то они идентичны, если нет — то сделать XOR для другого спрайта и т.д.

И, наконец, рассмотрим случай, когда исследуемый объект содержит кроме одного из возможных спрайтов еще целый ряд данных. В этом случае проверяемые объекты сначала накладываются по AND для удаления всех данных, затем XOR, затем ?SCM.

СКРОЛИНГ ПЕЙЗАЖА

Эта операция настолько часто встречается в видеоиграх, что ее надо рассмотреть отдельно.

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

Самый простой и эффективный метод выполнения плавного перемещения — это пожертвовать одним столбцом экрана для организации обмена со спрайтом, подлежащим скролингу. Предположим, что скролинг идет на пиксель и горизонтального перемещения атрибутов нет. фактически все равно, каким столбцом атрибутов мы пожертвуем: самым правым (31) или самым левым  (0). Давайте используем столбец 0. Нам надо задать окно в левом столбце шириной в один символ и высотой в 3 символа, задав в нем одинаковые INK и PAPER, т.е. пиксели в нем видны не будут. Это задается командой .SETV.

Теперь 31 столбец спрайта помещают на активную часть экрана по команде .RWBL. Если скролинг идет вправо, то в это вспомогате-жное окно помещается 32-ой столбец спрайта, затем выполняется скролинг на 1 пиксель 8 раз, в дополнительный столбец помещается 33-й столбец спрайта и т.д.

Если скролинг идет влево, то вспомогательное окно организуется на правом краю экрана.

ПЕРЕЗАДАНИЕ НАБОРА СИМВОЛОВ И СИМВОЛОВ ГРАФИКИ ПОЛЬЗОВАТЕЛЯ

21 символ UDG (графика определяется пользователем), имеющиеся в стандартном бейсике, здесь недопустимы. Существует системная переменная CHARS, указывая на адрес в памяти, который на 256 байт меньше, чем начало набора символов в ROW (от 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    :     .LET=3    :

•ROW=0    :     .COL=18

Теперь, чтобы выполнить скролинг для каждого окна, достаточно знать:

.SET=1 : .WRIV : .SET=2 : .WL2V : .SET=3 : .WL8V :

.SET=4 : .WRIV

 

ЗАГРУЗКА И ЗАПИСЬ ПРОГРАММ В LB

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

• ЗАПИСЬ И ЗАГРУЗКА ПРЯМОЙ КОМАНДОЙ

Для ленты для неавтостартующей программы на прямую:

SAVE "FILENAME".

Для микродрайва:

SAVE •"M";N;"FILENAME".

Если хотите, можете помещать несколько SAV.E и LOAD в одну инструкцию.

Например:

SAVE "FILENAME":LOAD "FILENAME" CODE

Если вы хотите подать прямую команду стандартного бей-сика, то действуйте обычным порядком, а если команда из расширенного интерпретатора, то между ней и LOAD или SAVE должно стоять RANDOMIZE USR 58841.

Например:

SAVE *"М";N;"FILENAME":LOAD *"M";N;"FILENAME" CODE:

RANDOMIZE USR 58841:.RENK:.RNUM или

SAVE *"M";N;"FILENAME".LOAD

”"M";N;"FILENAME" CODE с последующей подачей

.RENK:.RNUM

• ЗАПИСЬ АВТОСТАРТУЮЩЕЙ ПРОГРАММЫ ПРЯМОЙ КОМАНДОЙ Запись производится следующим образом:

SAVE "FILENAME" LINE N SAVE *"M" ;N;"FILENAME" LINE N Записанная таким образом программа должна выполнять одну из нижеописанных до того, как встретится какая-либо команда из расширенного интерпретатора :RUN, GOTO< GOSUB

      для ленты и микродрайва с последующим RANDOMIZE USR 58841.

 • ЗАПИСЬ ПРОГРАММЫ ИЗ ПРОГРАММЫ

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

Прежде чем пользоваться одной из приведенных схем загрузки/выгрузки, надо загрузить и запустить программу LB (она должна быть резидентой),





СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Конкурс - фрагмент #2.
Ответ на письмо №86.
Новелла - Компьютерная новелла "The Neverending Story" часть 2
Реклама - IS-DOS: С 20.01.02 цены на исходные тексты снижены еще вдвое!
About KrNews13 - "чего не хватает сцене сегодня?" насущные вопросы и пути решения.

В этот день...   25 апреля