П р и м е р 12. Фильм (чередование спрайтов на одном и том же месте эк- ────────────── рана дисплея). NEW Ok 10 COLOR 1,15,8:SCREEN 2,3 20 A$="Мы":B$="изучаем":C$="язык":D$="MSX-BASIC" 30 SPRITE$(1)=A$:SPRITE$(2)=B$:SPRITE$(3)=C$:SPRITE$(4)=D$ 40 FOR I=1 TO 4:PUT SPRITE 2,(90,90),11,I'Обратите внимание на то, что номер спрайта изменяется в цикле, а "экранный" номер постоянен! 50 FOR U=1 TO 200:NEXT:NEXT:GOTO 40 Из рассмотрения примеров 8-12 можно сделать некоторые выводы о назначе- нии "экранного" номера спрайта. α) "Экранный" номер показывает нам номер "пятна" (спрайта) на экране. Для того, чтобы вывести на экран N спрайтов (или N копий одного и того же спрайта), необходимо,чтобы эти спрайты имели N различных "экранных" номе- ров (на экране - N "пятен"). β) Использование "экранных" номеров дает нам еще одно преимущество:для того,чтобы изобразить спрайт с "экранным" номером t в некоторой точке эк- рана A, а затем его же изобразить в другой точке B,нет необходимости "сти- рать" его на старом месте, а достаточно просто указать его новые координа- ты.В результате спрайт тут же "самостоятельно перепрыгнет" в точку B.Если же спрайты имеют разные "экранные"номера,то спрайт в точке А останется на том же месте, в то время как в точке B экрана появится другой спрайт! γ) Более того, применение "экранного" номера дает нам возможность "соз- давать" цветные спрайты,накладывая их образы друг на друга.При этом важно отметить,что спрайт с меньшим экранным номером "накладывается" на спрайты, имеющие большие экранные номера. П р и м е р 13. Цветные спрайты. ────────────── NEW Ok 20 SCREEN2,2 30 X$=CHR$(&H0)+CHR$(&H0)+CHR$(&HF)+CHR$(&H18)+CHR$(&H34)+CHR$(&H34)+C HR$(&HE0)+CHR$(&HC1) 35 T$=CHR$(&H0)+CHR$(&H0)+CHR$(&H0)+CHR$(&H1F)+CHR$(&H3F)+CHR$(&H3F)+C HR$(&H7F)+CHR$(&HFF) 40 Y$=CHR$(&H67)+CHR$(&H1E)+CHR$(&H1)+CHR$(&HB)+CHR$(&HD)+CHR$(&H16)+C HR$(&H1F)+CHR$(&HE) 45 A$=CHR$(&H7F)+CHR$(&HE)+CHR$(&H0)+CHR$(&H0)+CHR$(&H0)+CHR$(&H0)+CHR $(&H0)+CHR$(&H0) 50 Z$=CHR$(&H0)+CHR$(&HC)+CHR$(&H9C)+CHR$(&HF4)+CHR$(&H64)+CHR$(&H48)+ CHR$(&HCA)+CHR$(&HF3) 55 U$=CHR$(&H0)+CHR$(&H0)+CHR$(&H0)+CHR$(&HFC)+CHR$(&HFC)+CHR$(&HF8)+C HR$(&HFA)+CHR$(&HF3) 60 W$=CHR$(&HC7)+CHR$(&HE7)+CHR$(&HF7)+CHR$(&HB2)+CHR$(&H7A)+CHR$(&HFC )+CHR$(&H38)+CHR$(&H70) 65 R$=CHR$(&HC7)+CHR$(&H66)+CHR$(&H7)+CHR$(&HB2)+CHR$(&HA)+CHR$(&HC)+C HR$(&H38)+CHR$(&H70) 70 SPRITE$(1)=X$+Y$+Z$+W$ 75 SPRITE$(2)=T$+A$+U$+R$ 80 PUTSPRITE 1,(101,94),1,1 83 PUTSPRITE 2,(101,94),15,2 85 PUTSPRITE 3,(141,94),11,1 87 PUTSPRITE 4,(141,94),1,2 90 GOTO 90 П р и м е р 14. Движение цветных (!) спрайтов. ────────────── NEW Ok 10 SCREEN 1,3:DATA 11111111 30 C$="":FOR I=1 TO 32:GOSUB 130:NEXT:SPRITE$(1)=C$ 50 C$="":FOR I=1 TO 2:GOSUB 130:NEXT:SPRITE$(2)=C$:SPRITE$(3)="1234567 8":FOR L=1 TO 270 80 PUT SPRITE 1,(85+L,99),15,3:PUT SPRITE 2,(80+L,90),2,1 95 PUT SPRITE 3,(75+L,88),10,2:PUT SPRITE 4,(88+L,73),13,2 110 PUT SPRITE 5,(80+L,60),1,1:NEXTL:END 130 RESTORE10:READB$:A$="&b"+B$:C$=C$+CHR$(VAL(A$)):RETURN Внимание!В одной строке экрана (напомним,что,например,в экране SCREEN2 192 строки) можно разместить не более ч е т ы р е х спрайтов, а осталь- ные спрайты с более высокими "экранными" номерами останутся невидимыми! П р и м е р 15. Программа демонстрирует интересные ситуации, возникаю- ────────────── щие при попытке поместить несколько (>4) спрайтов в одной строке экрана. NEW Ok 10 INPUT"Число спрайтов";K:INPUT"Смещение спрайтов по вертикали";Q:SCR EEN2,1:COLOR ,15,15:SPRITE$(1)="логарифм" 40 FOR I=1 TO K:PUT SPRITE I,(20*I,W),8,1:W=W+Q:NEXT 50 A$=INPUT$(1)'Ожидание нажатия любой клавиши! Исследуем четыре возможных случая: 1) K<=4; 3) K>4 AND Q<4 AND Q≠0; 2) K>4 AND Q=0; 4) K>4 AND Q>=4. Приведем результаты исследования: 1) все K образов спрайта выводятся на экран "целиком"; 2) на экран выводятся только 4 первых образа спрайта; 3) целиком выводятся только 4 первых образа спрайта, остальные же обра- зы выводятся на экран частично (подумайте,почему?); 4) на экран выводятся все образы спрайта. При замене оператора SCREEN 2,1 на SCREEN 2,0 вместо случаев Q<4 и Q>=4 рассмотрите соответственно случаи Q<2 и Q>=2. И,наконец, для того,чтобы "избавиться" от спрайта, определите его цвет как прозрачный (0) в операторе PUT SPRITE или заполните нулями соответст- вующий образ. Заметим, что если цветные спрайты создаются наложением, то нельзя ис- пользовать оператор ON SPRITE GOSUB совместно с операторами SPRITE ON или SPRITE STOP, ибо "наложенные" друг на друга спрайты все время "сталкивают- ся" (см. раздел V.6.3)! Думаем, что рисунок, помещенный ниже, поможет Вам лучше "прочувство- вать" механизм работы со спрайтами. Посмотрите на него внимательно ... ┌──────────┐ ┌──────────┐ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │ Экран 31 ┌──────────┐ │ │ │ │ ··· │ ███ │ │ │ │─┘ Бордюр Экран 1 ┌──────────┐ ·│ │ │─┘ Внешний видеосигнал (MSX-2) Экран 0┌──────────┐ │ · │ │─┘ Фоновый экран Образ │ │ │· │─┘ Основной экран спрайта с │ ██ │ │───┘◀── для спрайта 31 "экранным" ────────▶ ██ │ │ Р и с. 5 номером 0 │ │─┘◀── для спрайта 1 ──────── └──────────┘◀── для спрайта 0 На рисунке изображен ряд параллельных прозрачных пластинок, которые мы будем называть э к р а н а м и. Экраны введены для того, чтобы: α) создать удобный механизм движения спрайтов; β) однозначно определять изображение,возникающее при наложении спрайтов. На каждом экране может находиться не более одного спрайта. Если на не- котором экране уже находится спрайт,то вывод на него нового спрайта (в лю- бом месте) вызывает и с ч е з н о в е н и е первого спрайта. Это позво- ляет осуществлять д в и ж е н и е спрайтов,печатая один и тот же спрайт на определенный экран и изменяя его координаты на этом экране! Далее, печатая на один экран в одном и том же месте разные спрайты, мы можем получать изображение предмета, меняющего форму. Каждый экран имеет определенный приоритет (по глубине): все объекты на экранах с меньшими номерами частично (или полностью) з а к р ы в а ю т объекты на экранах с большими номерами. Для отображения менее приоритет- ных объектов соответствующая область более приоритетных экранов должна быть п р о з р а ч н о й - свободной от изображения. Поэтому при н а л о ж е н и и спрайтов полностью виден спрайт, нахо- дящийся на экране с меньшим номером. И, наконец, один и тот же образ спрайта можно одновременно выводить на несколько экранов. Плоскость б о р д ю р а по формату несколько превышает остальные плоскости, образуя как бы своеобразную окантовку вокруг изображения. Основное графическое изображение и текст формируются на о с н о в- н о м экране. Его "содержимым" могут быть отрезки прямых, дуги окружно- стей и т.д. На этом же экране располагается и текстовая информация. Сквозь незанятые позиции основного экрана "просвечивают" ф о н о в ы й экран и окаймляющая его цветная рамка. V.6.3. С т о л к н о в е н и е с п р а й т о в "Да сделайте же, наконец, CALL NETEND !", - крик, вырвавшийся из уст пользователя MSX-2. С т о л к н о в е н и е м с п р а й т о в мы считаем: α) для п р о г р а м м и с т а - наложение на экране одной или не- скольких точек их образов. Следует отметить,что столкновение спрайтов про- исходит только тогда, когда сталкиваются их в и д и м ы е части. Причем закраска спрайта цветом фона вовсе не делает его невидимым! β) для к о м п ь ю т е р а - совпадение е д и н и ч н ы х битов в об- разах спрайтов, за исключением тех случаев, когда цвет хотя бы одного спрайта установлен в 0 (тогда столкновение не обнаруживается!). Оператор ON SPRITE GOSUB n где: ON ("по"), SPRITE, GOSUB - служебные слова; n - номер программной строки, приводит в состояние готовности режим передачи управления подпрограмме, расположенной со строки n, при любых столкновениях спрайтов. Этот режим включается, выключается и приостанавливается соответственно операторами SPRITE ON , SPRITE OFF , SPRITE STOP . Если задан режим SPRITE ON, то любое столкновение спрайтов вызывает п р е р ы в а н и е (по окончании выполнения текущего оператора) и затем переход к подпрограмме,указанной в операторе ON SPRITE. По умолчанию уста- навливается режим SPRITESTOP вплоть до оператора RETURN этой подпрограммы. После выполнения оператора RETURN вновь устанавливается режим SPRITE ON до тех пор,пока Вы явно не запретите обработку прерываний по столкнове- нию спрайтов оператором SPRITE OFF, который позволяет игнорировать любое столкновение спрайтов до тех пор, пока Вы не употребите вновь оператор SPRITE ON . Оператор SPRITE STOP временно отключает обработку прерываний.Если стол- кновение спрайтов произошло, то этот факт "запоминается", но никаких дей- ствий не происходит; однако,если позже компьютер встретит оператор SPRITE ON, то будет обработано ранее зафиксированное прерывание. П р и м е р 1. Сравните, пожалуйста,результаты работы приведенных ниже ───────────── программ. NEW NEW Ok Ok 10 COLOR 1,15,8:SCREEN 1,3 10 COLOR 1,15,8:SCREEN 1,3 20 ON SPRITE GOSUB100:SPRITE 20 ON SPRITE GOSUB100:SPRITE ON:X$="итерация":SPRITE$(50) ON:X$="итерация":SPRITE$(50) =X$+X$+X$+X$ =X$+X$+X$+X$ 50 FOR K=0 TO 255 50 FOR K=0 TO 255 60 PUT SPRITE 0,(K,70),4,50: 60 PUT SPRITE 0,(K,70),4,50: PUT SPRITE 1,(120,K),13,50 PUT SPRITE 1,(120,K),13,50 80 NEXT:GOTO 50 80 NEXT:SPRITE ON:GOTO 50 90 '¤¤¤¤ Подпрограмма! ¤¤¤¤ 90 '¤¤¤¤ Подпрограмма! ¤¤¤¤ 100 SPRITE OFF:PRINT "Столк 100 PRINT"Столкновение":FOR новение":FOR I=1 TO 1000:NE I=1 TO 1000:NEXT:CLS:SPRITE XT:CLS:SPRITE ON:RETURN OFF:RETURN Для очистки экрана дисплея от образов спрайтов примените в непосредст- венном режиме команду SCREEN0 (CLS не поможет!). Укажем один из способов определения, какие именно спрайты столкнулись: он заключается в обнаружении столкновения по изменению цветов спрайтов.На- помним, что цвет спрайта с меньшим "экранным" номером накладывается на цвет спрайта с большим "экранным" номером. Предлагаем Вам пример простейшей программы, позволяющей определить, спрайт какого цвета "пострадал" при столкновении! Разумеется,задача значи- тельно усложняется в случае, когда спрайты имеют одинаковые цвета! П р и м е р 2. ───────────── Ok 1 SCREEN2,0 10 OPEN"grp:" AS#1'Данный оператор применяется совместно с операторами PRINT#1 и CLOSE#1 для организации вывода символьной информации на граф ические экраны SCREEN2 и SCREEN3. 20 SPRITE$(1)="итерация":SPRITE$(2)="интеграл":SPRITE$(3)="алгоритм":E =2:ON SPRITE GOSUB 500 40 PUT SPRITE 2,(60,100),2:PUT SPRITE 3,(90,100),1 60 FORK=1TO256:SPRITE ON:N=1:PUT SPRITE N,(K,100),1,3:NEXT 100 GOTO 100 500 SPRITE OFF::PRESET(90,10) 512 IF POINT(PEEK(&HFCB3),PEEK(&HFCB5))<>2 AND E=2 THEN PRINT #1,"Gree n" ELSE IF POINT(PEEK(&HFCB3),PEEK(&HFCB5))<>1AND E=3 THEN PRINT #1,"B lack" 520 FOR T=1 TO 500:NEXT:PUT SPRITE E,(E*10,E*10),15:E=E+1 525 CLS:SPRITE ON:RETURN Напомним, что значения PEEK(&HFCB3) и PEEK(&HFCB5) определяют коорди- наты текущего положения графического курсора. Прерывания по столкновению спрайтов широко используются в и г р о - в ы х программах. Они дают возможность,например,воспроизводить звук взры- ва при всяком столкновении ракеты и мишени, если оба этих объекта являют- ся спрайтами. П р и м е р 3. Программа демонстрирует некоторые возможности примене- ───────────── ния спрайтов. NEW Ok 30 SCREEN 0:CLS:PRINT SPC(10);"Внимание!":PRINT "Перед Вами игра ";CHR $(34);"Бегущие человечки";CHR$(34):PRINT "Зеленый человечек управляетс я клавишами перемещения курсора, а синий движется по случайной траекто рии." 40 PRINT "При их столкновении возникает объект, движущийся по окружно сти.":PRINT 50 PRINT"Цель игры - за определенное время сделать как можно больше ст олкновений человечков." 60 PRINT "Скорость движения бегущих человечков характеризуется следующ ими величинами:":PRINT TAB(2);"a)-шагом перемещения":PRINT TAB(2);"b)- задержкой изображения":INPUT"Чему равен шаг";U1:INPUT"Чему равна задер жка";U2 80 DATA 6,9,9,9,9,9,6,0,2,2,6,2,2,2,7,0,6,9,9,2,4,8,15,0,6,9,1,2,1,9,6 ,0,9,9,9,15,1,1,1,0,15,8,8,15,1,1,15,0,6,9,8,14,9,9,6,0,15,1,1,2,4,4,4 ,0,6,9,9,6,9,9,6,0,6,9,9,7,1,9,6,0:'Информация о секундомере. 90 DATA 48,48,94,123,28,55,32,96,48,48 ,28,122,26,56,40,4,48,48,24,28, 24,48,60,24,48,48,28,122,26,56,40,20,12,12,122,222,56,236,4,6,12,12,56 ,94,88,28,20,32,12,12,24,56,24,12,60,24,12,12,56,94,88,28,20,40:'Инфор мация о бегущих человечках. 100 DATA 1,7,11,31,30,57,49,33,33,51,30 ,15,21,16,11,7,128,224,208,184 ,252,156 ,140,132,132,204,120,240,104,8,80,224:'Информация об объекте, движущемся по окружности. 110 COLOR 1,15,8:SCREEN 2,2,1 'Установка экрана. 120 RESTORE 80:FOR Z=0 TO 9:GOSUB 300:SPRITE$(Z)=Y$:NEXT:S1=0:S2=0:S3= 0:S4=0:GOSUB 230 'Сформированы образы спрайтов секундомера. 130 INTERVAL ON:ON INTERVAL=60 GOSUB 190 'Изменение состояния секундом ера через каждую секунду. 140 RESTORE 90:FOR Z=20 TO 27:GOSUB 300:SPRITE$(Z)=Y$:NEXT'Сформирован ы образы бегущих человечков, каждый из которых представляет смену четы рех кадров. 150 T=1:FA=RND(-TIME):ON SPRITE GOSUB 250 'Установлен режим перехода к подпрограмме при столкновении спрайтов. 160 SPRITE ON:FOR I=24 TO 27:GOSUB 340:PUT SPRITE 21,(T-2+WX,140+WY),4 ,I:FOR M=0 TO U2:NEXT:PUT SPRITE 22,(249+XW*U1,140+YW*U1),2,SA:FOR M=0 TO U2:NEXT M,I:IF U1<=0 THEN T=1 ELSE T=T+1 170 GOTO 160 'Конец основной программы. 180 'Подпрограмма вывода секундомера на экран. 190 IF S4<=9 THEN S4=S4+1 200 IF S4=10 THEN IF S3<=6 THEN S3=S3+1:S4=0 210 IF S3=6 THEN IF S2<=9 THEN S2=S2+1:S3=0:S4=0 220 IF S2=10 THEN IF S1<6 THEN S1=S1+1:S2=0:S3=0:S4=0 ELSE S1=0:S2=0:S 3=0:S4=0 230 PUT SPRITE 1,(10,10),13,S1:PUT SPRITE 2,STEP(8,0),13,S2:LINE(33,16) -(34,17),13,BF:PUT SPRITE 3,(36,10),13,S3:PUT SPRITE 4,STEP(8,0),13,S4: RETURN 240 'Подпрограмма обработки столкновения спрайтов. 250 T=T+8:SPRITE OFF:RESTORE 100:GOSUB 310:SPRITE$(11)=Y$'Сформирован образ нового объекта. 260 PUT SPRITE 21,(20,140),15,24:PUT SPRITE 22,(227,140),15,20 'Бегущи е человечки исчезают. 270 DEFFN B(X)=SQR(10^2-(X-10)^2):FOR D=1 TO 20:PUT SPRITE 11,(105+D,8 5+FNB(D)),1,11:NEXT:FOR D=20 TO 1 STEP -1:PUT SPRITE 11,(105+D,85-FNB( D)),1,11:NEXT: 'Движение объекта по окружности. 280 PUT SPRITE 11,(0,0),15,11:RETURN'Объект исчезает и "прячется" за с прайтами секундомера. 290 'Подпрограммы формирования образов спрайтов. 300 Y$="":FOR I=1 TO 8:READ R:Y$=Y$+CHR$(R):NEXT:RETURN 310 Y$="":FOR I=1 TO 32:READ R:Y$=Y$+CHR$(R):NEXT:RETURN 320 'Подпрограмма перемещения спрайтов. 330 'Управление зеленым спрайтом клавишами управления курсором. 340 CJ=STICK(0):IF CJ=0 THEN XW=XW+1:YW=YW+1 350 IF CJ=3 OR CJ=7 THEN YW=YW+1 360 IF CJ=4 OR CJ=5 OR CJ=6 THEN YW=YW+1 ELSE YW=YW-1 370 IF CJ=1 OR CJ=5 THEN XW=XW+1 380 IF CJ=2 OR CJ=3 OR CJ=4 THEN XW=XW+1 ELSE XW=XW-1 390 IF CJ=2 OR CJ=3 OR CJ=4 THEN SA=I ELSE SA=I-4 400 'Случайное перемещение синего спрайта и блокировка его выхода за п ределы экрана по вертикали. 410 IF U1=0 THEN WX=0:WY=0:RETURN 420 WX=WX+INT(2*U1*RND(1)) 430 IF 140+WY>=183-U1 THEN WY=WY-INT(U1*RND(1)):RETURN 440 IF 140+WY<=U1 THEN WY=WY+INT(U1*RND(1)):RETURN 450 WY=WY+INT((2*U1+1)*RND(1)-U1):RETURN V.7. ОПЕРАТОР SCREEN В ОБЩЕМ СЛУЧАЕ Общая форма записи оператора SCREEN следующая: SCREEN [n],[s],[z],[d],[p],[m] ──▲─ └ только для MSX-2 ! где: SCREEN("screen"-"экран") - служебное слово; n - арифметическое выражение, целая часть значения которого задает номер экрана причем: n∈{0,1,2,3} для компьютеров MSX-1; n∈{0,1,2,3,4,5,6,7,8} для компьютеров MSX-2; s - арифметическое выражение, целая часть значения которого может быть равна 0,1,2,3; это число определяет размеры спрайтов (оператор SCREEN ,s не очищает экран, однако стирает образы спрайтов в памяти компьютера); z - арифметическое выражение, целая часть значения которого принад- лежит отрезку [0,255] и определяет наличие звукового сопровождения клавиа- туры: z=0-звуковое сопровождение отсутствует; z≠0 -звуковое сопровождение есть (по умолчании z=1); d - арифметическое выражение, целая часть значения которого задает скорость обмена с дисководом, d∈{1,2}, причем если d=1,то устанавливается наиболее надежная скорость передачи информации 1200 бит/с = 1200 бод (по умолчании); если же d=2, то скорость становится равной 2400 бод; p - арифметическое выражение, целая часть значения которого принад- лежит отрезку [0,255] и указывает тип печатающего устройства (принтера): если p=0, то принтер совместим со стандартом MSX (будет распечатывать каж- дый символ из набора символов стандарта MSX); если же p≠0, то принтер при выводе преобразует графические символы в пробелы (по умолчании p=0). 7) m - арифметическое выражение,целая часть значения которого принад- лежит отрезку [0,3], причем: если m=0, то изображение устойчивое (по умолчанию); если m=1, то изображение "дергающееся"; если m=2, то изображение устойчивое и в режимах SCREEN 5÷8 наблюдается одновременный показ двух экранных страниц (0 и 1, 2 и 3) на странице с не- четным номером; если m=3, то изображение "дергающееся" и в режимах SCREEN 5÷8 наблюда- ется одновременный показ двух экранных страниц (0 и 1, 2 и 3) на странице с нечетным номером. Отметим, что неиспользуемые параметры в операторе можно не указывать, но если они не последние в записи, то ограничивающие их запятые обязатель- ны. При этом, каждый назначенный параметр действует до тех пор,пока не по- лучит новое значение в последующем операторе SCREEN. П р и м е р ы: SCREEN 1,2,0,2,0 SCREEN X,Y ───────────── SCREEN 3,,0 SCREEN 2,3,,,0 Если какой-либо из параметров выходит за допустимый диапазон,то компью- тер сообщает об ошибке: "Illegal function call" . Запомните, что основное назначение оператора SCREEN - это определение типа экрана и размера спрайтов! V.8. ПОНЯТИЕ ФАЙЛА [5]. ВЫВОД ТЕКСТОВОЙ ИНФОРМАЦИИ НА ГРАФИЧЕСКИЕ ЭКРАНЫ Я случайно уничтожил все свои файлы! Крик души Термин ф а й л происходит от английского слова file, переводящегося на русский язык как "дело" или "досье". В информатике под ф а й л о м понимают совокупность в некотором смыс- ле о д н о р о д н ы х данных, характеризующих какой-либо процесс или объект.Файлы обычно хранятся на тех или иных внешних носителях информации (дискетах или магнитных лентах). Далее мы будем иметь дело с п р о г р а м м н ы м и файлами, состоя- щими из одной или нескольких программ и файлами д а н н ы х . Компоненты программного файла называют м о д у л я м и или с е г- м е н т а м и. Один из них считается основным. Он в первую очередь загру- жается в оперативную память и управляет всем процессом обработки информа- ции. В частности, основной модуль по мере надобности проводит автоматичес- кую подгрузку в память других сегментов файла. Именем файла считается имя его основного модуля. Ясно, что при небольших размерах программного файла разбивать его на модули нецелесообразно. Нас будут интересовать два вида файлов: прямого доступа и последова- тельного доступа. Компоненты файла п р я м о г о доступа - это отдельные нумерованные группы значений, называемые з а п и с я м и. Запись может быть считана с внешнего носителя в б у ф е р оперативной памяти и наоборот -сформирова- на в буфере и затем переписана во внешнюю память. Иными словами, буфер яв- ляется своеобразным окном, через которое можно "рассматривать" файлы.Обра- щение к конкретной записи осуществляется прямым заданием ее номера. Компоненты файла последовательного доступа называются с т р о к а м и. Каждая строка имеет специальную концевую метку и, как и запись,состоит из отдельных значений. Однако строки не нумерованы и обрабатывать их можно лишь последовательно друг за другом. Причем, запись организуется от нача- ла или конца файла, а чтение - только от его начала. Теперь перейдем к делу! Схемы, графики, рисунки или их отдельные фрагменты, выводимые на графи- ческие экраны, обычно нуждаются в обозначениях и поясняющих сообщениях. Сформировать их оператором PRINT невозможно! В режимах SCREEN2 ÷ SCREEN8 последний не действует. Однако эту процедуру можно осуществить путем совместного применения в программе четырех операторов: α) MAXFILES=α где: MAX ("MAXimum"-"наибольший") и FILES ("файлы") - служебные слова; α - арифметическое выражение, целая часть значения которого принадле- жит отрезку [1,15]. Оператор резервирует (объявляет) INT(α)+1 участков оперативной памяти для последующего временного хранения з а п и с е й конкретных файлов. Эти участки называются б у ф е р а м и . При выполнении оператора MAXFILES= кроме резервирования буферов произ- водится "чистка" значений переменных и закрытие всех ранее открытых фай- лов данных. β) OPEN"GRP:"[FOR OUTPUT]AS[#] N где: OPEN("открыть"), FOR("для"), OUTPUT("вывод"), AS("как") - служебные слова; "GRP:" - имя устройства вывода,которое передает информацию на гра- фический экран (SCREEN 2 ÷ SCREEN 8); N - арифметическое выражение, целая часть значения которого опре- деляет номер файла от 0 до значения, задаваемого оператором MAXFILES= . Этот оператор начинает процесс ввода-вывода файла. Вы должны выполнить его до использования любого процесса, связанного с выводом файла. Если файл был уже "открыт" оператором OPEN, то компьютер сообщает об ошибке: "File already open in ..." ("Ф а й л у ж е о т к р ы т в с т р о к е ...") γ) PRINT #N,A где: A - список арифметических и строковых выражений (разделенных запяты- ми или точками с запятой), значения которых выводятся на графические экра- ны; N - номер файла, "открытого" ранее оператором OPEN. Отметим, что вывод на экран происходит побайтно (посимвольно). Применение оператора PRINT#... без оператора OPEN приводит к сообщению об ошибке: "File not open in ..." ("Ф а й л не о т к р ы т в с т р о к е ...") Напомним также, что "обычный" оператор PRINT (без указания параметра н о м е р ф а й л а) в графических экранах игнорируется! δ) CLOSE [[#] N] , где: 1) CLOSE ("закрыть") - служебное слово; 2) N - номер файла, "открытого" оператором OPEN. Если оператор CLOSE задан без параметров, то закрываются все открытые с помощью оператора OPEN файлы. З а к р ы т и е ф а й л а означает, что все данные,оставшиеся в буфе- ре, читаются, все операции вывода прекращаются и буфер освобождается. Заметим,что оператор END выполняет неявный вызов оператора CLOSE для всех файлов. Таким образом, последовательность операторов при выводе текстовой или цифровой информации на графический экран может выглядеть, например, следу- ющим образом: П р и м е р 1. ───────────── NEW Ok 10 SCREEN 2 'Можно и SCREEN 8 20 OPEN "GRP:" AS #1 30 PSET(20,20) 'Можно и PRESET(20,20) 40 PRINT #1,PEEK(&HF3E9);PEEK(&HF3EA);PEEK(6HF3EB) 50 CLOSE #1 60 GOTO 60 'Данная программа позволяет вывести на графический экран те кущий цвет изображения, фона и бордюра П р и м е р 2. ───────────── NEW Ok 10 COLOR 1,11,7:SCREEN 2:MAXFILES=2 20 OPEN "GRP:" FOR OUTPUT AS#1 30 PSET (69,80),11:PRINT #1,"РИС 9.1 ЦВЕТА" 50 FOR I=1 TO 1000:NEXT I:CLOSE #1 60 SCREEN 3:OPEN "GRP:"FOR OUTPUT AS#2 80 PSET (50,80),11:PRINT #2,"БУКВЫ" 100 FOR I=1 TO 1000:NEXT I:CLOSE #2 Обратите внимание на то, что первые операторы строк 30 и 80 указывают то место экрана, с которого начинается текст, т.к. текст позиционируется так, что первый символ размещается с верхней левой точки позиции графичес- кого курсора. Заметим,что предложенный способ позволяет выводить символы т о л ь к о фиксированного формата в блоках точек размером 8╳8. Если требуется регули- ровать и размер букв, и расстояние между ними, то используйте оператор DRAW! В режимах SCREEN2, SCREEN3 и SCREEN4 символы при выводе "накладываются" на прежнее "содержимое" экрана (включая ранее выведенные символы).Поэтому, чтобы уничтожить строку символов,либо нарисуйте прямоугольник и закрасьте его цветом фона, либо выведите оператором PRINT#1,... ту же самую строку на прежнее место с помощью символов, имеющих цвет фона. П р и м е р 3. ───────────── NEW Ok 10 COLOR 1,11,7:SCREEN2:OPEN "GRP:"FOR OUTPUT AS #1 30 PSET (69,80),11:PRINT #1,"Рис 9.1 ЦВЕТА":GOSUB 1000'──▶ 55 LINE(69,80)-(100,87),11,BF 'Нарисован прямоугольник,внутренняя част ь которого закрашена цветом фона. 56 GOSUB 1000'──▶ 60 COLOR 11,11,7:PSET (69,80),11:PRINT #1,"Рис 9.1 ЦВЕТА" 68 GOSUB 1000'──▶ 69 COLOR 1,11,7:PSET (69,80),11:PRINT #1,"БУКВЫ" 100 FOR I=1 TO 1000:NEXT:CLOSE#1 110 END 1000 FOR I=1 TO 1000:NEXT:RETURN '──▶ Вначале на экране появляется надпись Рис 9.1 ЦВЕТА затем 9.1 ЦВЕТА далее экран становится чистым,и после паузы возникает надпись БУКВЫ А в режимах SCREEN5, SCREEN6, SCREEN7 и SCREEN8 наложения символов не происходит! Попробуйте "прогнать" следующий пример при различных значениях N (2÷8): П р и м е р 4. ───────────── NEW Ok 10 INPUT "Режим экрана";N:SCREEN N:OPEN"GRP:" AS#1 20 PRESET(90,90):PRINT#1,"Мама мыла" 30 FOR T=0 TO 500:NEXT 'Задержка 40 PRESET(90,90):PRINT#1,"раму" 50 GOTO 50 П р и м е р 5. ───────────── NEW Ok 10 SCREEN2:OPEN"GRP:"AS#1:LINE(20,40)-(70,90),1 25 PRINT#1,"Дядя Миша";:A$=INPUT$(1):SCREEN0 40 PRINT PEEK(&HFCB7);PEEK(&HFCB9) 50 PRINT PEEK(&HFCB3);PEEK(&HFCB5) run ·150··90 ·70··90 Ok Эта программа позволяет узнать координаты (X,Y) графического курсора и координаты (α,β) т.н. графического а к к у м у л я т о р а . Когда мы ри- суем точку (или линию), графический курсор и графический аккумулятор сов- падает. Различия возникают лишь при выводе текстовой информации. Графиче- ский курсор устанавливается в ту точку, которую мы вывели последний раз (оператором PSET, LINE, CIRCLE,...). Графический аккумулятор устанавлива- ется на то место, с которого должна быть напечатана очередная буква (убе- рите из строки 25 символ ";"). Как только после оператора PRINT#... мы ри- суем точку (PSET,LINE,...), графический курсор сразу же переходит в пози- цию графического аккумулятора, и далее они действуют совместно до нового оператора PRINT#. П р и м е р 6 [ 76 ]. Сочетание текста и иллюстраций. ──────────────────── 40 COLOR 15,15,15:SCREEN 2:OPEN"GRP:"AS#1 70 LINE(0,0)-(255,191),1,B:LINE(120,0)-(120,191),1:PRESET(8,32) 100 FOR I=1 TO 14 110 COLOR I:PRINT #1,"MSX COMPUTERS":PRESET STEP (8,0) 140 NEXT I 150 PRESET(164,16):COLOR 1:PRINT #1,"Круг" 180 CIRCLE(188,64),30:PAINT(188,64) 200 PRESET(128,112):COLOR 8:PRINT #1,"Kвадрат" 230 LINE(136,124)-STEP(40,40),8,BF 240 PRESET(160,102):COLOR 4:PRINT #1,"Треугольник" 270 LINE(208,118)-STEP(30,30):LINE-STEP(-30,0):LINE-STEP(0,-30) 300 GOTO 300 П р и м е р 7 [ 76 ]. Ввод данных в графическом режиме. ──────────────────── 40 COLOR 15,15,15:SCREEN 2,0,0:OPEN"GRP:"AS #1 70 LINE (0,0)-STEP(255,191),1,B 80 PRESET (8,8):COLOR 1:PRINT #1,"Радиус:"; 110 N$="" 120 X=80 130 PRESET(X,8) 140 A$=INPUT$(1) 150 IF A$=CHR$(13) THEN GOTO 250 170 'Подтверждение ввода 190 IF A$<"0" OR A$>"9" THEN PLAY"l24o2c":GOTO 130 200 PRINT #1,A$;:N$=N$+A$:X=X+8 210 GOTO 130 230 'Изображение о к р у ж н о с т и 250 R=VAL(N$) 260 IF R>80 THEN BEEP:GOTO 280 270 CIRCLE (128,100),R 280 LINE (80,8)-STEP(56,8),15,BF 290 GOTO 110