СПРАЙТЫ
SPROFF, SPRON
Существенным преимуществом системы управления
спрайта-ми MegaBasic по сравнению, скажем, со специализированным
пакетом Laser Basic является обеспечение независимости движения
спрайтов от работы основной программы. Спрайты обрабатываются в фоновом
режиме (с использованием прерываний), а основная программа продолжает
выполняться своим чередом.
MegaBasic способен передвигать одновременно восемь спрайтов. Кроме того, каждый спрайт может содержать набор фазовых картинок, или просто фаз
(до 255), которые в процессе движения спрайта чередуются, создавая
эффект мультипликации. Это еще одна особенность системы управления
спрайтами в MegaBasic. Конечно, возможность одновременной обработки
столь большого количества спрайтов и их фаз чисто теоретическая,
поскольку для размещения такой уймы картинок потребовалось бы 72
килобайта свободной памяти. Но, по крайней мере, один-два
«полных» (то есть включающих 255 фаз) спрайта, занимающих
по 9 килобайт, запустить можно. Замечено, что не все Spectrum-coB-местимые
машины отечественной сборки успешно справляются с одновременной
обработкой большого (свыше четырех) числа спрайтов, независимо от числа
фаз.
Управление спрайтами происходит через ячейки памяти, называемые системными переменными спрайтов.
Записывая в них требуемые значения, можно задавать направление и
скорость движения спрайтов, менять количество фаз и частоту их смены и
т. д. Перемещение спрайтов происходит дискретно. Направление и скорость
движения задается величиной 'шага
(в пикселях) и частотой следования шагов. Движение спрайтов и смена их
фаз — два не зависимых друг от друга и от основной программы
процесса.
По замыслу создателя MegaBasic Майка Лимана, в
один пакет с ним должна входить программа Sprite Designer, формирующая
не только изображения спрайтов, но и, что особенно ценно, файл
системных переменных спрайтов. К сожалению, несмотря на широкое
распространение различных версий MegaBasic, у нас в стране обнаружилось
пренебрежение этой программой. Поэтому пришлось отказаться от
запланированного описания работы со Sprite Designer. Тем не менее, той
информации, которая приводится ниже, а также примера в конце этого
раздела, будет вполне достаточно для овладения довольно сложной
системой управления спрайтами в MegaBasic.
MegaBasic предусматривает использование
спрайтов только одного размера: 16x1 6 пикселей, то есть 2x2
знакоместа. Это, конечно, минус по сравнению с Laser Basic. Однако при
необходимости можно попытаться параллельно запустить несколько
спрайтов, составляющих части одной картинки.
Нетрудно подсчитать, что изображение спрайта,
точнее, одной его фазы, размером 2x2 знакоместа займет в памяти,
включая атрибуты, 36 байт. Объем памяти, необходимый для размещения
всех нужных спрайтов, также легко вычисляется умножением общего числа
фаз всех спрайтов на 36. Соответствующее место необходимо
зарезервировать в памяти с помощью оператора CLEAR.
Каким же образом можно создавать спрайты, не
располагая программой Sprite Designer? Для начала нужно нарисовать все
фазы одного спрайта в каком-либо графическом редакторе и записать
экранный файл. На экране помещаются 192 фазы, этого в большинстве
случаев вполне достаточно. Если мы располагаем картинкой с
изображениями фаз, то дальнейшее превращение ее в полноценный спрайт,
который может обрабатываться MegaBasic, не составит труда. Это
позволяет сделать оператор GET (см. стр. 212). Он предназначен для
записи в память изображения кадра, но применим и для записи спрайтов,
поскольку формат хранения в памяти кадров и спрайтов совершенно
одинаков.
Следующая программа поясняет технологию формирования спрайтов на примере двух спрайтов, каждый из которых состоит из 48 фаз73:
10 CLEAR 41535: FOR М=0 ТО 5: FOR N=1 ТО 16 20 PRINT AT M*2fN*4-4; N+16*M
30 NEXT N: NEXT M: REM Формирование экранного файла 40 DIM Q(96,3)
50 FOR L=1 TO 96: LET Q(L,1)=2*(L-1): IF Q(L,1)>=32 THEN LET
Q(L,1)=Q(L,1)-32*INT ((L-1)/16): REM Гориз. координата 60 LET Q(L,2)=2*INT ((L-1)/16): REM Верт. координата 70 LET Q(L,3)=41500+36*L: REM Адрес размещения фазы 80 GET_0.Q(LI3)IQ(L>2)>Q(L(1)(2,2: REM Запись фазы в память 90 NEXT L
100 SAVE "SPRITES" CODE 41536,96*36: REM Сохранение спрайтов
В этом примере сначала формируется экранный
файл с изображениями фаз спрайтов, представляющими собой
пронумерованные квадратики (для спрайта 0 — с номера 1 по 48, для
спрайта 1 — с номера 49 по 96). Затем фазовые картинки оператором
GET последовательно снимаются с экрана и помещаются в память.
MegaBasic располагает двумя операторами,
которые управляют спрайтами: SPRON и SPROFF (хотя достаточно только
первого, как выяснится из дальнейшего описания).
SPRON_s,m
запускает движение спрайта. Параметр s
указывает номер спрайта (от 0 до 7), m — принцип вывода (т=1
— изображение спрайта накладывается на содержимое экрана по
принципу OR; m=2 и более — по принципу XOR). Попытка запуска
спрайта с номером, выходящим за пределы 0...7, чревата сбоем программы.
Как уже было упомянуто, спрайты в MegaBasic
движутся независимо от выполнения основной программы. То есть
запущенный оператором SPRON спрайт будет продолжать движение,
предписанное ему системными переменными спрайта (о них ниже),
одновременно с работой операторов, следующих за SPRON. Остановка
произойдет только на время выполнения операций с магнитофоном. Значения
системных переменных можно корректировать, на что мгновенно будет
реагировать спрайт (менять скорость, направление движения и т. д.).
Выполнение оператора
SPROFF_s
остановит движение спрайта с номером s. Естественно, все спрайты остановятся и с прекращением выполнения программы.
Инструкция SPRON_sfO также
прекращает вывод спрайта с номером s, и, следовательно, SPROFF можно
считать лишним. Оператор SPRON_s,255 прекращает вывод не только спрайта
s, но и всех спрайтов с номерами, большими s. SPRC>N_0,255 вообще
останавливает работу со спрайтами.
Но, как уже говорились, для оперирования
спрайтами недостаточно иметь их изображения и использовать операторы
SPRON и SPROFF. Необходимо еще должным образом установить системные
переменные спрайтов.
С каждым спрайтом связана своя область
системных переменных размером 1 8 байт внутри тела самого MegaBasic.
Эта область начинается с адреса 567 50 для спрайта с номером 0 и
простирается до 56893 для спрайта 7.
Приведем назначение и адреса системных переменных относительно адреса а начала области переменных каждого спрайта:
а+0 — значение параметра т, фигурирующего
в операторе SPRON и обозначающего способ вывода спрайта s. Выполнение
оператора POKE а,т аналогично действию SPRON_s,m; а+1 - текущая
горизонтальная координата (от 0 до 255) позиции вывода спрайта;
а+2 — текущая вертикальная координата (от
0 до 175). Занесение по этому адресу значения, большего 175, может
привести к сбою. Выполнив РОКЕ а+1,х: РОКЕ а+2,у, можно задать
начальную позицию вывода спрайта; а+3 - размеры шага (в пикселях) при
перемещении спрайта, а+4 соответственно, по координатам х и у, то есть
значения, на которые увеличивается содержимое переменных а+1 и а+2 за
один шаг. Если ячейки а+3 и а+4 содержат нули, спрайт будет стоять на
месте, только меняя фазы. Заносимые в ячейки а+3 и а+4 числа от 0 до
127 придают спрайту движение, соответственно, слева направо и сверху
вниз. Числа 1 28...255 — движение в обратном направлении (255
— минимальная скорость, 128 — максимальная). Не
рекомендуется использовать максимальные значения переменных а+3 и а+4,
лучше ограничиваться приращениями не более 30 пикселей;
а+5 — частота шагов. Чем больше содержимое этой ячейки, тем
быстрее движется спрайт (при прочих равных
условиях); а+6 — внутренняя системная переменная, связанная с
шагом; а+7 - число фаз спрайта (до 255). Значение должно точно отвечать
замыслу, иначе возможен пропуск фаз или вывод непреду смотрен н ых
изображен и й; а+8 - текущая переменная, указывающая номе}) выводимой в
данный момент фазы;
a+9 — частота смены фаз. Чем больше содержимое этой ячейки, тем быстрее меняются фазы;
а+10 — внутренняя системная переменная, связанная с частотой смены фаз;
а+11 двухбайтовое число, указывающее адрес начала разме-а+12 ~ щения в памяти первой фазы спрайта;
а+13 - внутренняя системная переменная;
а+14 - внутренняя системная переменная;
а+15 - числовое значение атрибута, которым закрашивается след, оставляемый спрайтом;
а+16 - не используется;
а+17 - конец области системных переменных данного спрайта, всегда содержит единицу.
После подбора параметров движения спрайтов, можно сохранить системные переменные на ленте оператором
SAVE "SPR.sys"CODE 56750,144
Выяснив назначение системных переменных,
попробуем запустить два спрайта, сформированные программой, приведенной
на стр. 216. Добавим в нее следующие строки и запустим74:
200 LET $0=41536: LET si =43264: REM Адреса размещения спрайтов 210 LET а0=56750: LET а 1=56750+18: REM Адреса начала системных
переменных спрайтов 220 POKE аО+7,48: REM Задание числа фаз спрайта 0 230 РОКЕ а0+15,6 •
240 FOR п=0 ТО 17: POKE al+n, PEEK (aO+n): NEXT п 250 DOKE_aO+11,s0: REM Задание адреса спрайта 0 260 DOKE_a1+11,s1: REM Задание адреса спрайта 1 270 РОКЕ а 1 + 1,0: РОКЕ а 1+2,40
280 CLS: SPRON_0,2: SPRON_1,2: PAUSE 0: REM Запуск спрайтов 290 SPRON_Of255:SPRON_1,255: REM Прекращение вывода спрайтов
Для спрайта с номером 0 почти все системные
переменные устанавливаются при инициализации MegaBasic. Поэтому для
начала работы с этим спрайтом достаточно задать значения только трех
переменных. Это переменная а+7 (количество фаз в спрайте, в данном
случае — 48 для обоих спрайтов), двухбайтовая переменная а+11,
а+12 (адрес первой фазы спрайта) и переменная а+15 (атрибут закраски
следа от спрайта). Значения системных переменных спрайта номер 1
копируются из области переменных спрайта 0 (строка 240) Затем в строке
260 задается адрес спрайта 1, а в строке 270 — его начальные
координаты.