Бегущая строка
Для придания заставке большей привлекательности используется ряд приемов, о которых должен знать программист.
Представим себе, что на экране слева направо «бежит» строка, содержащая информацию об игре (название, назначение клавиш, автор и т. п.), как это сделано, например, в программе R-TYPE.
Эффект бегущей строки можно получить, например, таким образом. Первым делом создадим символьную переменную, содержащую тот текст, который мы хотим видеть в «бегущей» строке. Затем последовательно будем выводить часть текста длиной 32 символа в одно и то же место экрана, например, в служебное окно. Первый фрагмент должен содержать символы с 1-го по 32-й, следующий - со 2-го по 33-й и так далее, пока не закончится текст. В результате каждая буква будет как бы перемещаться справа налево.
Ниже приведен листинг программы, реализующей этот принцип.
Программа 3. БЕГУЩАЯ СТРОКА.
10 BORDER 1: PAPER 1: CLS 20 REM --SCREEN---
100 LET B$="ПППППППППППППППППППППППППППППППП"
110 LET A$=B$+"PROGRAM: B.STROKA...ПППП*** DEMO ***"
120 LET A$=A$+"ППППUP....Q, DOWN....A, LEFT....O, "
130 LET A$=A$+"RIGHT....P, FIRE....M, END....E"
140 LET A$=A$+"ППППППAUTHOR: Petrow ЬапППП1993"
150 LET A$=A$+"ПППППППППППPRESS ANY KEY TO CONTINUE"
160 LET A$=A$+B$
200 FOR N=1 TO LEN A$-31
210 PAUSE 7: IF INKEY$<>"" THEN GO TO 300
220 LET B$=A$(N TO N+31)
230 PRINT #0;AT 1,0; INK 6;B$
240 NEXT N
250 GO TO 200
300 REM --CONTINUE---
Поскольку вы уже знакомы практически со всеми операторами этой программы, здесь и в дальнейшем мы будем использовать принцип построчного описания, рассматривая не отдельные операторы, а целые строки или даже группы строк программы. Таким образом, если вам понятны функции тех или иных строк, можете их пропускать и переходить к следующим.
10 - установка атрибутов экрана;
20 - в этом месте могут располагаться строки, рисующие на экране рамки, печатающие название игры и т. д.;
100... 160 - в этих строках формируется символьная переменная, содержащая текст, который будет выведен впоследствии на экран. Обратите внимание, что итоговая фраза здесь получена сложением строк
символов. Сложение - это единственное «арифметическое» действие, применяемое для обработки символьных переменных. Здесь мы воспользовались этой возможностью исключительно для того, чтобы не писать длинную строку программы. Кроме того, мы сэкономили память компьютера, дважды использовав переменную В$, состоящую из 32 пробелов. Кстати, эти 32 пробела в начале и в конце текста нужны для того, чтобы первые буквы постепенно появлялись из-за правого края экрана, а последние целиком уходили за левый край;
200 - начало цикла: переменной N присваиваются начальное и конечное значения. Здесь использована новая функция - LEN (от английского слова Length -длина). Она возвращает длину символьной переменной, указанной в качестве аргумента этой функции. Здесь она введена для того, чтобы компьютер сам выяснял, до каких пор повторять цикл и избавил нас от необходимости пересчитывать это значение после внесения каких-либо изменений в текст. Конечное значение должно быть на 31 меньше длины текста для того, чтобы в конце цикла не выйти за пределы переменной А$;
210 - вводится небольшая пауза, составляющая 7/50 секунды для того, чтобы строка «бежала» не слишком быстро и ее можно было успеть прочитать. В этой же строке проверяется, не была ли нажата какая-либо клавиша;
220 - основная операция программы. Она носит название сечение, а ее действие состоит в выделении из большой строки некоторой ее части - подстроки. Для выполнения этого после имени строки в скобках пишется ключевое слово ТО и указывается, с какого и по какой символ требуется выделить в подстроку. Например, если выполнить оператор PRINT "PRESS ANY KEY" (4 TO 11)
то на экране появится текст SS ANY К, то есть оператор выделил символы с четвертого по одиннадцатый (считая пробелы) и напечатал их. Если подстрока выделяется, начиная с первого символа, то можно писать: ( ТО 6), а если подстрока выделяется до конца символьной строки, то допустима запись (4 ТО );
230 - в начало строки 1 служебного окна (в самую нижнюю строку экрана) желтым цветом выводится подстрока В$, состоящая из 32 символов (ранее В$ была выделена из строковой переменной А$). Так как N - величина переменная, то в каждом цикле на одном и том же месте печатается часть строки, со сдвигом на один символ вправо, что на " экране создает эффект движения всего текста влево.
Как видно, в этой строке программы мы применили директиву AT при выводе информации в служебное окно. В этом случае за начало отсчета принимается левый верхний угол не всего экрана, а служебного окна. Следует учитывать и то, что после очистки экрана позиция печати в служебном окне устанавливается в позицию с координатами (1,0), или относительно основного экрана - в начало строки 23, самой нижней строки экрана;
240 - конец никла;
250 - оператор безусловного перехода на строку 200 заставляет повторить вывод всего текста с самого начала, и она будет повторяться до тех пор, пока вы не нажмете любую клавишу;
300 - отсюда может начинаться собственно игра.
Печатающий квадрат
Попробуем ввести в заставку еще один эффект, который может сделать ее привлекательнее: по экрану слева направо строка за строкой передвигается квадратик, за которым появляются буквы и символы какого-либо текста. Такой прием, напоминающий работу пишущей машинки, используется, скажем, в игре
CHASE H.Q.
Осуществить задуманное можно, например, следующим образом. 3ададим с помощью символьной переменной текст, а затем будем его выводить на экран по одной букве, причем впереди символов будем печатать пробел цветом, отличным от общего фона, то есть в виде квадратика-знакоместа. Каждая следующая буква печатается со сдвигом на одну позицию вправо, затирая при этом напечатанный ранее квадратик. Когда строка окажется целиком напечатана, уберем квадратик, поместив в соответствующую позицию пробел цвета фона.
Если понадобится сделать не одну, а несколько надписей таким способом, то придется несколько раз писать фрагменты программы, очень похожие один на другой. Но это только в том случае, если не знать об одном важном средстве структурного программирования - о подпрограммах.
Подпрограмма - это фрагмент основной программы, предназначенный для выполнения конкретных, обычно часто повторяющихся операций. Подпрограмма может быть исполнена в любой удобный момент и сколько угодно раз. После ее выполнения основная программа продолжает работу с прерванного места.
Вызываются подпрограммы оператором GO SUB с номером строки начала этой подпрограммы, а для возврата в основную программу используется оператор RETURN.
Ниже приведен листинг программы «Печатающий квадрат» и следом за ним -комментарии к тем строкам, которые могут оказаться не совсем понятными.
Программа 4. ПЕЧАТАЮЩИЙ КВАДРАТ.
10 BORDER 0: PAPER 0: INK 6 20 CLS
30 LET A$="Sinclair ZX Spectrum"
40 LET line=0: GO SUB 100
50 LET A$="********************"
60 LET line=2: GO SUB 100
70 LET A$="© 1982 Sinclair Research Ltd."
80 LET line=21: GO SUB 100
90 PAUSE 0
95 GO TO 200
100 LET S=LEN A$
120 FOR M=1 TO S
130 LET B$=A$(M)
140 PRINT AT line,M;B$; PAPER 3;" " 150 PAUSE 1: BEEP 0.002,20 160 NEXT M
170 PRINT AT line,M;" " 180 RETURN 200 CLS
30 - присваивание строковой переменной некоторого текстового значения;
40 - в переменной line задастся номер строки экрана, куда будет выводиться текст, затем следует обращение к подпрограмме «печатающий квадрат». Оператор GO SUB вызывает подпрограмму, указывая номер строки, с которой она начинается. Оператор RETURN завершает подпрограмму и возвращает управление основной программе, на строку, следующую за GO SUB (при первом обращении -на строку 50);
50, 60 - эти строки работают аналогично строкам 30 и 40. Меняется лишь текст и номер строки экрана, куда этот текст выводится;
70, 80 - снова повторение строк 30 и 40; текст выводится в 21 строку;
90 - программа ждет нажатия любой клавиши;
95 - безусловный переход на строку 200, откуда начинается следующая часть
программы;
100 - начало подпрограммы. Как уже говорилось, в программировании принято выделять некоторые фрагменты программы в подпрограммы, тем более, если предполагается, что в процессе работы программы этот фрагмент будет вызываться несколько раз. В нашем случае в подпрограмму выделяется вывод на экран текстовой переменной. Заметим, что подпрограмма, в свою очередь, может содержать другие подпрограммы.
В строке 100 определяется количество символов (букв) в выводимом тексте и полученное значение присваивается переменной S;
120 - начало цикла, в котором осуществляется побуквенный вывод текста;
130 - выбор из текста одной буквы, имеющей порядковый номер M;
140 - печать выбранной буквы в знакоместо с координатами line и М, а затем печать фиолетовым цветом квадрата, который всегда будет расположен справа от выводимой буквы;
150 - небольшая пауза, за которой следует пока еще неизвестный оператор ВЕЕР. Этот оператор генерирует звуковой сигнал. Основные характеристики любого звука - длительность и высота, поэтому после оператора ВЕЕР должны указываться два параметра, определяющих эти характеристики. Длительность звука (первый параметр) измеряется в секундах, а высота (второе число, стоящее после запятой) - в полутонах. Нота «до» первой октавы передастся числом 0. Более низкие звуки
задаются отрицательными числами, а более высокие - положительными. Например, оператор ВЕЕР 0.5,10 заставит компьютер воспроизвести звук, соответствующий ноте си-бемоль первой октавы, длительностью в половину секунды. Добавим к этому, что высота может задаваться не только целыми числами. Использование дробей позволит извлекать звуки любой высоты. Правда, в нашей программе оператор ВЕЕР используется не в музыкальных целях, а только лишь для имитации «стука» клавиш пишущей машинки;
160 - конец цикла;
170 - оператор убирает с экрана изображение последнего квадрата в конце строки с текстом перед переходом на новую строку;
180 - возврат в основную программу на оператор, который стоит сразу же после оператора GO SUB;
200 - очистка экрана перед началом следующей части программы.
Прыгающие буквы
Если предыдущую программу немного усложнить, то получится еще один эффектный прием, который можно использовать при написании заставки. В нем каждая строка текста получается из букв, как бы «выпрыгивающих» из-за правого края экрана, пока не заполнится строка. Затем все повторяется для второй и последующих строк, причем каждая строка отличается по цвету от предыдущей. После того, как вы хорошо разберетесь в программе, попробуйте и буквы окрасить в разные цвета, причем так, чтобы соседние цвета не повторялись. 20 BORDER 0: PAPER 0: CLS 40 LET x=5: LET y=2: LET c=6 50 LET a$="SINCLAIR ZX SPECTRUM" 60 GO SUB 500
70 LET x=4: LET y=3: LET c=3
80 LET a$="____________________"
90 GO SUB 500
100 LET x=7: LET y=6: LET c=4 110 LET a$="COMPUTER LITERACY"
120 GO SUB 500
130 LET x=5: LET y=8
140 LET a$="throught applications"
150 GO SUB 500
400 PAUSE 300: GO TO 600
499 REM podprogramma
500 LET d=LEN a$ 505 INK c
510 FOR n=1 TO d
520 FOR m=30 TO n+x STEP -1
530 PRINT AT y,m;a$(n);" "
540 NEXT m
550 NEXT n
560 RETURN
600 CLS
20 - установка цветовых атрибутов экрана;
40 - операторы присваивания, которые задают координаты первой буквы в первой строке текста, а также цвет выводимых букв;
50 - в символьную переменную а$ помещается текст первой выводимой на экран строки;
60 - обращение к подпрограмме «прыгающие буквы». После ее выполнения оператор RETURN передаст управление на строку 70;
70...90, 100...120, 130...150 - эти строки выполняют те же операции, что и строки 40...60;
400 - все изображение держится на экране 300/50 = 6 секунд, после чего оператор безусловного перехода передает управление в начало следующей части программы - на строку 600;
500 - с этой строки начинается подпрограмма, причем обращение к ней происходит четыре раза - по числу выводимых на экран строк текста. Сама строка 500 определяет количество букв в каждой фразе, и число, полученное в результате действия функции LEN, присваивается переменной d;
505 - установка цвета для очередной строки;
510 - начало внешнего цикла по переменной n, в котором устанавливаются номера букв, «выпрыгивающих» одна за другой на экран;
520 - начало внутреннего цикла по переменной m. Он задает координаты по горизонтали места на экране, куда будет выводиться буква при ее движении справа налево. Так как эта координата должна все время уменьшаться, то в операторе FOR...TO...NEXT необходимо задать отрицательный шаг. Как вы помните, шаг устанавливается ключевым словом STEP - число, стоящее за этим словом, задает величину приращения управляющей переменной m. Таким образом, в результате действия всех операторов строки, координата будет принимать значения 30, 29, 28,... n + Х;
530 - вывод на экран буквы, имеющей в строке текста порядковый номер n. Так как m - величина переменная, то буква будет перемещаться справа налево. Пробел в кавычках в конце строки стирает букву на «старом» месте по горизонтали (например, на 28-м) перед тем как поставить се на «новое» место (на 27-е);
540 - конец цикла по переменной m;
550 - конец цикла по переменной n;
560 - возврат из подпрограммы - переход к оператору, стоящему сразу за оператором вызова подпрограммы GO SUB. В данном случае переход происходит на строку 70, 100, 130 или 400;
600 - очистка экрана перед началом следующей части программы.