8. LASER BASIC B ИГРОВЫХ ПРОГРАММАХ
После того, как вы научились делать простые и не очень простые заставки и спрайты, нельзя пройти мимо пакета программ, специально предназначенного для манипулирования графическими изображениями - Laser Basic. Этот пакет значительно расширяет возможности Spectrum-Бейсика, вводя в действие более ста новых операторов и функций. Среди них вывод на экран готовых спрайтов, инвертирование, повороты, зеркальное отображение и перемещение этих спрайтов по всем направлениям. Картинки предварительно готовятся с помощью генератора спрайтов, или делаются одним из способов, о которых мы говорили раньше, например, с помощью редактора Art Studio. После отладки программы в интерпретаторе Laser Basic ее можно скомпилировать, что почти в два раза увеличит скорость ее работы и к тому же защитит текст от несанкционированного доступа.
Введение в 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
Вы уже познакомились с большим количеством заставок и наверняка заметили, что подавляющее большинство из них представляют собой просто картинки -красивые, но статичные изображения. С помощью Laser Basic можно очень простыми средствами оживить не только саму игру, но и заставку. Имея желание и достаточно терпения вы вполне сможете создать даже заставку-мультфильм. Ниже приведен текст программы, на примере которой показано, как совместить уже известные вам операторы Spectrum-Бейсика с новыми операторами и графическими переменными Laser Basic.
Сначала несколько слов о том, что происходит при работе программы.
После ее ввода и запуска вы увидите в верхней части экрана движущийся автомобиль, к которому прицеплено название игры. Как только он скроется за пределами экрана, название появится вновь в средней части экрана. Затем вступит в действие другая часть программы и выведет на экран медленно перемещающееся поле из цветов, а вдалеке от него понесется локомотив с двумя пассажирскими вагонами. На то, что он не стоит на месте, укажут перемещающийся железнодорожный путь и бешено вращающиеся колеса (рис. 8.2). А теперь рассмотрим саму программу.
Программа 30. ПАРОВОЗ.
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). Внимательно рассмотрев спрайт и решив, подходит он вам или нет, переходите к следующему; для этого достаточно нажать любую клавишу.