8. LASER BASIC B ИГРОВЫХ ПРОГРАММАХ
После того, как вы научились делать простые и не очень простые заставки и спрайты, нельзя пройти мимо пакета программ, специально предназначенного для манипулирования графическими изображениями - Laser Basic. Этот пакет значительно расширяет возможности Spectrum-Бейсика, вводя в действие более ста новых операторов и функций. Среди них вывод на экран готовых спрайтов, инвертирование, повороты, зеркальное отображение и перемещение этих спрайтов по всем направлениям. Картинки предварительно готовятся с помощью генератора спрайтов, или делаются одним из способов, о которых мы говорили раньше, например, с помощью редактора Art Studio. После отладки программы в интерпретаторе Laser Basic ее можно скомпилировать, что почти в два раза увеличит скорость ее работы и к тому же защитит текст от несанкционированного доступа.
Подробное описание Laser Basic с примерами и пояснениями дано в книге [2]. а мы ограничимся лишь теми сведениями, без которых невозможно разобраться в предлагаемых ниже программах. Основными объектами, с которыми придется иметь дело, будут окна и спрайты. С окнами мы уже встречались, когда учились записывать спрайты на магнитную ленту редактором Art Studio. B Laser Basic окно также выделяет прямоугольную область экрана, на которую распространяется действие операторов, выполняющих графические преобразования. Окно задается координатами левого верхнего угла, а также шириной и высотой (все параметры задаются в знакоместах). Кроме экранного окна, в которое можно поместить целиком весь спрайт, в Laser Basic есть еще одно полезное понятие - окно спрайта. Оно означает, что и в самом спрайте можно выделить определенную часть и вывести се на экран, а затем преобразовать, передвинуть и т. д. Эти операции могут оказаться очень полезными при создании всевозможных зрительных эффектов.
Операторы Laser Basic задаются ключевыми словами, состоящими из пяти символов, первый из которых - точка, а четыре последующих - прописные буквы латинского алфавита. Например: .PTBL, .SETV, .CLSM и т. д. Набираются ключевые слова посимвольно, буква за буквой, а их параметры передаются интерпретатору через специальные графические переменные, которым перед выполнением оператора необходимо присвоить те или иные значения.
Имена графических переменных состоят из четырех символов: первый - точка, остальные - прописные буквы латинского алфавита. Всего графических переменных 10:
.ROW, .COL - вертикальная и горизонтальная координаты в знакоместах, причем их значения могут выходить далеко за пределы экрана (допустимые пределы - от -128 до +127).
.HGT, .LEN - высота и ширина графического объекта (окна экрана, спрайта), выражаемые в знакоместах (0...255).
.SRW, .SCL - вертикальная и горизонтальная координаты внутри спрайта в знакоместах (пределы - в зависимости от размеров спрайта).
.NPX - величина и направление вертикального скроллинга в пикселях (-128...127).
.SPN - номер спрайта в спрайт-файле (1...255).
.SP1, .SP2 - номера первого и второго спрайтов (1...255) для операторов,
работающих с двумя спрайтами.
Для присвоения значений графических переменных обычным числовым переменным используются специальные графические функции. Выглядят они так же как и графические переменные, но вместо точки в них стоит знак вопроса. Например, ?ROW, ?SPN. Тогда оператор присваивания имеет вид: LET R=?ROW -где R - обычная числовая переменная.
Наиболее распространенная версия пакета Laser Basic поддерживает работу как с магнитофоном, так и с дисководом в системе TR-DOS. Если вы пользуетесь последним, то перед операторами LOAD, SAVE, MERGE и VERIFY следует вставлять: RANDOMISE USR 15619: REM:
Для работы с пакетом вначале следует загрузить программу-диспетчер LASER, после чего на экране появится меню, изображенное на рис. 8.1. (для магнитофонной версии опции 5 и 6 будут отличаться от изображенных на рисунке).
Выберите в меню опцию LOAD "SPRITE2B" SPRITE, нажав клавишу 4. Начнется загрузка фирменного спрайт-файла SPRITE2B. Этот файл используется в демонстрационной программе DEMO. Для разработки своих программ мы возьмем оттуда несколько готовых спрайтов, чтобы эти программы смогли потом посмотреть читатели. После окончания загрузки вновь появится главное меню Laser Basic.
![]()
Загрузим теперь интерпретатор Laser Basic, выбрав пункт 1 EXECUTE LASER BASIC. Бейсик-программа выгрузится, и в ОЗУ останется только интерпретатор. После этого можно выполнять операторы Laser Basic.
Однако прежде, чем писать программу заставки или какой-то игры, проделаем несколько простых опытов с новыми операторами и графическими переменными.
Введите программу:
10 BORDER 0: PAPER 0:INK 5
20 CLS: LET S=-2
30 FOR N=7 TO 10
40 .ROW=5:.COL=S:.SPN=N
50 .PTBL
60 PAUSE 5
70 NEXT N
80 LET S=S+2
90 IF S<32 THEN GO TO 30
После запуска программы оператором RUN вы увидите на экране изображение прыгающего слева направо забавного зверька, который, как в настоящем мультфильме, шевелит ушами и носом и двигает лапками во время прыжков.
Попробуем разобраться, каким образом достигается этот эффект.
10 - установка атрибутов экрана;
20 - очистка экрана и присваивание переменной S начального значения;
30 - начало цикла по переменной N, которая задает номер выводимого на экран спрайта. Сходство получающейся картинки с мультфильмом достигается благодаря тому, что на экран последовательно выводятся четыре спрайта с номерами 7, 8, 9 и 10, которые соответствуют разным фазам движения зверька;
40 - задание номера спрайта и его местоположения на экране. При этом координата расположения спрайта по вертикали остается постоянной, а горизонтальная координата все время увеличивается, в результате чего он перемещается слева направо;
50 - оператор вывода на экран спрайта с номером, заданным переменной .SPN в строке 30;
60 - оператор паузы;
70 - конец цикла;
80 - увеличение переменной S, определяющей положение спрайта по горизонтали;
90 - переход на начало цикла движения до тех пор пока спрайт не уйдет за пределы экрана.
Одним из достоинств Laser Basic является наличие в нем оператора перенумерации строк. То есть теперь можно не думать о том, какие номера ставить в начале каждой строки, а, написав программу, выполнить оператор .RNUM 10, 10, 10 - и строки вашей программы получат новые номера, кратные 10; при этом автоматически поменяются адреса в операторах GO SUB и GO TO. B операторе .RNUM первое число - это номер строки программы, с которой начнется перенумерация, второе число - новый номер этой строки и, наконец, третье - шаг нумерации строк программы.
Теперь полезно набрать и запустить маленькие программки, описанные в книге [2], иллюстрирующие простейшие действия с окнами и спрайтами. Они помогут познакомиться с новыми операторами и понятиями Laser Basic, которые пригодятся вам при написании серьезных программ.
Вы уже познакомились с большим количеством заставок и наверняка заметили, что подавляющее большинство из них представляют собой просто картинки -красивые, но статичные изображения. С помощью Laser Basic можно очень простыми средствами оживить не только саму игру, но и заставку. Имея желание и достаточно терпения вы вполне сможете создать даже заставку-мультфильм. Ниже приведен текст программы, на примере которой показано, как совместить уже известные вам операторы Spectrum-Бейсика с новыми операторами и графическими переменными Laser Basic.
Сначала несколько слов о том, что происходит при работе программы.
После ее ввода и запуска вы увидите в верхней части экрана движущийся автомобиль, к которому прицеплено название игры. Как только он скроется за пределами экрана, название появится вновь в средней части экрана. Затем вступит в действие другая часть программы и выведет на экран медленно перемещающееся поле из цветов, а вдалеке от него понесется локомотив с двумя пассажирскими вагонами. На то, что он не стоит на месте, укажут перемещающийся железнодорожный путь и бешено вращающиеся колеса (рис. 8.2). А теперь рассмотрим саму программу.
![]()
10 LET K=1: LET P=1: LET C=1
20 RANDOMIZE USR 58841: GO TO 30
30 RANDOMIZE :.SET=0:.ROW=0:.COL=0:.HGT=24:.LEN=32
40 BORDER 0: PAPER 0: INK 4: BRIGHT 1
50.CLSV:.SETV
60 GO SUB 300
70.SET=0:.SPN=4
80 FOR N=1 TO 40:.ROW=INT (RND*8+14):.COL=INT (RND*31):.PTBL: NEXT N
90.ROW=13:.SPN=51: FOR N=0 TO 24 STEP 8:.COL=N:.PTBL:NEXT N
100.ROW=10:.COL=20:.SPN=34:.PTBL
110.ROW=10:.COL=10:.SPN=48:.PTBL
120.ROW=10:.COL=0:.SPN=48:.PTBL
130.SET=2:.ROW=12:.COL=0:.SPN=49:.PTBL
140.SET=3:.ROW=12:.COL=10:.SPN=49:.PTBL
150.SET=4:.ROW=13:.COL=0:.LEN=32:.HGT=12
160.SET=5:.ROW=12:.COL=20
170 FOR N=1 TO 4: IF N=4 THEN BEEP .005,0
180.SET=5:.SPN=N+34:.PTBL
190.SET=2:.SPN=K+48:.PTBL
200 LET K=K+1: If K=3 THEN LET K=1
210.SET=3:.SPN=K+48:.PTBL
220.SET=4: .WL1V:.WL1V:.WL1V
230 IF INKEY$<>"" THEN GO TO 500
240.SET=1: INK N:.SETV
250 NEXT N
260 BEEP .005,0: GO TO 170
300 REM --------------------
310 LET A$="SOUTHERN BELLE"
320.SET=1:.SPN=5
330.ROW=3:.COL=0:.HGT=2:.LEN=32
340 INK 4:.SETV
350.ATOF:.PTBL
360 FOR B=0 TO 13
380 FOR N=1 TO 8
390.SR1V
400 NEXT N
410 PRINT AT 4,0;A$(14-B) 420 NEXT B 430.ATON
440 FOR N=1 TO 260
450.SR1V
460 NEXT N
470 PRINT AT 4,10; INK 3;A$
480 PRINT AT 6,6; INK 5;"Sankt-PetersburgПП1993"
490 RETURN
500 REM -----------------------
510.SET=0:.ROW=0:.HGT=24:.LEN=16
520 FOR N=1 TO 16 530.COL=0:.SL8V:.ATLV 540.COL=16:.SR8V:.ATRV 550 BEEP .02,N 560 NEXT N
10 - присваивание переменным начальных значений;
20 - обязательный в Laser Basic оператор запуска интерпретатора. Следом за RANDOMIZE USR 58841 должен стоять оператор GO TO или RUN с номером строки. В противном случае возможны сбои в работе программы;
30 - восстановление счетчика случайных чисел, а также установка графических переменных набора 0. Обычно в Laser Basic различные объекты описываются разными наборами графических переменных, которые задаются специальной переменной .SET. Это позволяет изменять параметры одного объекта, не затрагивая остальных. Всего в программе может быть определено 16 наборов (от О до 15);
40 - установка атрибутов экрана;
50 - оператор ,CLSV очищает окно экрана (в данном случае в наборе .SET = 0 задано окно во весь экран), a .SETV устанавливает в нем постоянные текущие атрибуты;
60 - обращение к подпрограмме, которая выводит на экран спрайт-автомобиль, перемещает его слева направо, постепенно добавляя к нему буквы названия игры. Подпрограмма заканчивается двумя строками текста;
70 - из спрайт-файла SPRITE2B программа выбирает 4-й спрайт («цветок»), после чего в цикле (строка 80) печатается 40 таких спрайтов. Координаты по вертикали задаются таким образом, чтобы все «цветочное поле» располагалось в нижней части экрана;
90 - после выполнения этой строки на экране появляются рельсы (спрайт 51);
100 - из спрайт-файла выбирается спрайт 34 - «локомотив» и выводится на экран на место с координатами (10,20);
110, 120 - вывод на экран двух вагонов (спрайт 48);
130, 140 - вывод на экран изображения колес вагонов (спрайт 49). Поскольку в дальнейшем координаты колес на экране будут использоваться для создания впечатления их вращения, графические переменные запоминаются в наборах 2 и 3;
150 - в 4-м наборе переменных задаются координаты, ширина и высота окна экрана, охватывающего рельсы и все цветочное поле. В дальнейшем горизонтальный скроллинг этого окна создаст иллюзию движения локомотива относительно пейзажа;
160 - в 5-м наборе переменных определяются координаты вывода на экран колес локомотива;
170 - здесь начинается цикл вращения колес, перемещения рельсов и цветов, причем N равное 35, 36, 37 и 38 соответствует спрайтам четырех положений колес локомотива. Если эти спрайты выводить на экран поочередно, то создастся впечатление, что колеса вращаются. На последнем «витке» цикла (N = 4) раздается короткий звук, имитирующий стук колес;
180 - устанавливается набор номер 5 - колеса локомотива - и на экран выводится спрайт, соответствующий очередной фазе их вращения;
190...210 - вывод на экран спрайтов колес двух вагонов. В отличие от спрайтов колес локомотива, этих спрайтов только два, поэтому переменная К может принимать значения 1 или 2 (строка 200);
220 - циклическое смещение окна, содержащего изображения рельсов и цветочного поля (набор 4), на три пикселя влево (трижды выполняется оператор
.WL1W);
230 - нажатие любой клавиши вызовет переход к завершающей части программы;
240 - в наборе переменных номер 1 заданы параметры окна экрана, охватывающего название игры. Цвет тона изменяется с управляющей переменной N, и этим цветом окрашиваются буквы в окне. В результате надпись будто бы постоянно переливается;
250 - конец цикла;
260 - после завершения цикла еще раз повторяется звук, имитирующий стук колес, затем программа переходит на начало цикла и все повторяется;
300 - начало подпрограммы вывода на экран названия игры; 310 - присваивание строковой переменной названия игры; 320 - задание спрайта номер 5 -(автомобиля) в 1-м наборе; 330 - задание начальных координат автомобиля, а также высоты и ширины окна, в котором он будет перемещаться по экрану; 340 -установка зеленого цвета тона в заданном окне; 350 - запрет переноса атрибутов во всех операциях между экраном и спрайтами, затем вывод спрайта-автомобиля на экран;
360 - начало цикла по переменной В, в котором следом за автомобилем появляется название игры;
380...400 - заданное окно в цикле скроллируется на 8 пикселей (то есть на одно знакоместо) вправо (8 раз повторяется оператор .SR1W);
410 - в освободившееся после скроллинга окна знакоместо выводится очередная буква названия игры;
420 - конец цикла по переменной В;
430 - разрешение переноса атрибутов в операциях между экраном и спрайтами;
440...460 - скроллинг окна с автомобилем и названием игры вправо на 1 пиксель. Этот скроллинг повторяется 260 раз, в результате чего все изображение, пройдя по экрану слева направо, исчезает;
470, 480 - вывод неподвижных надписей в середину экрана; 490 - выход из подпрограммы вывода названия игры; 500 - завершающая часть программы;
510 - устанавливается набор 0, в котором задаются параметры окна экрана;
520...560 - в цикле две половинки экрана расходятся в разные стороны, как шторы;
530 - переменной .COL = 0 задается окно, охватывающее всю левую половину экрана. Выполняется скроллинг окна влево на одно знакоместо, и одновременно -скроллинг атрибутов;
540 - заданное окно перемещается в правую половину экрана, и осуществляется скроллинг на одно знакоместо вправо вместе с атрибутами;
550 - звуковое сопровождение цикла.
Увидев эту программу в действии, вы наверняка захотите в ней что-то изменить и даже улучшить. Отлично! Вместо изображения автомобиля можете использовать спрайт вертолета с вращающимся винтом, вместо поезда - бронетехнику и т. д. чтобы выбрать что-то подходящее, просмотрите содержание всего спрайт-файла SPRITES2B и запишите номера понравившихся спрайтов. Для этого придется ввести следующую небольшую программу: 10 .ROW=10:.COL=10 20 FOR N=1 TO 59 30 .SPN=N:.PTBL 40 PRINT AT 21,0;N 50 PAUSE 0 60 CLS
70 NEXT N
B цикле управляющая переменная N задает номер спрайта (строка 30), который выводится на экран оператором .PTBL в знакоместо с координатами (10,10), определенными в строке 10. Сам номер тоже печатается (строка 40). Внимательно рассмотрев спрайт и решив, подходит он вам или нет, переходите к следующему; для этого достаточно нажать любую клавишу.