\/d ГЛАВА V. ГРАФИЧЕСКИЕ СРЕДСТВА MSX-BASIC \/d- Лучше один раз увидеть, чем сто раз услышать. Пословица До появления цветной машинной графики результаты работы компьютера бы- ли трудны для восприятия. Важная информация терялась среди второстепенной. Машинные игры, например, больше напоминали утомительную работу. Одной из ранних машинных игр была игра "Посадка на Луну".Играющие сидели перед чер- но-белым экраном, созерцая колонки цифр, говоривших об изменении высоты и скорости спускаемого летательного аппарата. Вводя команды,они пытались до- биться надежной, мягкой посадки на Луну. При неудаче на экране появлялись фразы типа: "Столкновение с поверхностью... Корабль разбит... Никого в жи- вых". При успешной игре, наоборот, на экране можно было прочесть: "Высота 0... Успешная посадка!". Компьютерный "Гольф" был, скорее, упражнением в быстром чтении, чем игрой. Длинные пассажи, описывающие направление движе- ния ("Слева от Вас песчаная лунка,а справа дерево. Свободное поле открыва- ется под углом 18 градусов..."), кончались вопросом:"Какую биту Вы выбира- ете?". После каждого удара возникало новое описание,так что один раунд иг- ры с компьютером занимал почти столько же времени, сколько реальная игра. Сегодняшние интерпретаторы языка BASIC содержат операторы цвета и гра- фики, которые можно применять в программе наряду с "обычными" операторами. Эти средства дают не только чисто зрительный, но и практический эффект в традиционных задачах обработки данных и вычислений. В живой и наглядной форме они помогают представить результаты,которые иначе оказались бы весь- ма трудны для восприятия. В разделах V.1-V.8 мы будем говорить о графических средствах ПЭВМ се- рии MSX-1, которые для компьютеров серии MSX-2 изменениям не подверглись! V.1. ОПЕРАТОР SCREEN В ПРОСТЕЙШЕМ СЛУЧАЕ (для компьютера MSX-1) На компьютерах серии MSX-1 существуют четыре режима работы дисплея:два т е к с т о в ы х (символьных) режима и два г р а ф и ч е с к и х, служа- щих для индикации соответственно текстовой (символьной) и графической ин- формации. В обоих графических режимах экран рассматривается как сетка из графических элементов - т о ч е к (пикселей, от англ. "picture element"- "элемент изображения"). Графическое изображение получается на дисплее пу- тем высвечивания точек различным цветом. Переключение с одного режима работы на другой (или, как говорят, "с од- ного экрана на другой") осуществляется оператором SCREEN n , где: SCREEN("screen"-"экран") - служебное слово; n - арифметическое выражение, целая часть значения которого должна принадлежать отрезку [0,3]; этот параметр указывает режим работы дисплея: a) n=0: символьный экран, одноцветный,имеющий максимум 24 строки и 40 столбцов (по умолчанию число столбцов- 39); b) n=1: символьный экран, многоцветный,имеющий максимум 24 строки и 32 столбца (по умолчанию число столбцов 29); c) n=2: графический экран высокого разрешения,имеющий 256 точек в строке и 192 - в столбце; d) n=3: графический экран низкого разрешения,имеющий 64 укрупненные "точки" в строке и 48 - в столбце. При включении питания компьютер автоматически устанавливается в режим SCREEN0. Этот режим обычно используется для ввода программ или для работы с программами редактирования текстов. Ясно,что в режиме высокого разрешения экран разбивается на большее чис- ло точек, чем в режиме низкого разрешения. Вследствие этого в первом слу- чае точки оказываются гораздо меньшего размера,благодаря чему изображение может содержать существенно большее число деталей. Отметим, что т о л ь к о в символьных режимах допустимо применение операторов ввода-вывода INPUT и PRINT, т.к. оператор PRINT в графических режимах игнорируется, а использование оператора INPUT в графических режи- мах SCREEN2 или SCREEN3 переводит компьютер в режим SCREEN0, после чего вновь необходима установка режима SCREEN 2 или SCREEN 3 соответственно. Любая пара целых чисел (X,Y) в диапазоне 0≤X≤255, 0≤Y≤191, задает на графических экранах SCREEN2 и SCREEN3 точку, однако учтите, что в режиме SCREEN3 блок размером 4╳4 точек создает изображение одной "точки",поэтому фактические размеры экрана SCREEN3 - 64╳48 укрупненных "точек"(см. рис.3). Для сравнения: стандартный телевизионный монитор (телевизор) имеет раз- решающую способность экрана 512╳256 точек,а профессиональная микроЭВМ фир- мы Tektronix (модель 4054) имеет экран с разрешающей способностью 4096╳3125 точек. 0 255 0 63 0┌───────────────────┐──▶X 0┌───────────────────┐──▶X │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ │▨▨▨▨▨ SCREEN2 ▨▨▨▨▨│ │▨▨▨▨▨ SCREEN3 ▨▨▨▨▨│ │▨▨ 256╳192 точек ▨▨│ │▨▨▨▨ 64╳48 точек ▨▨│ │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ 191│─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘ 47│─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘ ▼ Y ▼ Y Р и с. 3 Отметим, что система координат, изображенная на рис.3, используется также в таких микроЭВМ, как APPLE, TRS-80, IBM, ATARI. В любой момент времени одна из точек (α,β) экрана находится в особом состоянии или, как говорят, отмечена г р а ф и ч е с к и м к у р с о - р о м. Числа α и β в этом случае называют т е к у щ и м и к о о р д и - н а т а м и графического курсора. При включении компьютера графический курсор устанавливается в начальное положение (0,0) - верхний левый угол экрана. Заметим, что текущие координаты X и Y графического курсора можно опре- делить в режиме SCREEN0 или SCREEN1 при помощи команды (оператора) PRINT PEEK(&HFCB3);PEEK(&HFCB5) . П р и м е ч а н и е: 1) При включении питания компьютера неявно выполняется оператор SCREEN 0. 2) При вводе оператора SCREEN n (n=0,1,2,3) всегда очищается экран. 3) В прямом режиме Вы находитесь в SCREEN 0 или SCREEN 1. Возвращаясь в прямой режим, Вы снова перейдете в экран SCREEN 0 или в SCREEN 1,в зави- симости от последнего выполненного оператора. Соответственно ввод команды SCREEN 2 в прямом режиме очищает экран перед возвратом в режимы SCREEN 0 или SCREEN 1. V.2. ОПЕРАТОР WIDTH . ОПЕРАТОРЫ KEY OFF и KEY ON Оператор WIDTH используется для установки ширины экрана дисплея в сим- вольных режимах SCREEN 0 и SCREEN 1 (каждому режиму может соответствовать своя ширина экрана). Синтаксис оператора: WIDTH α , где: WIDTH("width"-"ширина") - служебное слово; α - арифметическое выражение, целая часть значения которого должна принадлежать отрезку [1,40] для режима SCREEN0 или отрезку [1,32] для ре- жима SCREEN1. После выполнения оператора WIDTH α средняя часть экрана шириной INT(α) становится доступной для ввода или вывода информации. П р и м е р: Ok ─────────── 10 WIDTH 1:?"Проверка":FOR I=1 TO 180:NEXT 20 WIDTH 40:?:?:?:?:?TAB(15);"Проверка" 30 FOR I=1 TO 180:NEXT:GOTO 10 Отметим, что оператор WIDTH является и командой непосредственного режи- ма. Например, для возвращения к "обычной" ширине экрана используйте коман- ду WIDTH 39 или команду WIDTH 29 . Отметим,что оператор WIDTH 80, разрешенный только для компьютера серии MSX-2,позволяет производить отображение 80 символов в одной экранной стро- ке. Ширина символов при этом уменьшается наполовину. (Напомним, что аргу- мент оператора WIDTH должен лежать в диапазоне от 1 до 80 для компьютеров серии MSX-2). В результате выполнения оператора KEY OFF , где KEY OFF ("key"-"клавиша") - служебное слово, из 24-й строки символьных экранов SCREEN0 и SCREEN 1 убирается индикация значений функциональных клавиш F1-F10. Тем самым эта строка становится до- ступной для ввода информации (размер экрана увеличивается на одну строку). П р и м е р: 10 KEY OFF:LOCATE 5,23 ─────────── 20 PRINT "Проверка KEY OFF" Оператор KEY ON отменяет действие оператора KEY OFF и отводит 24-ю строку экрана для ин- дикации значений функциональных клавиш F1-F10. В этой строке удобно показывать вспомогательную информацию, т.к. она в отличие от других не участвует в вертикальном сдвиге содержимого экрана! V.3. УПРАВЛЕНИЕ ТЕКСТОВЫМ КУРСОРОМ В данном разделе речь пойдет об операторе LOCATE установки текстового курсора "█" (не графического!) и функциях POS(α), LPOS(α), CSRLIN управ- ления текстовым курсором. О п е р а т о р LOCATE . Ф у н к ц и я CSRLIN . Ф у н к ц и и POS(α) и LPOS(α) Синтаксис оператора LOCATE: LOCATE [X][,Y][,α] , где: LOCATE("to locate"-"устанавливать") - служебное слово; X - арифметическое выражение,целая часть значения которого задает но- мер экранного столбца, в котором находится курсор (столбцы нумеруются сле- ва направо, начиная с нуля); Y - арифметическое выражение,целая часть значения которого задает но- мер экранной строки,в которой находится курсор (строки нумеруются сверху вниз, начиная с нуля); α - арифметическое выражение; если значение α равно 0, то курсор не отображается на экране (сливается с фоном), в противном случае курсор ото- бражается на экране (по умолчанию α=0). Значение α хранится в области системных переменных в ячейке с номером &HFCA9 (примените команду PRINT PEEK(&HFCA9)). Целая часть значения α должна принадлежать отрезку [0,255], в противном случае на экране дисплея появится сообщение об ошибке: "Illegal function call" ("Н е п р а в и л ь н ы й в ы з о в ф у н к ц и и"). Любой параметр оператора LOCATE может быть опущен,но запятые(запятая!), определяющие его позицию, обязательно должны присутствовать. Если X или Y, или α опущены, то сохраняются их предыдущие значения.Примеры записи опера- тора: LOCATE 25,10,1 LOCATE 15,,1 LOCATE 9 LOCATE ,,1 LOCATE ,4,1 LOCATE ,8 LOCATE 17,1 но не LOCATE 17,1, Оператор LOCATE перемещает курсор из текущей позиции в позицию (X,Y). Учтите, что данный оператор позволяет управлять курсором т о л ь к о в символьных экранах SCREEN0 и SCREEN1! П р и м е р ы: 1) 10 LOCATE 15,15,0 2) 10 LOCATE 15,15,1 ───────────── 20 FOR I=1 TO 300:NEXT 20 FOR I=1 TO 300:NEXT Если используются строка или столбец с номерами,большими,чем максималь- но отображаемые,но меньшими 255,то ошибки не произойдет,но курсор перемес- тится на максимально возможную позицию экрана дисплея в этом направлении. 3) NEW 4) NEW Ok Ok 10 CLS:LOCATE 5,3 3 CLS'Вначале очистим экран! 20 LINEINPUT A$ 5 LOCATE 255,1,1 run 7 FOR I=1 TO 400:NEXT ······ 10 LOCATE ,255,1 ······ 20 FOR I=1 TO 400:NEXT ······ 4 строка 30 LOCATE 1,,1 ·····█ ◀── 6 столбец 40 FOR I=1 TO 400:NEXT Компьютер ждет ввода символа! 50 LOCATE ,1,1 60 FOR I=1 TO 400:NEXT:GOTO 3 С помощью оператора LOCATE можно выводить информацию на текстовый эк- ран, начиная с нужного места. 5) NEW 7) NEW Ok Ok 10 CLS:LOCATE 3,2 10 CLS:LOCATE 1,1 20 PRINT"Смотри: ";CHR$(255) 20 ?CHR$(255);"Я здесь!" run 30 LOCATE 2,2,0:FOR I=1TO ···· 1000:NEXT ···· 40 ? CHR$(255);"А теперь ···Смотри: █ здесь!" Ok run 6) NEW ··· Ok ·█Я здесь! 10 LOCATE 14,15 ··█А теперь здесь! 20 ?PEEK(&HF3DD);PEEK(&HF3DC) Ok Функция CSRLIN , где CSRLIN ("Cursor ScReen LINe"-"строка курсора") - служебное слово, воз- вращает в символьных экранах SCREEN0 и SCREEN1 номер экранной строки,в ко- торой находится курсор. Учтите, что "верхняя"строка имеет номер нуль,"нижняя" имеет номер или 22 или 23 (в зависимости от того,используется ли эта строка для индикации значений функциональных клавиш). П р и м е р: табулирование функции y=x² на отрезке [A,B] с шагом H с ─────────── предотвращением непрерывного вертикального движения (скроллинга) результатов табулирования по экрану (информация движется по- странично, "высота" страницы - 22 строки). Напомним: с к р о л л и н г - рулонный режим перемещения строк снизу вверх или сверху вниз. NEW Ok 10 CLS:INPUT A,B,H:FOR X=A TO B STEP H' Оператор CLS важен! 20 IF CSRLIN=22 THEN ? X,X^2:FOR I=1 TO 1000:NEXT:LOCATE 0,1 ELSE ? X,X^2 30 NEXTX:FORI=(22-CSRLIN)*POS(0)TO(23-CSRLIN)*39:?CHR$(32);:NEXT:A$= INPUT$(1) Функция POS(α) , где: POS("POSition"-"позиция") - служебное слово; α - числовая константа (при выполнении функции не используется, но обязательно должна быть указана при обращении); возвращает в символьных экранах SCREEN0 и SCREEN1 номер экранного столбца, в котором находится курсор. Например: 10 LOCATE 14,15:PRINT POS(0);CSRLIN . Функция LPOS(α) ("Line Printer Position") указывает позицию печатающей головки MSX-принте- ра в строке. Функция LPOS(α) применяется для печати данных "в столбик" на принтере. Например: 25 IF LPOS(0)>10 THEN LPRINT X ELSE LPRINT TAB(10):LPRINT X V.4. БАЗОВЫЕ ГРАФИЧЕСКИЕ ОПЕРАТОРЫ MSX-BASIC Я думаю, что чертежи - очень полезное сред- ство против неопределенности слов. Г.Лейбниц V.4.1. О п е р а т о р COLOR д л я к о м п ь ю т е р а MSX-1 На экране дисплея можно выделить три отдельные области: передний план, фон и бордюр. П е р е д н и й п л а н (изображение) - область,где распо- лагаются цифровые и текстовые данные и графические изображения,которые на- кладываются на фон. Ф о н, как это следует из самого названия, - область экрана,на которой воспроизводится все,что выводится на экран; фон можно видеть сразу же пос- ле включения компьютера. Б о р д ю р (или цветовая р а м к а) занимает на экране область, непо- средственно прилегающую к его физическому контуру за пределами основного прямоугольного поля, используемого для вывода информации. Ясно,что бордюр окружает фон, но, например, в режиме SCREEN0 он того же цвета, что и сам фон, и поэтому не различим. Благодаря наличию бордюра сглаживаются разли- чия между экранами р а з н о т и п н ы х дисплеев. Оператор COLOR позволяет задавать различные цвета фона, бордюра и изо- бражения,выводимого на передний план. Его синтаксис: COLOR [I],[F][,B] , где: COLOR("color"-"цвет") - служебное слово; I - арифметическое выражение, целая часть значения которого задает код цвета изображения (по умолчанию I=15); F - арифметическое выражение, целая часть значения которого задает код цвета фона (по умолчанию F=4); B - арифметическое выражение, целая часть значения которого задает код цвета бордюра (по умолчанию B=4). Целые части значений I,F,B должны принадлежать [0,15]. Приведем коды 15 возможных цветов для многоцветных дисплеев. Для моно- хроматических (от греч."μоvoσ"-"один") дисплеев эти коды задают различные оттенки черного и зеленого цветов. 0:прозрачный; 5:светло-голубой; 10:темно-желтый; 1:черный; 6:темно-красный; 11:светло-желтый; 2:зеленый; 7:голубой; 12:темно-зеленый; 3:светло-зеленый; 8:красный; 13:васильковый; 4:темно-голубой; 9:светло-красный; 14:серый; 15:белый. Отметим, что объект прозрачного цвета всегда приобретает цвет бордюра, а бордюр "нулевого" цвета - черный (поэтому возможных цветов не 16, а 15)! Полное отсутствие параметров в операторе COLOR приводит к появлению на экране дисплея сообщения об ошибке "Missing operand" ("П р о п у с к о п е р а н д а"), а слишком большое значение хотя бы одного из параметров - к сообщению: "Illegal function call". Заметим,что параметры I, F, B можно не указывать,но если они не послед- ние в записи, то ограничивающие их запятые обязательны. Любой опущенный параметр (обозначенный только запятой перед ним)сохраняет старое значение. Каждый назначенный параметр "действует" до тех пор,пока не получит другое значение в последующем операторе COLOR. Таким образом, Вы можете написать подпрограмму для рисования некоторого объекта, а его цвет определить в ос- новной программе перед обращением к подпрограмме. Приведем примеры записи оператора: COLOR 15,4,4 COLOR ,,4 COLOR 1,15 COLOR ,1 COLOR 15,,1 COLOR 15 COLOR ,4,1 Укажем удобные для работы сочетания оттенков изображения, фона и бордю- ра для монохроматического зеленого дисплея: 1) для текстового экрана SCREEN0: COLOR 15,4 (темный фон); COLOR 1,15 (светлый фон); 2) для экранов SCREEN1, SCREEN2 и SCREEN3: COLOR 15,4,2 (темный фон); COLOR 1,15,8 (светлый фон); COLOR 1,15,2 (светлый фон) . В н и м а н и е! Если Вы случайно установите один и тот же код цвета и для изображения, и для фона,то экран окажется"чистым".В этом случае "всле- пую" в непосредственном режиме наберите, например, команду COLOR 1,15 или COLOR 15,4 и нажмите клавишу "RETURN". На экране появится информация,кото- рая ранее была "невидима"! П р и м е р. Программа, позволяющая подобрать удобные сочетания цветов ─────────── изображения, фона и бордюра. Ok 10 SCREEN 1:FOR I=1 TO 15:FOR F=1 TO 15:FOR B=1 TO 15 20 COLOR I,F,B:LOCATE 9,10:PRINT I;F;B 30 FOR K=1 TO 1000:NEXT:NEXT:NEXT:NEXT В любой момент времени Вы можете,нажав на клавишу "STOP" Вашего компью- тера, приостановить работу программы и выписать понравившуюся Вам комбина- цию значений I, F, B, которая выводится на экран дисплея. З а м е ч а н и е. Если Вы прервали программу,используя клавиши CTRL+STOP, то можете тут же возвратить начальные значения цветов нажатием клавиш SHIFT+F1 (только для компьютеров серии MSX-2)! При формировании конкретных изображений необходимо осторожно подходить к выбору цветов. Их случайный выбор может вызвать неприятные ощущения вплоть до раздражения. Учтите, что б е л ы й цвет располагает к чистоте, создает ощущение легкости, прохлады; ж е л т ы й - возбуждает радость,создает ощущение теп- ла,простора,легкости,ускоряет пульсацию крови,расширение зрачков; к р а с- н ы й - создает впечатление теплоты, возбуждает, ускоряет пульсацию крови, вызывает расширение зрачков,однако при длительном действии приводит к чрез- мерной усталости; п у р п у р н ы й - возбуждает,вызывает возвышенное чув- ство,ощущение тепла; з е л е н ы й - вызывает ощущение холода,успокаивает, налаживает кровообращение,улучшает мускульную деятельность; г о л у б о й- вызывает ощущение прохлады, отдаленности, успокаивает; ч е р н ы й - вызы- вает ощущение тяжести, тесноты, громоздкости, снижает настроение,угнетает; с е р ы й - холодный, вызывает скуку, апатию. Обычно рекомендуется уменьшать число используемых цветов. Можно полу- чить хороший эффект, если для фона выбрать цвет, являющийся "дополнитель- ным" к одному из используемых цветов. В перечень взаимодополняющих цветов входят: красный и голубой, желтый и синий, зеленый и красный (пурпурный). Если же парные дополнительные цвета расположить рядом,то в зрительном вос- приятии яркость каждого цвета усиливается. Это явление называется ц в е - т о в ы м к о н т р а с т о м. Если в изображении используется большое число цветов,то для фона лучше выбрать серый или нейтральный тон, причем черные контуры вокруг областей разного цвета улучшают восприятие изображения [14]. Отметим различия в выполнении оператора COLOR в режимах SCREEN 1 и SCREEN 2: α) во время выполнения оператора COLOR в режиме SCREEN 2 изменяется только цвет бордюра, а не цвет изображения или фона; β) цвет фона изменится только в том случае,если после выполнения опера- тора COLOR будет выполнен оператор CLS (см. ниже раздел V.4.3); Для проверки вышесказанного сравните следующие программы: 10 SCREEN 2:COLOR 1,15,6 20 GOTO20 'изменяется только цвет бордюра! 10 SCREEN 2:COLOR 1,15,6:CLS 20 GOTO 20 'изменяется цвет фона и бордюра! 10 COLOR 1,15,6:SCREEN 2 20 GOTO 20 'изменяется цвет фона и бордюра! Оператор SCREEN выполняет операцию, аналогичную CLS! В заключение этого раздела заметим,что коды текущего цвета изображения, фона и бордюра соответственно можно получить, выполнив в непосредственном режиме команду PRINT PEEK(&HF3E9);PEEK(&HF3EA);PEEK(&HF3EB) V.4.2. О п е р а т о р COLOR д л я к о м п ь ю т е р а MSX-2 П а л и т р а (от франц."palette"-"пластинка")- четырехугольная или овальная деревянная дощечка, металлическая или фарфоровая пластинка для смешивания красок; подбор цветов, которыми пользу- ется художник. Советский Энциклопедический Словарь Известно, что цвета (пронумерованные в MSX-BASIC от 0 до 15) содержат к р а с н ы й ("Red"), з е л е н ы й ("Green") и с и н и й ("Blue") цвет в определенных пропорциях. В приведенной ниже таблице Вы сможете почерпнуть сведения о пропорци- ях RGB в изначально установленных цветах экрана дисплея: ┌───────┬───────────────┬───┬───┬───┐ │ Номер │ Цвет │ R │ G │ B │ ├───────┼───────────────┼───┼───┼───┤ │ 0 │ Прозрачный │ 0 │ 0 │ 0 │ │ 1 │ Черный │ 0 │ 0 │ 0 │ │ 2 │ Средне-серый │ 1 │ 6 │ 1 │ │ 3 │ Светло-зеленый│ 3 │ 7 │ 3 │ │ 4 │ Темно-синий │ 1 │ 1 │ 7 │ │ 5 │ Светло-синий │ 2 │ 3 │ 7 │ │ 6 │ Темно-красный │ 5 │ 1 │ 1 │ │ 7 │ Голубой │ 2 │ 6 │ 7 │ │ 8 │ Средне-красный│ 7 │ 1 │ 1 │ │ 9 │ Светло-красный│ 7 │ 3 │ 3 │ │ 10 │ Темно-желтый │ 6 │ 6 │ 1 │ │ 11 │ Светло-желтый │ 6 │ 6 │ 4 │ │ 12 │ Темно-зеленый │ 1 │ 4 │ 1 │ │ 13 │ Лиловый │ 6 │ 2 │ 5 │ │ 14 │ Серый │ 5 │ 5 │ 5 │ │ 15 │ Белый │ 7 │ 7 │ 7 │ └───────┴───────────────┴───┴───┴───┘ В компьютере серии MSX-2 эти пропорции могут быть изменены при помощи оператора: COLOR=(C,R,G,B) , где: C - арифметическое выражение, целая часть значения которого опре- деляет номер и з м е н я е м о г о цвета; R,G,B - арифметические выражения, целые части значений которых опре- деляют соответственно пропорции красного, зеленого и синего цветов. Последние три числа должны находиться в диапазоне от 0 до 7. Например, пусть значением C является 4 (текущий цвет фона), и попробуй- те изменить для него пропорции RGB. Так, для получения чистого красного цвета фона, введите: COLOR=(4,7,0,0) Таким образом, можно получить 512 различных оттенков каждого цвета. Этот полезный оператор позволяет оперировать термином "н о м е р п а - л и т р ы" вместо термина "номер цвета", принятого на компьютерах серии MSX-1. Отметим, что оператор SCREEN устанавливает палитры в начальное положе- ние. Однако для установки палитры без стирания экрана используйте опера- тор: COLOR=NEW или COLOR ┌────────────────────────────────────────────────────────────────┐ │ Обратите внимание на то, что палитра не может быть изменена │ │ для компьютера серии MSX-1. │ └────────────────────────────────────────────────────────────────┘ Операторы типа COLOR=(4,7,0,0), COLOR=NEW или COLOR без параметров здесь являются запрещенными! V.4.3. О п е р а т о р CLS Существует быстрый способ получить чистый(свободный от изображения) эк- ран дисплея определенного цвета. Оператор CLS , где CLS("to CLear Screen"-"очищать экран") - служебное слово; окрашивает весь экран цветом фона,не меняя положения графического курсора в графичес- ких режимах (в символьных режимах после действия CLS курсор помещается в левый верхний угол экрана!). Помещайте самый первый оператор COLOR в Вашей программе перед операто- рами SCREEN2 или SCREEN3, в противном случае для изменения цвета фона эк- рана после оператора COLOR примените оператор CLS. Сравните результаты ра- боты двух фрагментов: 10 SCREEN 2:COLOR 1,15,4 10 SCREEN 2:COLOR 1,15,4 20 FOR I=1 TO 1000:NEXT 20 FOR I=1 TO 1000:NEXT 30 COLOR 15,1,4:CLS 30 ::::'Пустой оператор! 40 FOR I=1 TO 1000:NEXT:END 40 COLOR 15,1,4 50 FOR I=1 TO 1000:NEXT Очистка экрана необходима для того,чтобы получить результат работы про- граммы в "чистом" виде (экран дисплея, как правило, "засорен" текстом, от- ражающим работу по составлению программы, но не относящимся к ее исполне- нию). Кроме того, использование оператора CLS является элементом "культур- ного" программирования! Так оратор откашливается перед выступлением, забо- тясь о том, чтобы все слова донести до слушателей. V.4.4. О п е р а т о р PSET . О п е р а т о р PRESET Первая форма записи оператора PSET: I. PSET[@](Х,У)[,С] , где: PSET("to SET Point"-"установить точку") - служебное слово; X - арифметическое выражение, целая часть значения которого опреде- ляет x-координату точки (номер колонки); Y - арифметическое выражение, целая часть значения которого опреде- ляет y-координату точки (номер строки); С - арифметическое выражение, целая часть значения которого задает код цвета точки; @ - необязательный элемент оператора PSET, никак не влияющий на его выполнение; он используется только для совместимости с другими версиями языка BASIC. При попытке использовать оператор PSET в символьных экранах SCREEN 0 и SCREEN 1 компьютер сообщает об ошибке: "Illegal function call" . Целые части значений X и Y должны принадлежать отрезку [-32768,32767], а целая часть значения C должна находиться на отрезке [0,15];по умолчанию (отсутствие параметра C) используется текущий цвет изображения.Если точка (X,Y) находится "вне" графического экрана SCREEN2, (вне диапазона 0≤X≤255, 0≤Y≤191), то оператор не оказывает никакого действия. Поэтому, чтобы быть уверенным, что изображение точки строится в пределах экрана, желательно включать в программу проверку условий: 0≤X≤255, 0≤Y≤191. В результате выполнения оператора PSET графический курсор устанавлива- ется в точку, определяемую параметрами (X,Y),и раскрашивает ее цветом, оп- ределяемым значением параметра С. Обратим Ваше внимание на то, что оператор PSET может привести в режиме SCREEN2 к и з м е н е н и ю ц в е т а до 8 расположенных рядом точек в строке, определяемой значением Y. Например: 10 INPUT A:COLOR 1,15,8:SCREEN 2: 'Исследуйте:80≤A≤87,96≤A≤103 20 CIRCLE(90,90),7,11:PAINT STEP(0,0),11:PSET(A,90),8 30 GOTO 30 Дело в том, что каждая из 192 линий экрана SCREEN 2 разбивается на 32 восьмиточечных (восьмипиксельных) сегмента. Каждому сегменту "присваивает- ся" только д в а цвета - цвет изображения и цвет фона. Отображаемый на экране пиксель имеет цвет изображения, тогда как отсутствие пикселя озна- чает появление пикселя, имеющего цвет фона. Следовательно, для восьмипик- сельного сегмента возможно наличие всего д в у х цветов. Для режима SCREEN3 каждый блок точек 4╳4 создает на экране изображение одной"точки", поэтому любое изменение цвета"маленькой" точки в этом блоке вызывает и з м е н е н и е ц в е т а всего блока. Итак, вследствие неизбежного побочного эффекта "перетекания цветов",Вы должны быть очень аккуратны, применяя оператор PSET, так как при этом лег- ко можно изменить цвет уже нарисованной части изображения! П р и м е р ы: ───────────── 1) построение графика параболы Y²=50·X, X≥0, Y≥0. 10 COLOR 1,15,8:SCREEN 2 20 FOR X=0 TO 255:PSET(X,191-SQR(50*X)):NEXT 30 GOTO 30 А теперь исключите оператор GOTO30. Обнаружили разницу при запуске?... Думаем, что да! Запомните этот прием! 2) Ok 10 COLOR 1,15,8:SCREEN2:FOR T=0 TO 6.28*4 STEP .05:X=3*SIN(2*T): Y=3*COS(3*T):PSET(44+10*X,96-15*Y),1 55 U=30*COS(T)-30/5*COS(5*T):V=30*SIN(T)-30/5*SIN(5*T) 56 PSET(125+U,60+V),1:Z=T*COS(T):H=4*T*SIN(T):PSET(205+Z,96+H),1 :E=25*COS(T)+25/2*COS(3*T):G=25*SIN(T)-25/2*SIN(3*T):PSET(125+E, 130+G):NEXT 80 GOTO 80'Замените эту строку на 80 A$=INPUT$(1) ! 3) NEW Ok 10 INPUT A,B,K,N:COLOR 1,15,8:SCREEN2 20 FOR T=0 TO 6.28 STEP.05:R=A*(1+COS(K*T)^N)+B*SIN(K*T)^N:X=R*C OS(T):Y=R*SIN(T):PSET(128+X,96+Y):NEXT 40 GOTO 40 'Замените эту строку на 40 A$=INPUT$(1) ! II. Вторая форма записи оператора PSET: PSET[@]STEP(X,Y)[,C] , где: 1) STEP ("step"-"шаг") - служебное слово; 2) @,X,Y,C имеют тот же смысл, что и в пункте α). Элемент конструкции STEP(X,Y) задает смещение координат изображаемой точки на X и Y соответственно относительно т е к у щ е й позиции графи- ческого курсора. Например: 10 COLOR 0,15,8:SCREEN 2:PSET(20,20):PSET STEP(5,7):GOTO 10 В результате работы данного фрагмента программы на экране дисплея бу- дут изображены две красные точки: (20,20) и (25,27). П р и м е р ы: ───────────── 1) построение крошечных точек с разной раскраской. 10 COLOR 1,15,8:SCREEN3:PSET(45,95) 'Попробуйте режим 30 FOR X=0 TO 15:PSET STEP(10,0),X:NEXT ' SCREEN2 ! 60 GOTO60 'Подумайте, почему в режиме SCREEN3 расстояние между точками различно?! 2) построение графика функции y=0.77x+14·sin(x/6),-128≤x≤127 (объяс- ните назначение операторов PSET(0,95) и PSET(128,0)). 10 COLOR 1,15,8:SCREEN 2:PSET(0,95):FOR J=0 TO 255:PSET STEP(1,0 ),1:NEXT:PSET(128,0):FOR J=1 TO 191:PSET STEP(0,1),1:NEXT:FOR I= -128 TO 127:PSET(I+128,191/2-.77*I-14*SIN(I/6)),1:NEXT:B$=INPUT$ (1) 3) 10 CLS:INPUT"Введите Р (от 0 до 4) 5'Построение функциональных узоров 14.4)";Р 10 DEF FNF(X,Y)=SQR(X^2+Y^2) 20 COLOR 15,1,15:SCREEN3:E=0 20 SCREEN 3 30 FOR Y=1 TO 191 STEP4:FOR X=1 30 FOR X=-.375 TO .375 STEP 1/64 TO 255 STEP4:D=INT(E):PSET(X,Y), 40 FOR Y=-.375 TO .375 STEP 1/64 D:E=E+P 50 R=INT(200*FNF(X,Y)) 40 IF E>14 THEN E=0 60 C=R-2*INT(R/2) 50 NEXT X,Y 70 PSET(128+256*X,96+256*Y),C*11+4 60 GOTO 60 80 NEXT Y,X 90 GOTO 90 Оператор PRESET ("Point RESET"-"стирание точки") представим двумя син- таксическими конструкциями: PRESET[@](X,Y)[,C] PRESET[@]STEP(X,Y)[,C] Здесь элементы @, (X,Y), STEP(X,Y) и С имеют тот же смысл,что и в опе- раторе PSET, oднако при выполнении оператора PRESET без параметра С точка с координатами (X,Y) "стирается", т.е. приобретает цвет фона.Если же пара- метр С присутствует, то действия операторов PRESET и PSET идентичны. П р и м е р. Отрезок, "бегущий" по экрану! ─────────── 10 INPUT"Длина отрезка(≤45)";A:COLOR 1,15,8:SCREEN 2 20 FOR K=A TO 300:PSET(K,95):PRESET(K-A,95):NEXT:GOTO 20 V.4.5. О п е р а т о р LINE У точек бедных крошек, Ни ручек нет, ни ножек. Как же они, не пойму я, Сцепляются в прямую? Дж.А.Линдон Оператор LINE позволяет изображать отрезки прямых и прямоугольники с одновременной раскраской их требуемым цветом. Синтаксис оператора LINE: LINE [@][[STEP](X,Y)]-[STEP](Z,T),[C][,B(или BF)] , где: LINE("line"-"линия") - служебное слово; сочетания параметров (X,Y)-(Z,T) или STEP(X,Y)-STEP(Z,T) , или (X,Y)-STEP(Z,T), или STEP(X,Y)-(Z,T) , или -(Z,T) , или -STEP(Z,T) за- дают на экране две точки: α и β. Если первый из элементов отсутствует, то в качестве соответствующей точки берется та,в которой находится графичес- кий курсор (берутся координаты точки,использованной в последнем выполнен- ном графическом операторе). Координаты точек α и β должны принадлежать от- резку [-32768,32767],однако,в режимах SCREEN2 и SCREEN3 на экране дисплея отображаются только точки с координатами X oт 0 до 255 и Y от 0 до 191; С - арифметическое выражение, целая часть значения которого задает код цвета линии (0≤С≤15); В ("Box"-"прямоугольник") - параметр, определяющий рисование пря- моугольника (с заданием противоположных вершин) цветом С без закраски его внутренней части; BF("Box Fill"-"заполненный прямоугольник") - параметр, определяющий рисование прямоугольника с одновременной закраской его внутренней части цветом, код которого определяется значением C; @ - необязательный элемент оператора LINE, никак не влияющий на его выполнение. Обращение к оператору LINE в режимах SCREEN 0 или SCREEN 1 вызовет со- общение об ошибке: "Illegal function call". Если параметр C отсутствует,а параметр B (или BF) присутствует,то перед ним обязательно ставятся д в е запятые. В этом случае рисунок имеет цвет, заданный ранее оператором COLOR. Рассмотрим три случая: 1. Параметр B (или BF) отсутствует. В этом случае компьютер проводит на экране линию, имеющую цвет C и со- единяющую точки α и β. Примеры записи оператора: LINE(3,17)-(10,20),4 LINE STEP(3,20)-(21,23) LINE -(0,15),1 LINE STEP(10,20)-STEP(15,60) П р и м е р ы: ───────────── 1) NEW Ok 10 SCREEN 2:FOR X=-.5 TO .5 STEP.01:Y=1/(X^2-.05):K=K+2 40 LINE(K+25,Y+100)-(127,150):NEXT:A$=INPUT$(1) 2) NEW Ok 10 K=8*ATN(1):SCREEN 2:PSET(128,96+80*COS(10)) 20 FOR I=0TO K*6+.05 STEP.2:X=100*SIN(I):Y=80*COS(I+10) 40 LINE-(128+X,96+Y),1,B:NEXT:A$=INPUT$(1) 3) NEW Ok 10 SCREEN2:XM=256:YM=191:XC=XM/2:YC=YM/2 50 FOR X=0 TO XM:C=INT(RND(1)*16):LINE (XC,YC)-(X,0),C 80 NEXT X:FOR Y=0 TO YM:C=INT(RND(1)*16):LINE(XC,YC)-(XM,Y),C:NEXTY 140 FOR X=XM TO 0 STEP-1:C=INT(RND(1)*16):LINE(XC,YC)-(X,YM),C:NEXT X:FOR Y=YM TO 0 STEP-1:C=INT(RND(1)*16):LINE(XC,YC)-(0,Y),C:NEXTY 220 GOTO 220 4) NEW Ok 10'Построение линейчатых поверхностей ("ruled surface") 20 INPUT"i0,i1,h";I0,I1,H:INPUT"j0,j1";J0,J1 45 COLOR1,15,1:SCREEN2 50 'Лист Мебиуса.Начальные данные:{0,6.28,.0628,-20,20} 60 DEFFNX(U,V)=COS(U)*(50+V*COS(U)):DEFFNY(U,V)=SIN(U)*(50+V*COS(U) ):DEFFNZ(U,V)=V*SIN(U) 90 'Геликоид. Начальные данные:{-.7,6,.12,-45,45} 100 'DEFFNX(U,V)=V*COS(U):DEFFNY(U,V)=V*SIN(U) 120 'DEFFNZ(U,V)=25*U-80 300 FOR I=I0 TO I1 STEP H 310 J=J0:GOSUB 370:A=X:B=Y:I=I+H:GOSUB370:K=X:D=Y:I=I-H 320 J=J1:GOSUB 370:A1=X:B1=Y:I=I+H:GOSUB370:K1=X:D1=Y:I=I-H:LINE(A, B)-(A1,B1):LINE(A,B)-(K,D):LINE(A1,B1)-(K1,D1):NEXTI:A$=INPUT$(1):E ND 370 X=120+.7*(FNX(I,J)-FNY(I,J)):Y=94-(.7*(FNX(I,J)+FNY(I,J))+.7*FN Z(I,J)):RETURN '──▶ 5) NEW Ok 11 COLOR 15,4,4:SCREEN2:PI=3.14159:FORB=10TO 50 STEP 10 25 A=B/2:FOR D=0 TO360 STEP4:FI=2*PI*D/360:R=A*(1+COS(5*FI))+B*SIN( 5*FI)^2:X=R*COS(FI)+256/2:Y=R*SIN(FI)+191/2 85 IF D=0THEN LINE(X,Y)-(X+1,Y+1),15 ELSE LINE-(X,Y),15 90 NEXT:NEXT:PAINT(4,104),15:A$=INPUT$(1) Используя в операторе LINE пропуск координат первой точки ((X,Y) или STEP(X,Y)), можно "подхватить"линию с точки, где "остановился" предыдущий оператор, т.е.,например, связать прямые линии между собой в ломаную линию. Более того, прежде чем продолжить рисовать, программа может выполнить ка- кие-либо другие действия. Компьютер "не забудет",в какой точке процесс ри- сования был приостановлен! Если же в операторе указан параметр STEP, то заданные в круглых скобках координаты прибавляются к координатам послед- ней упомянутой позиции графического курсора. 6) NEW Ok 10 SCREEN2:PSET(115,95):GOSUB 100:END 100 RESTORE 1000:READ N:FOR I=1 TO N:READ X,Y 110 LINE -STEP(X,Y):NEXT:A$=INPUT$(1):END 1000 DATA 6,35,0,23,-35,-23,-35,-35,0,-23,35,22,35 "Относительный"вариант синтаксиса оператора LINE (с использованием па- раметра STEP) позволяет рисовать фигуры в "относительных" координатах. За- тем можно легко помещать один и тот же объект в различные места экрана, указывая лишь его "начальную" точку! 7) Программа рисования пятиугольника, разделенного на сегменты. Заданы: начальная точка (XB,YB), масштаб (S) и цвет (C). NEW Ok 10 INPUT XB,YB,S,C:GOSUB 120'──▶ 30 GOTO 30 120 RESTORE 170:SCREEN 2:COLOR 9:FOR X=1 TO 5:READ A,B 130 LINE (XB,YB)-STEP(A*S,B*S),C:NEXT:RESTORE 170:FOR X=1 TO 5:READ A,B:LINE-(A*S+XB,B*S+YB),C:NEXT:RETURN'──▶ 170 DATA 10,2,6,10,-6,10,-10,-2,0,-10 Подумайте, какие изменения нужно внести в программу, чтобы на экране компьютер изобразил "почти" правильный пятиугольник. 8) 5 INPUT "Введите Р=2,5,7,10,13";P:SCREEN2 10 RAD=60 20 FOR ANG%=0 TO 360 STEP P 30 RNG=ANG%*6.28/360:RG2=(ANG%+150)*6.28/360 50 X1=RAD*COS(RNG)+110:Y1=RAD*SIN(RNG)+90 70 X2=RAD*COS(RG2)+110:Y2=RAD*SIN(RG2)+90 85 LINE(X1,Y1)-(X2,Y2) 90 NEXT ANG% 100 GOTO 100 9) 10 SCREEN 2:N=18:DIM X(N),Y(N):R=99:DT=2*3.1415/N:T=0 70 FOR I=1 TO N:T=T+DT:X(I)=160+R*COS(T):Y(I)=100-R*SIN(T) 100 NEXT 110 FOR I=1 TO N-1:FOR J=I+1 TO N:LINE (X(I),Y(I))-(X(J),Y(J)) 140 NEXT:NEXT 160 GOTO 160 10) 170 DIM X(3),Y(3),XD(3),YD(3) 180 SCREEN2:R=150:XL=100:YU=50:N=60 220 X(0)=XL:X(1)=XL+R:X(2)=XL+R:X(3)=XL 230 Y(0)=YU+R:Y(1)=YU+R:Y(2)=YU:Y(3)=YU 240 SMU=.08:RMU=1-SMU 250 FOR I=1 TO N:FOR J=0 TO 3 260 XD(J)=RMU*X(J)+SMU*X((J+1)MOD4) 270 YD(J)=RMU*Y(J)+SMU*Y((J+1)MOD4) 280 NEXT 290 FOR J=0 TO 3:LINE (X(J),Y(J))-(X((J+1)MOD4),Y((J+1)MOD4)) 310 NEXT 320 FOR J=0 TO 3:X(J)=XD(J):Y(J)=YD(J):NEXT:NEXT 360 GOTO 360 11) 10 DIM X(3),Y(3),XD(3),YD(3):COLOR 1,15:SCREEN2 30 R=60:XL=10:YU=17 50 FOR K=1 TO 2:FOR L=1 TO 3 70 X(0)=XL:X(1)=XL+R:X(2)=XL+R:X(3)=XL 90 IF KMOD2=0 AND LMOD2=0 THEN 130 '──▶ 100 IF KMOD2=1 AND LMOD2=1 THEN 130 '──▶ 110 Y(0)=YU+R:Y(1)=YU+R:Y(2)=YU:Y(3)=YU 120 GOTO 140 '──▶ 130 Y(0)=YU :Y(1)=YU::Y(2)=YU+R:Y(3)=YU+R 140 SMU=.08:RMU=1-SMU 160 FOR I=1 TO 21:FOR J=0 TO 3 180 XD(J)=RMU*X(J)+SMU*X((J+1)MOD4) 190 YD(J)=RMU*Y(J)+SMU*Y((J+1)MOD4) 200 NEXT 210 FOR J=0 TO 3 220 LINE(X(J),Y(J))-(X((J+1)MOD 4),Y((J+1)MOD4)) 230 NEXT 240 FOR J=0 TO 3:X(J)=XD(J):Y(J)=YD(J):NEXT:NEXT 290 XL=XL+R:NEXT:XL=10:YU=YU+R:NEXT 330 GOTO 330 12) И наконец, о "перетекании цветов". Сравните результаты работы двух программ: 10 SCREEN 2 10 SCREEN 2 20 LINE(9,50)-(14,50),15 20 LINE(8,50)-(15,50) 30 LINE(12,40)-(12,60),1 30 LINE(12,40)-(12,60),1 40 GOTO 40 40 GOTO 40 2. Параметр В есть. В этом случае компьютер рисует прямоугольник со сторонами цвета C, па- раллельными "экранным" осям координат, причем, если указаны две точки α и β, они представляют собой противоположные вершины изображаемого прямоуго- льника. Внутренняя часть прямоугольника не закрашивается. Если же указана только вторая точка (не забудьте указать перед ней тире !), то в качестве первой используется точка,изображенная или упомянутая в Вашей программе последней. 13) α) 10 COLOR 1,11:SCREEN 2 β) 10 COLOR 1,11:SCREEN 2 20 LINE(8,10)-STEP(7,8),15,B 20 LINE(8,20)-STEP(3,8),15,B 30 LINE(16,10)-STEP(7,8),1,B 30 LINE(12,20)-STEP(11,8),1,B 40 GOTO 40 40 GOTO 40 γ) 10 COLOR 1,11:SCREEN 2 20 LINE(8,30)-STEP(11,8),15,B 30 LINE(20,30)-STEP(3,8),1,B 40 GOTO 40 В ы в о д: данные примеры совсем не означают, что невозможно создать многоцветные рисунки в режиме SCREEN 2. Однако расположение элементов ри- сунка должно быть тщательно выверено! При возникновении "конфликтов" между цветом линий и их расположением, параметр BF действует точно так же, как и оператор PSET: он изображает все "задействованные" пиксели, переустанавливает цвет изображения сегмен- та, тогда как цвет фона остается неизменным.Чтобы проверить это,вернитесь к программе, приведенной выше и замените параметр B на BF. 3. Параметр BF есть. Компьютер, как и в случае β,изображает на экране дисплея прямоугольник, но внутренняя часть его закрашивается цветом С. П р и м е р ы [4]: ───────────── 14) 5 'Смещенные прямоугольники 15) 5' Вложенные прямоугольники 10 COLOR 1,15,8:SCREEN2 10 COLOR 1,15,8:SCREEN2 20 FOR X=0 TO 15 20 FOR X=0 TO 15 30 LINE(40+7*X,30+5*X)-(130+ 30 LINE(2+8*X,6+6*X)-(254- 7*X,90+5*X),15-X,BF:NEXT 8*X,185-6*X),15-X,BF:NEXT 50 GOTO 50 40 GOTO 40 16) 5 'Прямоугольники разных цветов 10 COLOR 1,15,8:SCREEN2:PSET(-4,160) 20 FOR X=0 TO15:LINE STEP(8,-130)-STEP(8,130),X,BF:NEXT 50 GOTO 50 V.4.6. О п е р а т о р CIRCLE "Noli turbare CIRCilos meos!", - по преданию, Архимед встретил этими словами римского солдата-завоевателя, покушавшегося на его жизнь. С помощью этого оператора компьютер изображает окружности,эллипсы или их дуги (точнее, ту их часть, которая "умещается"на экране дисплея). Синтаксис оператора CIRCLE: CIRCLE [@][STEP](X,Y),R,[C],[α],[β][,γ] , где: CIRCLE("circle"-"круг,окружность") - служебное слово; @ - необязательный элемент оператора CIRCLE, никак не влияющий на его выполнение; X - арифметическое выражение, целая часть значения которого задает координату центра окружности (эллипса) по горизонтали; Y - арифметическое выражение,целая часть значения которого задает координату центра окружнос- ти (эллипса) по вертикали, значения X и Y должны принадлежать отрезку [-32768,32767]. Отметим, что центр окружности (эллипса) (X,Y) может быть расположен в л ю б о й точке координатной плоскости (Вы,конечно, помните, что на эк- ране будут изображены только те точки,координаты которых лежат в пределах 0≤X≤255 и 0≤Y≤191, причем начало координат находится в левом верхнем углу экрана). Далее,если указан параметр STEP,то координаты центра вычисляются путем сложения координат, указанных после служебного слова STEP с последними упомянутыми координатами графического курсора (о т н о с и т е л ь н о е задание координат центра); R - арифметическое выражение, целая часть значения которого должна принадлежать отрезку [-32768,32767]; C - арифметическое выражение, целая часть значения которого принад- лежит [0,15] и определяет код цвета изображения; α - арифметическое выражение,значением которого является начало дуги окружности в радианах (по умолчанию α=0); β - арифметическое выражение, значением которого является конец дуги окружности в радианах (по умолчанию с одинарной точностью β=2·π=6.28319). Важно отметить,что -6.28319≤α,β≤6.28319,причем, если значение α меньше значения β, то дуга окружности (эллипса) проводится против часовой стрел- ки,а если первое значение больше второго, то - по часовой стрелке! У компьютера "школьное"представление об окружности:поворот от направле- ния оси OX против часовой стрелки на прямой угол равен π/2 радиан, а пол- ный поворот составляет 2π радиан. Заметим, что если любой из параметров α,β является отрицательным,то ис- пользуется его абсолютное значение; при этом соответствующий конец дуги соединяется с центром линией радиуса (это необходимо при построении сек- торных диаграмм); к сожалению, компьютер "не различает" значения парамет- ров α и β,равные (-0) и 0, однако его можно "обмануть",если вместо -0 ука- зать, например, -0.001; γ - арифметическое выражение, значение которого задает коэффициент "сжатия" окружности; если значение параметра γ≠1 (по умолчанию γ=1), то компьютер изображает эллипс; так, например,при γ=2 будет изображен эллипс с отношением вертикальной и горизонтальной осей равным 2 (величина верти- кальной оси равна 2R); ориентация эллипса всегда либо горизонтальная, ли- бо вертикальная; если окружность на экране оказывается чуть "сплюснутой", то выберите параметр γ в полуинтервале (1,1.33] (ибо 256/192≈1.33). Величина параметра R определяет: a) радиус окружности, если γ=1; b) вертикальную полуось эллипса, если γ>1; c) горизонтальную полуось эллипса, если γ<1. Отметим, что любой необязательный параметр (STEP,C,α,β,γ) может быть опущен, однако соответствующие запятые в записи оператора должны указы- вать на его отсутствие. После последнего параметра запятая не нужна. В результате выполнения оператора CIRCLE компьютер нарисует эллипс(или его дугу), после чего графический курсор переместится в точку (R,Y)! Одна- ко, если далее нужно провести другую линию или поставить точку, то графи- ческий курсор вначале переместится в точку (X,Y), отмеченную в операторе CIRCLE, а уже затем компьютер будет считать последней упомянутой точкой центр окружности.Оператор графики,ссылающийся на последнюю упомянутую точ- ку, начнет построение из центра окружности. На примере показано,как использовать эту возможность, чтобы нарисовать красный леденец на желтой палочке: 10 COLOR 8,15,4:SCREEN2:CIRCLE(126,95),20,8:LINE-(126,140),11 20 GOTO 20'Обратите внимание на эффект "перетекания цветов"! Ошибки в задании параметров влекут за собой сообщения "Overflow" или "Syntax error" ("Переполнение") ("Синтаксическая ошибка") . Если компьютер "долгое" время ничего не рисует, то это скорее всего оз- начает, что Вы задали слишком большую величину радиуса окружности, и изо- бражение вышло за рамки экрана дисплея. П р и м е р ы: ───────────── 1) NEW ┌─────┬─────┬─────┬─────┐ Ok │▧ R ▧│▧ A ▧│▧ B ▧│▧ T ▧│ 10 INPUT R,A,B,T:SCREEN2: │─────│─────│─────│─────│ CIRCLE(127,95),R,,A,B,T │ 40 │ 0 │ 3.14│ 1 │ 20 GOTO 20 │ 40 │ 3.14│ 6.28│ 1 │ ┌─────┬─────┬─────┬─────┐ │ 40 │ 0 │ 6.28│ 1 │ │▧ R ▧│▧ A ▧│▧ B ▧│▧ T ▧│ │ 40 │ -0 │-3.14│ 1 │ │─────│─────│─────│─────│ │ 40 │ -.01│-3.14│ 1 │ │ 40 │-3.14│-0.79│ 1 │ │ 40 │ 0 │ 6.28│ 4 │ │ 40 │-6.00│-6.28│ 1 │ │ 40 │ 0 │ 6.28│ 0.25│ │ 40 │ -.79│-2.36│ .3 │ │ 110 │ 0 │ 3.14│ 1 │ └─────┴─────┴─────┴─────┘ └─────┴─────┴─────┴─────┘ 2) NEW Ok 10 COLOR1,15,4:SCREEN2:LINE(30,10)-(220,180),1,BF 30 CIRCLE(125,95),75,15:FOR R=5TO70STEP5:CIRCLE(125,92.5),R,15:CIRCLE( 125,97.5),R,15:NEXT 100 GOTO 100 3) NEW Ok 10 COLOR 1,15,8:SCREEN2:PSET(0,125):FOR K=1 TO 25:CIRCLE STEP(10,0),50 ,4,0,3.14159:NEXT:PSET(0,160):FOR K=1 TO50:CIRCLE STEP(5,0),30,4:NEXT: PSET(0,37):FOR K=1TO26 STEP.5:CIRCLE STEP(5,0),K,1:NEXT:A$=INPUT$(1) 4) NEW 5) NEW Ok Ok 10 COLOR 1,15,8:SCREEN2 10 COLOR 1,15,8:SCREEN2:R=1 20 FOR K=1 TO 100:C=INT(RND 00:P=50 (1)*16):E=RND(1):CIRCLE(128 20 I=I+.1:P=P-.5:R=R-Q:Q=Q+ ,95),80,C,,,E:NEXT .1:Y=P*SIN(I):CIRCLE(128,Y+ 60 GOTO 60 95),R,,,,.2 60 GOTO 20 6) NEW 7) NEW Ok Ok 5 '"Ползущий" эллипс 10 COLOR 1,15,8:SCREEN2 10 COLOR 1,15,8:SCREEN2 12 FOR E=5 TO 0 STEP-.099:C 20 PSET(0,95):FOR K=1 TO 25: IRCLE(128,96),80,1,,,E:NEXT CIRCLE STEP(10,0),50,4,,,.5: 30 GOTO 30 CIRCLE STEP(0,0),50,15,,,.5: NEXT:GOTO20 8) NEW Ok 5 '"Вороне где-то бог послал кусочек сыру..." 10 COLOR15,4,4:SCREEN2 15 CIRCLE(90,100),2,15:CIRCLE(100,50),2,15:CIRCLE(60,80),4,15:CIRCLE(7 0,125),3,15:CIRCLE(130,105),2,15 17 CIRCLE(100,140),3,15:CIRCLE(140,57),1,15:CIRCLE(150,80),2,15:CIRCLE (100,130),3,15:CIRCLE(110,60),4,15 20 CIRCLE(100,100),75,,-1,-1E-03,1.2 30 CIRCLE STEP(10,-5),75,,-1E-03,-1,1.2 50 PAINT(70,100):PAINT(130,80):B$=INPUT$(1) 9) NEW 10) NEW Ok Ok 10 COLOR 1,15,8:SCREEN2:Q=3 10 COLOR 1,15,8:SCREEN2 20 Q=Q-.05:I=I+Q 20 I=I+0.5 30 CIRCLE(128,95),I 30 CIRCLE(128,95),I 40 IF I>88 THEN 50 ELSE 20 40 IF I>88 THEN50ELSE20 50 GOTO 50 50 GOTO 50 11) NEW Ok 10 'Моделирование движения подпрыгивающего мяча [14]. 20 XM=256:YM=191:X=-10:INPUTH:W=3.14159/40:D=90*3.14159/1 80:K=.01:COLOR15,4,8:SCREEN2 100 KE=1:FORXN=0TOXM-10STEP4:YN=H*SIN(W*XN+D)*EXP(-K*XN) 130 LINE(0,YM)-(XM,YM):YN=YM-ABS(YN)-3:CIRCLE(X,Y),4,4:IF Y>186 THEN KE=KE+2:CIRCLE(XN+10,YN),4,KE ELSE CIRCLE(XN+10,YN),4,KE 170 X=XN+10:Y=YN:NEXT XN:GOTO 100 12) NEW Ok 10 COLOR 1,15,8:SCREEN2 20 FOR I=1 TO 13 30 CIRCLE(40+I*15,40+I*10),55-I*3,15-I,0,6.28:PAINT STEP(0,0),15-I 40 NEXT 50 GOTO 50 К сожалению, оператор CIRCLE не позволяет ориентировать эллипс под лю- бым углом по отношению к горизонтальной оси. Если Вы хотите отобразить та- кую кривую, воспользуйтесь следующим приемом: NEW Ok 10 SCREEN2:PI=4*ATN(1) 30 FOR I=0 TO 200 40 X=120+70*SIN(I*PI/100+PI/4):Y=90-50*COS(I*PI/100) 60 PSET(X,Y) 70 NEXT 80 GOTO 80 Сдвиг PI/4 (45 градусов) в программной строке 40 определяет угол накло- на большой полуоси эллипса к оси X. V.4.7. Ф у н к ц и я POINT . О п е р а т о р PAINT Синтаксис функции POINT: POINT [STEP](X,Y) , где: POINT ("point"-"точка") - служебное слово; X - арифметическое выражение, целая часть значения которого принад- лежит отрезку [0,255] и задает x-координату точки; Y -арифметическое вы- ражение, целая часть значения которого принадлежит отрезку [0,191] и зада- ет y-координату точки; STEP(X,Y) определяет смещение координат точки на X и Y соответствен- но относительно текущей позиции графического курсора. Функция POINT в графическом режиме (SCREEN2, SCREEN3) возвращает код цвета точки с координатами (X,Y),т.е. целое число, принадлежащее отрезку [0,15]. На текстовом экране функция POINT всегда возвращает н у л ь . Будьте осторожны! Иногда в режиме SCREEN 2 в о с е м ь (!) последова- тельных точек в строке окрашиваются одним цветом,т.к.на 8 соседних в стро- ке точек изображения (с номерами 0÷7,8÷15,...,248÷255) должно приходиться только два цвета: основной и фоновый. Попытка установить для этих восьми точек третий цвет приведет к переопределению уже имеющихся цветов! Если точка находится за пределами координатных ограничений (0≤X≤255, 0≤Y≤191), то функция возвращает -1;если точка не принадлежит изображению, то функция возвращает код цвета фона. Функция POINT в основном используется для: α) определения принадлежности точки некоторому рисунку; β) определения цвета границы; γ) определения, было ли столкновение движущегося на графическом экране объекта с другим объектом, также находящимся на графическом экране. П р и м е р ы: ───────────── 1) NEW Ok 5 '"Столкновение" движущегося отрезка с неподвижной "границей" 10 COLOR 1,15,8:SCREEN2:LINE(150,0)-(150,150),6 20 FOR K=10TO295:PSET(K,95):PRESET(K-10,95):FORI=1TO19:NEXT:IF POIN T(150,95)=1 THEN FORI=1TO1000:NEXT:SCREEN0:LOCATE 11,12:PRINT"Столк новение":END ELSE NEXT А теперь замените в условии оператора IF...THEN...ELSE POINT(150,95) на POINT(149,95)... Заметили разницу?! 2) NEW Ok 10 COLOR 1,15,8:SCREEN 3 20 FORK=1TO12:PSET(20*K,95),INT(RND(-TIME)*16):NEXT:P=0 50 FOR K=1 TO 12:IF POINT(20*K,95)=1 THEN P=1 70 NEXT:FOR K=1 TO 1000:NEXT:SCREEN0:KEY OFF 80 IF P=1 THEN GOSUB 110:FORI=1TO1000:NEXT:GOTO 10 ELSE GOSUB 100:F OR I=1 TO 1000:NEXT:GOTO 10 100 LOCATE 9,12:PRINT"Черных точек нет!":RETURN 110 LOCATE 9,12:PRINT"Черные точки есть!":RETURN 3) Для закраски точки (X,Y) примените следующий прием: PSET(X,Y),POINT(U,V) где точка (U,V) принадлежит ф о н у! Другой способ закраски точки на гра- фическом экране Вы узнаете, изучив оператор PAINT. Забегая д а л е к о в п е р е д, отметим, что эта функция игнорирует с п р а й т ы. Если точка изображается в белом цвете потому,что скрыта бе- лым спрайтом, возвращаемый цвет соответствует действительному цвету точки. Для закрашивания областей,ограниченных замкнутыми о д н о ц в е т н ы- м и линиями, используется оператор PAINT, синтаксис которого: PAINT [@][STEP](X,Y),[C][,G] где: PAINT("to paint"-"красить") - служебное слово; @ - необязательный элемент оператора PAINT, никак не влияющий на его выполнение; X - арифметическое выражение, целая часть значения которого принад- лежит отрезку [0,255] и определяет x-координату точки; Y - арифметическое выражение, целая часть значения которого принадлежит отрезку [0,191] и оп- ределяет y-координату точки; (заметим, что, в отличие от других графичес- ких операторов, значения X и Y должны обязательно находиться в прямоуголь- нике [0,255]╳[0,191], в противном случае компьютер сообщает об ошибке: "Illegal function call in ..."; параметр STEP, как всегда, указывает смещение закрашиваемой точки от последней упомянутой Вами точки; С - арифметическое выражение, целая часть значения которого принад- лежит отрезку [0,15] и задает код цвета закраски области графического эк- рана; если параметр С опущен, то область закрашивается текущим цветом изо- бражения; G - арифметическое выражение, целая часть значения которого принад- лежит отрезку [0,15] и задает код цвета границы закрашиваемой области; ес- ли параметр G опущен, то используется код текущего цвета изображения;этот параметр игнорируется в режиме SCREEN2, поэтому в SCREEN2 контур другого цвета можно получить,рисуя этот контур повторно требуемым цветом. В режи- мах SCREEN 3, SCREEN 5 ÷ SCREEN 8 такой проблемы не существует! Заметим,что если параметр С опущен,а параметр G присутствует, то перед параметром G должны стоять две запятые, указывающие на отсутствие парамет- ра С. Пусть целые части значений параметров X,Y определяют точку с координа- тами (X1,Y1). Обозначим ∑ - совокупность областей, ограниченных замкнутыми линиями цвета C, для которых точка (X1,Y1) является в н у т р е н н е й (если точ- ка принадлежит границе области, то компьютер окажется в "раздумье":что же ему закрашивать? И ... ничего не закрасит!). Если таких областей нет, то примем за ∑ весь экран дисплея. Далее, пусть область σ - пересечение обла- стей семейства ∑. Тогда после выполнения оператора PAINT область σ закра- шивается цветом С. Итак, для закрашивания области необходимо указать: α) координаты произвольной точки, лежащей внутри области; β) цвет закраски области и цвет контура, который Вы не хотите пересе- кать при закрашивании. Отметим, что оператор PAINT - очень "медленный" оператор по сравнению с оператором LINE (с параметром BF); так,закраска всего экрана занимает в режиме SCREEN2 около 15 секунд. Наконец, учтите,что даже мельчайшая"проре- ха" в границе (разрыв контура) позволяет оператору PAINT "пролиться нару- жу"и закрасить те участки экрана, которые Вы и не собирались окрашивать! Поскольку при выполнении оператора PAINT используется стековая память, понятно,что в процессе закрашивания некоторой области на экране внезапно может появиться сообщение об ошибке: "Out of memory" . Вероятность появления такой ошибки повышается, если оператор PAINT яв- ляется частью "глубоко" вложенных друг в друга циклов FOR...NEXT или под- программ, или же если контур, ограничивающий закрашиваемую область, имеет достаточно сложную форму. П р и м е р ы: ───────────── 1) NEW 2) NEW Ok Ok 10 COLOR 1,15,8:SCREEN2 10 COLOR 1,15,8:SCREEN2 20 FOR K=0 TO 15 20 FOR K=0 TO 15 30 CIRCLE(128,95),127-8*K, 30 CIRCLE(128,95),127-8*K 15-K,,,.7 ,15-K,0.,6.25,.7' 2π≈6.28! 40 PAINT(128,95),15-K 40 PAINT(128,95),15-K 50 NEXT 50 NEXT 60 GOTO 60 60 GOTO 60 3) NEW 4) NEW Ok Ok 10 COLOR 1,15,8:SCREEN3 10 SCREEN2 20 FOR K=0 TO 15:CIRCLE 20 CIRCLE(128,95),60,10 (128,95),127-8*K,K,,,.7: 30 PAINT STEP(0,0),10 PAINT(128,95),15-K,K:NEXT 40 GOTO 40 60 GOTO 60 5) 10 COLOR 1,10,4:SCREEN2:FOR I=20 TO 110 STEP 10:CIRCLE(I+128,95),80 ,1:PAINT(1.85*I,I+1),1:NEXT:A$=INPUT$(1) 6) Ok 10 COLOR1,15,8:SCREEN2 20 CIRCLE(95,60),20,1,-.01,-4.7124,1.1:PAINT(85,55),1:CIRCLE(95,125 ),20,1,-1.5708,-6.2832,1.1:PAINT(85,130),1:CIRCLE(154,60),20,1,-4.7 124,-3.1416,1.1:PAINT(145,50),1:CIRCLE(154,125),20,1,-3.1416,-1.570 8,1.1:PAINT(155,106),1:GOTO20 V.4.8. В ы в о д р и с у н к о в на п р и н т е р ...Вы печатаете на клавиатуре заклинание, и вот экран дисплея оживает, показывая объекты, которых не было и не может быть никогда. Ф.Брукс А сейчас мы научим Вас выводить на печатающее устройство (принтер) ри- сунки, изображенные компьютером на экране дисплея. Для этого используем вспомогательную подпрограмму, записанную в двоичных кодах, загрузка кото- рой в оперативную память компьютера осуществляется подпрограммой с именем HARDCOPY.BAS . П р и м е р 1 [14]. Восстановим облик хищного тираннозавра (ящера-раз- ───────────────── бойника), жившего в мезозойскую эру (он достигал высоты 5 м, длины 14 м). NEW Ok 10 CLS:COLOR 1,15,8:SCREEN2:R=5/6 30 READ N:IF N=0 THEN 350 50 READ X1,Y1:X1=X1/2:Y1=Y1/.9:Y1=Y1*R 70 FOR P=2 TO N:READ X2,Y2:X2=X2/2:Y2=Y2/.9:Y2=Y2*R 90 LINE(X1,Y1)-(X2,Y2),1:X1=X2:Y1=Y2:NEXT P 130 GOTO 30 135 'Основная часть туловища тираннозавра 140 DATA 38,223,60,180,71,173,65,174,63,179,64,180,62,185,62,187,60,19 2,60,194,57,200,57,202,55,183,55,182,59,172,58,171,62,165,57,170,50,22 0,31,233,31,245,40,260,60,290,67,315,72 170 DATA 345,80,360,87,380,105,400,127,425,145,452,155,502,164,450,164, 434,162,415,158,395,153,362,138,323,132,283,125 190 'Большая задняя лапа. 200 DATA 16,289,92,250,120,250,135,260,157,233,163,247,163,240,165,257, 164,256,166,272,159,270,153,278,140,280,120,285,120,310,120,330,112 230 'Маленькая задняя лапа. 240 DATA 11,295,127,303,158,278,162,288,162,282,163 250 DATA 291,164,283,165,315,162,315,157,325,137,323,132 260 'Передняя лапа. 270 DATA 11,238,77,220,87,192,99,192,102,195,100 280 DATA 198,102,200,100,203,102,205,98,218,96,255,83 290 'Остальная часть тираннозавра. 300 DATA 3,258,114,245,105,228,93,3,222,86,215,77,210,65 320 'Глаз. 330 DATA 4,220,42,210,45,215,40,220,42,0 350 GOSUB 55020 '──▶ Вызов подпрограммы HARDCOPY.BAS 360 A=USR(0)'Вызов подпрограммы вывода на принтер,загруженной ранее в оперативную память подпрограммой HARDCOPY.BAS 370 END '"What you see is what you get!" 55010 'Подпрограмма HARDCOPY.BAS 55020 DT=&HEF00:DEFUSR=DT:RESTORE 55060 55030 FOR I=0 TO &HAB 55040 READ DT$:POKE DT+I,VAL("&H"+DT$) 55050 NEXT:RETURN '──▶ 55060 DATA 21,00,20,22,AC,EF,21,91,EF,CD,87 55070 DATA EF,21,9B,EF,CD,87,EF,0E,08,2A,AC 55080 DATA EF,CD,4A,00,57,E6,0F,5F,CB,3A,CB,3A 55090 DATA CB,3A,CB,3A,00,3E,0F,BA,20,0D,BB 55100 DATA 20,03,AF,18,11,CD,7F,EF,EE,FF,18 55110 DATA 0A,BB,28,04,3E,FF,18,03,CD,7F,EF,23 55120 DATA 22,AC,EF,06,08,21,AE,EF,CB,27,CB 55130 DATA 1E,23,10,F9,0D,20,BE,06,08,21,AE 55140 DATA EF,7E,CD,A5,00,23,10,F9,2A,AC,EF,AF 55150 DATA BD,20,A9,3E,0D,CD,A5,00,3E,0A,CD 55160 DATA A5,00,3E,38,BC,20,94,21,A2,EF,CD 55170 DATA 87,EF,C9,CB,AC,CD,4A,00,CB,EC,C9,7E 55180 DATA FE,FF,C8,CD,A5,00,23,18,F6,1B,54,31 55190 DATA 36,1B,45,1B,3E,0E,FF,1B,53,30,32,35 55200 DATA 36,FF,1B,4E,0F,1B,41,1B,3C,0D,0A,FF П р и м е р 2. "Лучше гор могут быть только горы" (В.Высоцкий). ───────────── Л.Карпентер и независимо от него А.Фурнье и Д.Фассел изобрели метод "ф р а к т а л е й"("fractal"), в котором неправильность естественных объ- ектов (линия берега,горы и т.д.) имитируется компьютером за счет внесения случайных вариаций в представленный художником рисунок, делая гладкие ли- нии изломанными и т.п. Методом "фракталей" удается получать на удивление реалистические горы, долины, с раскиданными по ним валунами, береговые ли- нии, скопления звезд, цветные географические карты, хлопья снега, ветви деревьев и т.д., а художнику остается лишь задать небольшое количество то- чек. Алгоритм метода изложен в монографии [15]. В пространстве берется некоторый исходный треугольник и над ним выпол- няется следующая процедура. Находятся средние точки всех сторон треуголь- ника и переносятся (не обязательно в одной плоскости) на расстояние, про- порциональное длине соответствующей стороны. Коэффициент пропорциональнос- ти при этом выбирается случайным образом. Соединяя три получившиеся в ре- зультате точки, определяем четыре новых треугольника. Затем та же процеду- ра по очереди применяется к каждому из этих четырех треугольников. Теперь образуется 16 треугольников и т.д. Таким образом, из одного исходного тре- угольника можно получить целое множество треугольников, образующих очень сложную полигональную поверхность. Ее изображение создается обычным обра- зом: удаляются скрытые поверхности, и затем производится закраска. Приведенная ниже программа позволяет в любой момент времени вывести ри- сунок, изображенный на экране, "на принтер" по нажатию клавиши "p",после чего Вы можете продолжить работу программы, нажав любую клавишу. Итак,включайте скорее принтер... NEW Ok 10 COLOR 1,15,8:SCREEN2:C=120:O=RND(-TIME) 20 DIM P(300,2),L(300,2) 30 P(1,1)=10:P(1,2)=170:P(2,1)=240:P(2,2)=170:L(1,1)=1:L(1,2)=2:PTS=2: LNS=1:J=PTS:K=LNS 40 FOR I=1 TO LNS:J=J+1:K=K+1:S=LNS 50 IF I=1 THEN P1=J-1:P2=K-1:DIM Q3(S),Q4(S),Q5(S),Q6(S) 60 A=L(I,1):B=L(I,2):X1=P(A,1):Q3(I)=X1:Y1=P(A,2):Q4(I)=Y1 70 X2=P(B,1):Q5(I)=X2:Y2=P(B,2):Q6(I)=Y2:LINE(X1,Y1)-(X2,Y2):IF I==LB(X2-XA) THEN 210 180 LB(X2-XA)=Y2 190 IF UB(X2-XA)=0 THEN UB(X2-XA)=Y2 200 GOTO 230 210 IF Y2<=UB(X2-XA) THEN 240 220 UB(X2-XA)=Y2 230 LINE((X1-80)/2,Y1)-((X2-80)/2,Y2) 240 X1=X2:Y1=Y2 250 NEXT X,Z 350 GOSUB 55020 '──▶ Вызов подпрограммы HARDCOPY.BAS 360 A=USR(0) '──▶ 370 END '"What you see is what you get!" 55010 'Подпрограмма HARDCOPY.BAS 55020 DT=&HEF00:DEFUSR=DT:RESTORE 55060 55030 FOR I=0 TO &HAB 55040 READ DT$:POKE DT+I,VAL("&H"+DT$) 55050 NEXT:RETURN '──▶ 55060 DATA 21,00,20,22,AC,EF,21,91,EF,CD,87 ··· ··· 55200 DATA 36,FF,1B,4E,0F,1B,41,1B,3C,0D,0A,FF П р и м е р 4. ───────────── NEW Ok 2 DIM G(2000) 'Программа построения поверхностей! 4 DEFFNZ(X,Y)=(60^(2/3)-(X^2+Y^2)^(1/3))^(3/2) 'L=0 5 'DEFFNZ(X,Y)=SQR(20^2-(SQR(X^2+Y^2)-35)^2) 'L=0 6 'DEFFNZ(X,Y)=10*COS(.24*SQR(X^2+Y^2)) 'L=0 7 'DEFFNZ(X,Y)=COS(.1*X)*COS(.1*Y)*10 'L=0 8 'DEFFNZ(X,Y)=25*COS(2.5E-03*X*Y) 'L=0.6, L=0 9 'DEFFNZ(X,Y)=75*EXP(-SQR(X^2+Y^2)^2/600) 'L=0 10 'DEFFNZ(X,Y)=64E-05*X*Y*(X*X-Y*Y)/SQR(X^2+Y^2)'L=1.4, 'L=2 12 'DEFFNZ(X,Y)=SIN(SQR(X^2+Y^2)/5)/SQR(X^2+Y^2)*175 'L=0 13 'DEFFNZ(X,Y)=30*COS(X*.05*EXP(-Y*.01)) 'L=.785, L=0 14 'DEFFNZ(X,Y)=(X^2-Y^2)/45 'L=.785, L=0 15 'DEFFNZ(X,Y)=20*COS((X+Y)/LOG(X^2+Y^4+.5)) 'L=.785, L=0 16 'DEFFNZ(X,Y)=30*COS((X+Y)/LOG(X^2+Y^2+.5)) 'L=.785, L=0 17 'DEFFNZ(X,Y)=10*SIN(.1*(ABS(X)+ABS(Y))) 'L=0 18 INPUT"Угол поворота";L!:N!=COS(L!):M!=SIN(L!) 19 DEFFNF(X,Y)=FNZ(X*N!-Y*M!,X*M!+Y*N!) 20 COLOR1,15,1:SCREEN2:A=SQR(2) 30 FOR T=-90*A TO 90*A STEP A:W=-100:V=100:C=0:FOR I=-60 TO 60 STEP 6: J=I-T 35 IF J>60 OR J<-60 THEN 70 37 'IF20^2<(SQR(I^2+J^2)-35)^2THEN 70 'Только для строки 5! 40 'IF I=0 AND J=0 THEN 70 'Только для строк 10 и 12! 43 IF (I^2+J^2)^(1/3)>60^(2/3)THEN70 'Только для строки 4! 49 Y1%=INT(.70634*(I+J)+FNF(I,J)+.5) 50 IFY1%>W THEN W=Y1%:C=C+1:IF C=1 THENG(INT(T)+220)=W:V=W:GOTO 60 ELS E 60 55 IF Y1%60 OR I<-60 THEN 120 90 'IF20^2<(SQR(I^2+J^2)-35)^2THEN120 'Только для строки 5! 91 'IF I=0ANDJ=0 THEN 120 'Только для строк 10 и 12! 93 IF(I^2+J^2)^(1/3)>60^(2/3)THEN120 'Только для строки 4! 99 Y1%=INT(.70634*(I+J)+FNF(I,J)+.5) 100 IF Y1%>W THEN G(INT(T)+220)=Y1% ELSE 120 110 PSET(INT(120+.70634*(I-J)+.5),94-Y1%) 120 NEXTJ,T 150 GOSUB 55020 '──▶ Вызов подпрограммы HARDCOPY.BAS 160 A=USR(0) '──▶ 200 END 55010 'Подпрограмма HARDCOPY.BAS 55020 DT=&HEF00:DEFUSR=DT:RESTORE 55060 55030 FOR I=0 TO &HAB 55040 READ DT$:POKE DT+I,VAL("&H"+DT$) 55050 NEXT:RETURN '──▶ 55060 DATA 21,00,20,22,AC,EF,21,91,EF,CD,87 ··· ··· ··· 55200 DATA 36,FF,1B,4E,0F,1B,41,1B,3C,0D,0A,FF П р и м е р 5 [16]. "Рисуют головой, а не руками" (Б.Микельанджело). ───────────── NEW Ok 15 COLOR 1,15,8:CLS:PRINT"Для вывода полученного графика на принтер на жмите клавишу ESC":PRINT 20 PRINT "1. Построение графика функции в декартовых координатах":PRIN T "2. Построение кривых в полярных координатах":INPUT"Режим (1,2)";SW: ON SW GOTO 110,390 50 ' ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 70 ' ∗ Построение графика функции в декартовых координатах∗ 90 ' ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 110 SX=255:SY=191:HY=SY/2 'Форматирование экрана дисплея! 120 CLS:DEFFNA(X)=EXP(-ABS(X))*SIN(1/X) 130 PRINT"Область изменения X:" 140 INPUT"min-значение:";A:INPUT"max-значение:";B:PRINT 160 IF A>=B THEN PRINT"Ошибка!":GOTO130 170 INPUT"Количество точек на единицу площади экрана";W 180 C=(B-A)/100:M=1E-30:SCREEN2 'C-шаг 200 FORX=ATOBSTEPC:IFX=0THENNEXT'Учет области определения! 220 Y=ABS(FNA(X)):IF MSY THEN NEXT 290 PSET(U,V),1:NEXT:GOTO 800 320 ' ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 340 ' ∗ Кривые в полярных координатах ∗ 370 ' ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ 390 SX=255:SY=191:RAT=.86:HY=SY/2:HX=SX/2 410 CLS:DEFFNA(Z)=COS(8*Z) 420 ?"X=COS(A·Z)COS(8·Z)":?"Y=SIN(B·Z)COS(8·Z)":PRINT 440 INPUT"A=";A:INPUT"B=";B 450 M=1E-30:FOR Z=0 TO 8*ATN(1):R=ABS(FNA(Z)) 470 IF MSXTHENNEXT 530 V=HY+HY*SIN(B*Z)*R/M:IF V<0 OR V>SY THEN NEXT 550 PSET(U,V),1:NEXT 800 PIT$=INKEY$:IF PIT$<>CHR$(27) THEN 800 830 GOSUB 850'──▶ 840 A=USR(0):END '───────▶ 850 DT=&HEF00:DEFUSR=DT:RESTORE 890 860 FOR I=0 TO &HAB:READ DT$:POKE DT+I,VAL("&H"+DT$) 880 NEXT:RETURN '──▶ 890 DATA 21,00,20,22,AC,EF,21,91,EF,CD,87 ··· ··· ··· 1030 DATA 36,FF,1B,4E,0F,1B,41,1B,3C,0D,0A,FF П р и м е р 6. Обратите внимание на подпрограмму вывода на принтер - ───────────── она написана на "чистом" MSX-BASIC ! NEW Ok 20 SCREEN 2:COLOR 13,1,1:CLS 40 CIRCLE (120,96),88:CIRCLE (120,96),88,,,,8/11 60 CIRCLE (120,96),88,,,,5/11:CIRCLE (120,96),88,,,,2/11 80 CIRCLE (120,96),88,,,,11/8:CIRCLE (120,96),88,,,,11/5 100 CIRCLE (120,96),88,,,,11/2 110 PAINT (86,27):PAINT (121,26):PAINT (154,27):PAINT (51,65) 150 PAINT (94,50):PAINT (141,50):PAINT (187,61):PAINT (67,76) 190 PAINT (121,69):PAINT (169,71):PAINT (44,95):PAINT (88,102) 230 PAINT (150,97):PAINT (193,97):PAINT (68,121):PAINT (121,120) 270 PAINT (169,119):PAINT (57,133):PAINT (95,144):PAINT (142,143) 310 PAINT (187,129):PAINT (85,162):PAINT (122,167):PAINT (151,164) 350 LINE (32,8)-(208,184),,B 360 PAINT(41,24):PAINT(195,22):PAINT(43,171):PAINT(193,170) 400 COLOR 7:LINE (212,4)-(27,188),,B:LINE (214,3)-(24,189),,B 430 GOSUB 1000 '──▶ 440 COLOR 15,4,7:END 1000 ' ∗∗∗∗∗∗∗∗∗ (C) by TOSHIBA ∗∗∗∗∗∗∗∗∗ 1040 DEFINT A-Z 1050 SMO=PEEK(&HFCAF) 1060 IF SMO<>2 THEN BEEP:RETURN 1070 BAK=PEEK(&HF3EA) 1080 COL=BASE(11) 1090 CGP=BASE(12) 1100 LPRINT CHR$(27);"T16";CHR$(27);"E";CHR$(14); 1110 LPRINT CHR$(27);">";:POKE &HF418,1 1120 FOR YIN=1 TO 24 1130 LPRINT CHR$(27);"S0256"; 1140 FOR XIN=1 TO 32 1150 FOR CLR=1 TO 8 1160 DT(CLR)=0 1170 NEXT CLR 1180 FOR BIN=1 TO 8 1190 DT=VPEEK(CGP):CGP=CGP+1 1200 C0=VPEEK(COL):COL=COL+1 1210 C1=(C0 AND &HF0)/&H10 1220 C0=C0 AND &HF 1230 IF C0<>BAK AND C1<>BAK THEN DT=&HFF:GOTO 1260 1240 IF C0=BAK AND C1=BAK THEN DT=0:GOTO 1260 1250 IF C1=BAK THEN DT=DT XOR &HFF 1260 DT$=BIN$(DT+256) 1270 FOR CAL=1 TO 8 1280 DT(CAL)=DT(CAL)+VAL(MID$(DT$,CAL+1,1))*(2^(BIN-1)) 1290 NEXT CAL 1300 NEXT BIN 1310 FOR LOT=1 TO 8 1320 LPRINT CHR$(DT(LOT)); 1330 NEXT LOT 1340 NEXT XIN:LPRINT 1350 NEXT YIN:LPRINT CHR$(27);"A";CHR$(27);"N"; 1360 LPRINT CHR$(15);CHR$(27);"<":POKE &HF418,0 1370 RETURN '──▶ V.5. ГРАФИЧЕСКИЙ МАКРОЯЗЫК GML В MSX-BASIC входит оператор DRAW, который позволяет изображать на экра- не дисплея рисунки, составленные из различных комбинаций прямых линий. На- чиная с последней высвеченной на экране точки, с помощью оператора DRAW можно провести линию любой длины и в любом из 8 заданных направлений (см. рис.5). После этого можно провести еще одну линию, снова любой длины и в любом из тех же восьми направлений и т.д. Каждая проводимая линия может быть окрашена в любой из 15 допустимых цветов. Кроме того,можно проводить отрезок, соединяющий текущую точку с любой точкой, заданной абсолютными или относительными координатами. Можно также увеличивать или уменьшать весь выводимый рисунок и поворачивать его на 90°, 180° или 270°. Оператор DRAW - мощный оператор, являющийся по существу настоящим мини -языком в MSX-BASIC. Этот язык называется графическим м а к р о я з ы - к о м GML("Graphics Macro Language"). Записывается оператор в виде: DRAW β , где: DRAW("to draw"-"рисовать") - служебное слово; β - строковое выражение, значение которого определяет рисунок. Значение β составляется из последовательности команд GML. Обратите вни- мание на то, что значение параметра β всегда заключено в кавычки, посколь- ку это обычная строка MSX-BASIC, состоящая из команд языка GML, констант и строковых переменных. Длина β не должна превышать 255 символов.Для удоб- ства чтения текста программы команды можно разделять пробелами. Каждая ко- манда GML представлена одиночной ключевой буквой, за которой следует один или два числовых параметра (аргумента). Последние, как правило, задаются целыми числами. Например: C 5 M 15 , 10 ▲ ▲ ▲ ▲ ▲ │ │ │ │ │ Ключевая буква Аргумент Ключевая буква Аргументы Команды GML в основном предназначены для перемещения графического кур- сора из одних точек экрана в другие с одновременным вычерчиванием соединя- ющих их отрезков. Однако они могут модифицироваться следующим образом. 1. Перед командой перемещения ставится п р е ф и к с (приставка) B.Тог- да положение курсора изменяется, но линия не рисуется. 2. Перед командой перемещения ставится префикс N.Тогда курсор возвраща- ется в ту точку, в которой он находился до выполнения данной команды. Приведем список команд GML. Работая с командами, Вы должны четко пред- ставлять себе: α) какова текущая позиция графического курсора; β) в какую позицию Вы собираетесь его перевести; γ) хотите ли Вы провести линию при его перемещении. 1. Команда перемещения βn служит для перемещения графического курсора по направлению β с рисованием прямой линии. Здесь: β - указатель одного из 8 возможных направлений: β ∈ {R,E,U,H, L,G,D,F}, причем углы между смежными направлениями равны 45°. Внимательно изучите рисунок... "Up" -"вверх" U H ▲ E "Left"-"левый" \ │ ╱ "Right"-"правый" L◀── ──▶ R ╱ │ \ G ▼ F "Down"-"вниз" D Р и с. 5 n - целое положительное число, задающее величину смещения курсора (выраженную в точках экрана). При выполнении команды курсор смещается от своего текущего положения на n точек по направлению β, рисуя линию. Например, оператор DRAW"L10 U10 R10 D10" позволяет начертить линию от последней упомянутой точки на 10 точек влево, на 10 точек вверх, на 10 то- чек вправо и на 10 точек вниз, т.е.квадрат(интересно, что диагональ данно- го квадрата - также 10 точек). П р и м е р. 10 COLOR 1,15,8:SCREEN 2:PSET(80,100) ─────────── 20 DRAW"c13 s12 u10 e10 r10 f10 d10 g10 l10 h10" 30 GOTO 30 2. Команда перемещения MX,Y ("to Move"-"двигаться")позволяет перемес- тить курсор из текущего положения в точку с координатами (X,Y). Здесь X,Y - абсолютные координаты. Например, оператор DRAW"M160,100" перемещает графический курсор в точ- ку (160,100), оставляя при этом след в виде закрашенных точек. Оператор DRAW"BM160,100" перемещает графический курсор в ту же позицию (160,100), но префикс B делает это перемещение невидимым! П р и м е р [6]. Изображение картины взрыва. ─────────── 5 COLOR 1,15,4:SCREEN2:LINE(105,65)-(225,146),1,BF 10 DRAW "c8bm190,82m178,91m178,73m163,91m148,65m148,85m133,79m139,94m1 12,94m133,109m106,118m133,118m127,124m139,121m139,130m145,124m151,133m 160,124m166,139m172,124m196,145m184,121m223,133m193,115m217,109m196,10 6m205,97m187,97m190,82" 20 PAINT(130,100),8:A$=INPUT$(1) 3. Команда перемещения М±X,±Y служит для смещения курсора из текущего положения на ±Х точек по абсциссе и ±Y точек по ординате (разумеется, ука- зание знака "+" или "-"обязательно!). Здесь ±X,±Y - относительные коорди- наты. Например, оператор DRAW"M-10,+40"перемещает графический курсор из по- следней упомянутой точки в точку, отстоящую от последней упомянутой точки на 10 точек влево и на 40 точек вниз, с рисованием прямой линии. Отметим,что команда M±X,Y действует точно так же,как команда M±X,+Y ,а команда MX,+Y действует как команда MX,Y. Например, оператор DRAW"M-10,40" перемещает графический курсор из по- следней упомянутой в Вашей программе точки на 10 точек влево и на 40 вниз, т.е. его действие совпадает с действием оператора DRAW"M-10,+40". П р и м е р. Ok ─────────── 10 COLOR 1,15,8:SCREEN 2:PSET(100,85) 20 DRAW"a1 s12 c13 nu10 ne10 nr10 nf10 nd10 ng10 nl10 h10 m+0,30 a2": PSET (190,95):DRAW"s8 c13 nu10 ne10 nr10 nf10 nd10 ng10 nl10 h10 m+0,30" 30 GOTO 30 4. Команда Cp ("Color"-"цвет") позволяет определить цвет вычерчивае- мых отрезков (p=0,1,2,...,15 - код цвета). Действует команда до нового на- значения цвета (по умолчанию p - код цвета изображения). Отметим,что зада- ние цвета командой C в операторе DRAW не меняет цвет остальной части изо- бражения! 5. Команда Sm("Size"-"размер")задает масштабный множитель m,(1≤m≤255). При выполнении команды Sm числовые параметры всех последующих команд пере- мещения приобретают масштабный множитель m/4 (например, при m=8 m/4=2). Действует команда Sm на все команды DRAW, не содержащие префикса "B", до нового назначения. 6. Команда At ("Angle"-"угол") служит для поворота изображения вокруг точки, с которой начиналось рисование, на 90·t° против часовой стрелки (t может принимать значения 0,1,2,3).Действует команда At на все последую- щие команды DRAW до нового назначения, причем она должна предшествовать процессу построения той фигуры,которую надо повернуть. Учтите,что поворот на 0°, 90°, 180° или 270° означает поворот против часовой стрелки на со- ответствующий угол от направления оси X, т.е. команда A определяет абсо- лютный угол поворота! Заметим, что угол поворота A и масштабный множитель S запоминаются в системной области памяти компьютера и сохраняются там даже после уничто- жения программы пользователя, поэтому будьте осторожны при использовании принципа умолчания! Рекомендуем перед набором на клавиатуре программ, содержащих операторы графики, нажать клавишу "RESET"(на задней панели компьютера MSX-1 или на передней панели компьютера MSX-2),а затем клавиши "CTRL"+"STOP"! Проверить значения параметров команд S и A в памяти можно в непосредст- венном режиме при помощи команд: PRINT PEEK(&HFCBD) 'Значение угла поворота! PRINT PEEK(&HFCBC) 'Значение масштабного множителя! Внимание! Действие команд поворота А и изменения масштаба S не распро- страняется на команду M, в которой используются абсолютные координаты! 7. Команда Xα; позволяет интерпретировать значение строковой перемен- ной α как последовательность команд GML (знак ";" обязателен!). Более то- го, строка команд GML, вызванная командой X, может сама содержать команды X.Ясно,что при помощи этой команды можно организовать вызов графических "подпрограмм"! Там, где в команде GML в качестве параметров (аргументов) используются числовые константы, можно указывать имена простых числовых переменных α,в том числе и имена элементов массивов (индекс элемента массива может быть переменной или константой, но не выражением!). Но α при этом следует запи- сывать в форме =α; (символы "=" и ";" обязательно должны присутствовать!). NEW Ok 10 SCREEN 2:DRAW "bm125,100" 30 FOR I=4 TO 240 STEP 12:DRAW "s=i; bu r d2 l2 u2 r b d":NEXT 60 GOTO 60 Запомните,что при переходе в другой графический режим координаты графи- ческого курсора,масштаб,угол поворота и цвет изображения остаются прежними. П р и м е р ы. 1) Ok 5 '"Цветок". 10 COLOR 1,15,8:SCREEN 2:FOR K=0 TO 3:L=4*K 30 DRAW"a=k; s4 c13 bm128,85 e10 r10 f10 d10 g10 l10 h10 u10":NEXT: A$=INPUT$(1) 2) Ok 5 '"Паркет". 10 COLOR 1,15,8:SCREEN 2 20 FOR J=25 TO 160 STEP 40:FOR I=18 TO 180 STEP 40 40 DRAW"s8 bm=i;,=j; e10 r10 f10 d10 g10 l10 h10 u10" 50 NEXTI,J:A$=INPUT$(1) 3) Ok 10 '"Акробаты" 20 CLS:INPUT"Введите 0,1,2 или 3";T:IF T<>0 AND T<>1 AND T<>2 AND T <>3 THEN 20 40 IF T=0 THEN X=10:O=100 ELSE IF T=1 THEN X=90:O=200 50 IF T=2 THEN X=50:O=180 ELSE IF T=3 THEN X=10:O=150 60 COLOR 1,15,8:SCREEN 2 80 PSET(X,100):DRAW"c1s4a=t;r8u20e10r15f10d20r8u2l3u18h15u25f15u30l 5d18h8l3g8e1f1h8f7e7l2u3h2l6h3u10e3r8f3d5c15l2c1l3c15l4c1l3r3c15r3d 1c1d3c15d1c1r2l5c15e3r6u2c1d5g3l8g2d3l5g8u18l5d30e15d25r15l15g15d18 l3d2" 90 IF XXM THEN 740 130 GOSUB210:GOSUB330 'Рисуем, а затем стираем положение 1 150 XO=XO+15 160 IF XO+X2(11)>XM THEN 740 170 GOSUB 460:GOSUB 570 'Рисуем,а затем стираем положение 2 190 XO=XO+20 200 GOTO 130 210 '¤¤¤¤¤ Рисунок первой позиции ¤¤¤¤¤ 230 FORK=1TO2:LINE(XO+X2(K),Y2(K))-(XO+X2(K+1),Y2(K+1)):NEXT 260 LINE (XO+X2(4),Y2(4))-(XO+X2(5),Y2(5)) 270 LINE (XO+X2(5),Y2(5))-(XO+X2(6),Y2(6)) 280 FORK=7TO10:LINE(XO+X2(K),Y2(K))-(XO+X2(K+1),Y2(K+1)) 300 NEXTK 310 CIRCLE(XO+X2(12),Y2(12)),10:RETURN'──▶ 330 '¤¤¤¤¤ Уничтожение первой позиции ¤¤¤¤¤ 350 FOR K=1 TO2:LINE (XO+X2(K),Y2(K))-(XO+X2(K+1),Y2(K+1)),4 370 NEXT K 380 LINE (XO+X2(4),Y2(4))-(XO+X2(5),Y2(5)),4 390 LINE (XO+X2(5),Y2(5))-(XO+X2(6),Y2(6)),4 400 FOR K=7 TO10:LINE(XO+X2(K),Y2(K))-(XO+X2(K+1),Y2(K+1)),4 420 NEXTK:CIRCLE(XO+X2(12),Y2(12)),10,4:RETURN 460 '¤¤¤¤¤ Рисунок второй позиции ¤¤¤¤¤ 470 FORK=1TO3:LINE(XO+X1(K),Y1(K))-(XO+X1(K+1),Y1(K+1)):NEXT 500 LINE (XO+X1(5),Y1(5))-(XO+X1(6),Y1(6)) 510 LINE (XO+X1(6),Y1(6))-(XO+X1(7),Y1(7)) 520 FORK=8TO11:LINE(XO+X1(K),Y1(K))-(XO+X1(K+1),Y1(K+1)) 540 NEXT K 550 CIRCLE(XO+X1(13),Y1(13)),10:RETURN '──▶ 570 '¤¤¤¤¤ Уничтожение второй позиции ¤¤¤¤¤ 590 FOR K=1 TO3:LINE(XO+X1(K),Y1(K))-(XO+X1(K+1),Y1(K+1)),4 610 NEXTK 620 LINE(XO+X1(5),Y1(5))-(XO+X1(6),Y1(6)),4 630 LINE(XO+X1(6),Y1(6))-(XO+X1(7),Y1(7)),4 640 FOR K=8TO11:LINE(XO+X1(K),Y1(K))-(XO+X1(K+1),Y1(K+1)),4 660 NEXT K 670 CIRCLE (XO+X1(13),Y1(13)),10,4:RETURN'──▶ 700 DATA 14,150,20,133,15,120,20,93,5,145,25,133,15,120 710 DATA 20,115,10,110,19,92,20,108,30,113,20,83 720 DATA 2,132,25,136,40,93,43,150,50,130,30,120 730 DATA 30,111,22,103,38,95,43,110,58,104,40,83 740 XO=0:X2=0:GOTO 120 Убедились?В связи с этим в язык MSX-BASIC включены дополнительные сред- ства вывода на экран графической информации - с п р а й т ы. V.6.1. Ф о р м и р о в а н и е з н а ч е н и я с п р а й т а Э л ь ф ы - в германских народных поверьях духи природы, населяющие воздух,землю,горы,леса,жилища людей и обычно благожелательные к людям. Советский Энциклопедический Словарь В MSX-BASIC используются специальные нумерованные строковые переменные, называемые с п р а й т а м и. Для записи и м е н и спрайта используется псевдопеременная SPRITE$(), синтаксис которой: SPRITE$(n) , где: SPRITE("sprite"-"эльф") - служебное слово; n - арифметическое выражение, целая часть значения которого опреде- ляет номер спрайта. Рассмотрим семантику оператора присваивания SPRITE$(n)=β , (∗) где β - строковое выражение. В дальнейшем вместо фразы "длина значения спрайта"мы будем употреблять фразу "д л и н а с п р а й т а". При выполнении (∗) значение β выравнивается, если это требуется,до на- ибольшей длины спрайта за счет отбрасывания его лишних правых байтов или, наоборот,за счет добавления справа необходимого количества нулевых байтов (00000000). Полученное значение присваивается спрайту с заданным номером. Например: 1) 10 SCREEN1:SPRITE$(5)="12345678" 2) 10 SCREEN2:FOR S=0 TO 63:SPRITE$(S)="ABCDEFGHIJKL":NEXT Для значений спрайтов отводится определенное место в оперативной памя- ти, называемое с п р а й т о в о й областью и имеющее объем 2Кб (напом- ним, что 1Кб = 1024 байтам). Оператор присваивания A=SPRITE$(n) , где: A - строковая переменная или элемент строкового массива; n - арифметическое выражение, целая часть значения которого опреде- ляет номер спрайта; позволяет при недостатке строкового пространства хра- нить значения простых строковых переменных и элементов строковых массивов в спрайтовой области. Думаем, что теперь Вам совершенно ясен семантический смысл, например, конструкции вида: SPRITE$(12)=SPRITE$(7) ! V.6.2. В ы в о д с п р а й т а на э к р а н Intelligenti pausa Латинская поговорка Значения спрайтов можно выводить на экран SCREEN1 при помощи "тривиаль- ного" оператора PRINT. П р и м е р 1. ───────────── 10 SCREEN1'Но не SCREEN0! 10 SCREEN1'Но не SCREEN0! 20 SPRITE$(50)="screen1" 20 SPRITE$(20)="Алгоритмическ 30 PRINT SPRITE$(50) ий язык":PRINT SPRITE$(20) run run screen1 Алгоритм Ok Ok Можно, конечно, выводить значение спрайта и в режиме SCREEN 0. Но для этого его значение нужно вначале определить в режиме SCREEN 1! Однако, обычно, выводятся не сами значения спрайтов,а некоторые геомет- рические образы, порождаемые специальной двоичной интерпретацией этих зна- чений. Вначале опишем форму представления значений спрайтов при выводе на экран дисплея. Пусть длина спрайта ≤8 байтам. Расположим его двоичное значение в виде "квадрата" размером 8╳8 следующим образом: в первой строке - 1-й байт, во второй строке - 2-й байт и т.д. Значению спрайта сопоставим геометрический образ на экране,выделив там б л о к из 8╳8 точек и раскрасив одним и тем же цветом все его точки, ко- торым соответствует бит "1", и не изменив цвета других точек. П р и м е р 2. ───────────── NEW ┌───────────────┐ Ok │1 1 0 0 1 0 0 1│"и" ██ █ █ 10 SCREEN1:SPRITE$(4) │1 1 0 0 1 1 1 0│"н" ██ ███ ="интеграл":FOR I=1TO │1 1 0 1 0 1 0 0│"т" ██ █ █ 8:?BIN$(ASC(MID$(SPRI │1 1 0 0 0 1 0 1│"е" ██ █ █ TE$(4),I,1))):NEXT │1 1 0 0 0 1 1 1│"г" ██ ███ run │1 1 0 1 0 0 1 0│"р" ██ █ █ 11001001 │1 1 0 0 0 0 0 1│"а" ██ █ 11001110 │1 1 0 0 1 1 0 0│"л" ██ ██ 11010100 └───────────────┘ 11000101 Двоичная интерпретация Образ спрайта на 11000111 значения спрайта экране дисплея 11010010 11000001 11001100 Ok П р и м е р 3. ───────────── Что мы желаем Процесс кодирования образа спрайта впоследствии ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ увидеть на │ │ │ │█│█│ │ │ │ │ │ │ │█│ │█│ │ │ │──▶ &H18 экране дисплея! ├─┼─┼─┼─┼─┼─┼─┼─┤ └─┴─┴─┴─┘ └─┴─┴─┴─┘ │ │ │█│█│█│█│ │ │ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ██ ├─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │█│█│ │█│█│ │ │──▶ &H3C ████ │ │█│█│█│█│█│█│ │ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ██████ ├─┼─┼─┼─┼─┼─┼─┼─┤ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ████████ │█│█│█│█│█│█│█│█│ │ │█│█│█│ │█│█│█│ │──▶ &H7E ██ ├─┼─┼─┼─┼─┼─┼─┼─┤ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ██ │ │ │ │█│█│ │ │ │ ··· ··· ··· ██ ├─┼─┼─┼─┼─┼─┼─┼─┤ ··· ··· ··· ██ │ │ │ │█│█│ │ │ │ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ├─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │█│ │█│ │ │ │──▶ &H18 │ │ │ │█│█│ │ │ │ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ├─┼─┼─┼─┼─┼─┼─┼─┤ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │ │ │█│█│ │ │ │ │ │ │ │█│ │█│ │ │ │──▶ &H18 └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ▲ ▲ ▲ Происхождение этих непонятных (пока!) символов ─────────┘─┘─┘ разъ- ясняет следующая таблица: Рисунок Шестнадцатеричный код Рисунок ─────── ───────────────────── ─────── ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │ │ │ │ ──▶ 0 8 ◀── │█│ │ │ │ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │ │ │█│ ──▶ 1 9 ◀── │█│ │ │█│ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │ │█│ │ ──▶ 2 A ◀── │█│ │█│ │ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │ │█│█│ ──▶ 3 B ◀── │█│ │█│█│ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │█│ │ │ ──▶ 4 C ◀── │█│█│ │ │ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │█│ │█│ ──▶ 5 D ◀── │█│█│ │█│ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │█│█│ │ ──▶ 6 E ◀── │█│█│█│ │ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │█│█│█│ ──▶ 7 F ◀── │█│█│█│█│ └─┴─┴─┴─┘ └─┴─┴─┴─┘ Думаем, что самое время напомнить Вам, что перед шестнадцатеричным чис- лом в языке MSX-BASIC употребляется префикс &H ! И, наконец, завершающий этап! Определим образ спрайта: SPRITE$(1)=CHR$(&H18)+CHR$(&H3C)+CHR$(&H7E)+CHR$(&HFF)+ CHR$(&H18)+CHR$(&H18)+CHR$(&H18)+CHR$(&H18) Пусть теперь длина спрайта не превосходит 32 байтов.Расположим его дво- ичное значение в виде квадрата 16╳16 в двa столбца по 16 байтов в столбце так, как это показано в следующем примере. Тем же способом, что и раньше, этому значению сопоставим на экране некоторый блок из 16╳16 точек и в нем конкретный геометрический образ. П р и м е р 4. ───────────── NEW Ok 10 SCREEN1,2:SPRITE$(255)=" Никто не обнимет необъятного! " 15 FOR I=1 TO LEN(SPRITE$(255))-16 20 PRINT RIGHT$("00000000"+BIN$(ASC(MID$(SPRITE$(255),I ,1))),8)" "; RIGHT$("00000000"+BIN$(ASC(MID$(SPRITE$(255),I+16,1))),8):NEXT run ┌──────────┬───┬───┬───────────┐ 00100000 11010100 │ 1-й байт │ │ т │ 17-й байт │ 11101110 00100000 │ 2-й байт │ Н │ │ 18-й байт │ 11001001 11001110 │ 3-й байт │ и │ н │ 19-й байт │ 11001011 11000101 │ 4-й байт │ к │ е │ 20-й байт │ 11010100 11001111 │ 5-й байт │ т │ о │ 21-й байт │ 11001111 11000010 │ 6-й байт │ о │ б │ 22-й байт │ 00100000 11011111 │ 7-й байт │ │ ъ │ 23-й байт │ 11001110 11010001 │ 8-й байт │ н │ я │ 24-й байт │ 11000101 11010100 │ 9-й байт │ е │ т │ 25-й байт │ 00100000 11001110 │10-й байт │ │ н │ 26-й байт │ 11001111 11001111 │11-й байт │ о │ о │ 27-й байт │ 11000010 11000111 │12-й байт │ б │ г │ 28-й байт │ 11001110 11001111 │13-й байт │ н │ о │ 29-й байт │ 11001001 00100001 │14-й байт │ и │ ! │ 30-й байт │ 11001101 00100000 │15-й байт │ м │ │ 31-й байт │ 11000101 00100000 │16-й байт │ е │ │ 32-й байт │ Ok └──────────┴───┴───┴───────────┘ █ ██ █ █ ███ ███ █ ██ █ █ ██ ███ ██ █ ██ ██ █ █ Образ спрайта на экране ██ █ █ ██ ████ дисплея ██ ████ ██ █ █ ██ █████ ██ ███ ██ █ █ ██ █ █ ██ █ █ █ ██ ███ ██ ████ ██ ████ ██ █ ██ ███ ██ ███ ██ ████ ██ █ █ █ █ ██ ██ █ █ ██ █ █ █ Блок размером 16╳16 рассматривается как совокупность четырех блоков, каждый из которых имеет размер 8╳8. Эти блоки объединяются вместе в после- довательности, указанной на рисунке: 8 │◀───────▶│ ─▲─┌─────────┬──────────┐─▲─ │ │ │ │ │ 8│ │ 1 │ 3 │ │ │ │ │ │ │ ─▼─├─────────┼──────────┤ │ 16 │ │ │ │ │ 2 │ 4 │ │ │ │ │ │ └─────────┴──────────┘─▼─ Р и с. 6 П р и м е р 5. ───────────── ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ Что мы желаем впоследствии увидеть │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ на экране дисплея! ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │ │ │ │ │ │ │ │ │ │█│█│ │ │ ██ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ █████ ███ │ │ │ │ │█│█│█│█│█│ │ │█│█│█│ │ │ ██ ████ █ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ ██ █ ██ █ │ │ │ │█│█│ │ │ │█│█│█│█│ │█│ │ │ ██ █ █ █ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ ███ ███ █ │ │ │█│█│ │█│ │ │ │█│█│ │ │█│ │ │ ██ █████ ██ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ ██ █████ ███ │ │ │█│█│ │█│ │ │ │█│ │ │█│ │ │ │ ████ ███ ███ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ █████ ███ │█│█│█│ │ │ │ │ │ │ │█│█│█│ │█│ │ █ ███ ██ █ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ ██ █ ████ █ │█│█│ │ │ │ │ │█│█│█│█│█│ │ │█│█│ █ ██ ██████ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ █████ ███ │ │█│█│ │ │█│█│█│█│█│ │ │ │█│█│█│ ███ ███ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │█│█│█│█│ │█│█│█│ │ │█│█│█│ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │ │ │ │ │█│█│█│█│█│ │█│█│█│ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │ │█│ │█│█│█│ │█│█│ │ │█│ │ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │ │█│█│ │█│ │█│█│█│█│ │█│ │ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │█│ │█│█│ │█│█│█│█│█│█│ │ │ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │█│█│█│█│█│ │ │█│█│█│ │ │ │ ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │ │█│█│█│ │ │█│█│█│ │ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ Завершающий этап! Определение образа спрайта: 30 X$=CHR$(&H0) +CHR$(&H0) +CHR$(&HF) +CHR$(&H18)+ CHR$(&H34)+CHR$(&H34)+CHR$(&HE0)+CHR$(&HC1) 40 Y$=CHR$(&H67)+CHR$(&H1E)+CHR$(&H1) +CHR$(&HB)+ CHR$(&HD) +CHR$(&H16)+CHR$(&H1F)+CHR$(&HE) 50 Z$=CHR$(&H0) +CHR$(&HC) +CHR$(&H9C)+CHR$(&HF4)+ CHR$(&H64)+CHR$(&H48)+CHR$(&HCA)+CHR$(&HF3) 60 W$=CHR$(&HC7)+CHR$(&HE7)+CHR$(&HF7)+CHR$(&HB2)+ CHR$(&H7A)+CHR$(&HFC)+CHR$(&H38)+CHR$(&H70) 70 SPRITE$(1)=X$+Y$+Z$+W$ Отметим,что размер спрайтов определяется оператором SCREEN [n][,s] , где: n - арифметическое выражение, целая часть значения которого принад- лежит отрезку [0,3] и указывает режим экрана; s - арифметическое выражение, целая часть значения которого принад- лежит [0,3] и определяет размеры спрайтов. Возможны следующие случаи: s=0: спрайты длиной 8 байтов, занимающие 8╳8 точек экрана; s=1: спрайты длиной 8 байтов, такие же как и при s=0, но с двухкратным увеличением размеров по обоим направлениям и занимающие поэтому 16╳16 то- чек экрана; s=2: спрайты длиной 32 байта,занимающие 16╳16 точек экрана; s=3: спрайты длиной 32 байта, такие же,как и при s=2, но с двухкратным увеличением размеров по обоим направлениям и занимающие поэтому 32╳32 точ- ки экрана. З а м е ч а н и я. ┌─────────────────────────────────────────────────────────────────┐ │ 1) Оператор SCREEN ,s не очищает экран, однако с т и р а е т │ │ образы спрайтов из памяти компьютера. │ │ 2) Оператор SCREEN n очищает экран б е з с т и р а н и я │ │ образов спрайтов из памяти компьютера. │ └─────────────────────────────────────────────────────────────────┘ Опишем синтаксис и семантику оператора, служащего для вывода на экраны 1,2 и 3 образов спрайтов (коротко - с п р а й т о в): PUT SPRITE t,[[@][STEP](X,Y)],[C][,n] , где: PUT("to put"-"выводить"), SPRITE - служебные слова; t - арифметическое выражение, целая часть значения которого должна принадлежать отрезку [0,31]; она задает "экранный" номер спрайта ("sprite plane namber"); n - арифметическое выражение, целая часть значения которого опреде- ляет номер одного из сформированных в оперативной памяти спрайтов, образ которого выведен на экран под номером t ("sprite pattern number").По умол- чанию значение n совпадает со значением t; (X,Y) или STEP(X,Y) - элементы, определяющие координаты верхнего ле- вого угла блока точек на экране, в котором размещается образ спрайта, при- чем элементы (X,Y) и STEP(X,Y) могут задавать точку (X0,Y0) с координа- тами, удовлетворяющими условиям -32768 ≤X0,Y0≤ 32767. Однако в отличие от других графических операторов для спрайтов характерен неприятный эффект "свертывания" изображения на экране, который состоит в том, что, если мы попытаемся высветить спрайт за правой границей экрана, то этот спрайт вы- светится с левой стороны экрана,т.е. компьютер вычисляет координаты спрай- та (X,Y) по формулам: X=INT(ABS(X0)MOD255), Y=INT(ABS(Y0)MOD191) (для экрана SCREEN2); Заметим, что координата Y спрайта с д в и н у т а на одну позицию,то есть для изображения спрайта, левый верхний угол которого будет иметь ко- ординаты (X,Y), необходимо использовать оператор: PUT SPRITE t,(X,Y-1),C,n 5) C - арифметическое выражение,целая часть значения которого принад- лежит отрезку [0,15] и определяет цвет спрайта; 6) @ - необязательный элемент оператора PUT SPRITE,никак не влияющий на его выполнение. Отметим, что только t является необходимым аргументом, остальные могут быть опущены. При выполнении оператора PUT SPRITE спрайт с номером n получает "экран- ный" номер t и размещается с позиции, определяемой элементами (X,Y) или STEP(X,Y), причем точки, соответствующие его единичным битам, раскрашива- ются цветом C. Обратите о с о б о е внимание на следующий пример! П р и м е р 6. Формирование образа спрайта с помощью оператора DATA. ───────────── Следующие три программы формируют и выводят на экран об- раз одного и того же спрайта! α) NEW β) NEW Ok Ok 10 COLOR 1,15,8:SCREEN 2,1 10 COLOR 1,15,8:SCREEN 2,1 15 DATA 11000000 20 Y$="алгоритм" 20 DATA 11001100 130 SPRITE$(0)=Y$ 25 DATA 11000111 140 PUT SPRITE 0,(110,85),8 30 DATA 11000100 150 GOTO 150 35 DATA 11010010 40 DATA 11001001 γ) NEW 45 DATA 11010100 Ok 50 DATA 11001101 10 COLOR 1,15,8:SCREEN 2,1 100 FOR S=1 TO 8:READ R$ 20 DATA 193,204,199,207,210 110 Y$=Y$+CHR$(VAL("&B"+R$)) ,201,212,205 120 NEXT 100 FOR I=1 TO 8:READ R:Y$= 130 SPRITE$(0)=Y$ Y$+CHR$(R):NEXT:SPRITE$(0)= 140 PUT SPRITE 0,(110,85),8,0 Y$:PUT SPRITE 0,(110,85),8 150 GOTO 150 150 GOTO 150 Очевидно, что программа α дает наглядное представление об образе спрай- та уже на стадии составления программы.Если же Вы умеете пользоваться ин- струментальным средством - программой "редактор спрайтов", то лучше всего формировать спрайт при помощи десятичных кодов (пример - программа γ). И, наконец, программа β выводит на экран графический образ спрайта со значе- нием "алгоритм"; при этом пользователь, разумеется, не может заранее пре- дугадать вид "пятна" (образа спрайта), образующегося на экране! П р и м е р 7. ───────────── NEW Ok 10 KEY OFF:COLOR15,1,5:SCREEN1,2 20 DATA 96,144,191,160,159,159,79,79,39,23,10,7,1,1,7,31,6,9,253,5,233, 233,210,210,164,168,80,224,128,128,224,248 30 FOR I=1 TO 32:READ A:A$=A$+CHR$(A):NEXT:SPRITE$(1)=A$ 40 PUT SPRITE 1,(120,90) П р и м е р 8 [4]. Двенадцать одинаковых спрайтов. ───────────── NEW Ok 10 COLOR 1,15,8:SCREEN 2,3 20 W$="Двенадцатьспрайтов-четыревстроке":SPRITE$(40)=W$ 40 S=0:FOR I=20 TO 230 STEP 60:FOR J=20 TO 170 STEP 60 60 PUT SPRITE S,(I,J),13-S,40:S=S+1:NEXT J,I 'Обратите внимание на то, что параметр t ("экранный" номер спрайта) изменяется! 80 GOTO 80 Итак, одному значению n может соответствовать несколько значений пара- метра t, находящегося в одном или нескольких операторах PUT SPRITE.Это по- зволяет при необходимости "размножать" спрайт в виде нескольких одинако- вых образов на экране дисплея. П р и м е р 9. Спрайты с псевдослучайными образами. ───────────── 10 COLOR 1,15,8:SCREEN 2,3:FOR K=1 TO 12:Y$="":FOR Z=1TO32 40 Y$=Y$+CHR$(INT(RND(1)*256)):NEXTZ:SPRITE$(K)=Y$:NEXTK 70 S=1:FOR I=20 TO 230 STEP 60:FOR J=20 TO 170 STEP 60 90 PUT SPRITE S,(I,J),13-S:S=S+1:NEXTJ,I 110 GOTO 110 П р и м е р 10. Движение спрайта по горизонтали. ────────────── 10 COLOR 1,15,8:SCREEN 2,3 20 X$="терминал":SPRITE$(0)=X$+X$+X$+X$ 40 FOR K=1 TO255:PUT SPRITE 5,(K,80),4,0'Обратите внимание на то, что значения параметров t и n не меняются! 90 NEXT:GOTO 40 П р и м е р 11. Надеемся, что приведенный ниже пример доставит Вам ────────────── большое эстетическое наслаждение! 10 ' ∗∗∗∗∗ C o l o r ∗∗∗∗∗ 20 COLOR 15,1,1:SCREEN 2,2 30 OPEN "GRP:" AS #1 40 FOR S=1 TO 2:A$="":FOR P=1 TO 32:READ D$ 60 A$=A$+CHR$(VAL("&H"+D$)):NEXT 70 SPRITE$(S)=A$:NEXT 80 FOR K=15 TO 2 STEP-1:Y=K*11+13:FOR X=10 TO 75+K*5 STEP 2 100 PUT SPRITE K,(X,Y),K,1:PUT SPRITE K+15,(X+8,Y-16),K,2 120 LINE (X-4,Y+3)-(X-2,Y+12),K,BF:NEXT 130 READ D$:PSET(X+30,Y-13),1: PRINT #1,D$ 140 S=50+K*2:PLAY"v9n=s;32":NEXT '◀── Как, и музыка здесь! 150 DRAW "bm15,15":PRINT #1,"Transparent" 160 DRAW "bm15,26":PRINT #1,"Black" 170 DRAW "bm27,0":PRINT #1,"Press RETURN key" 180 IF INKEY$<>CHR$(13) THEN 180 190 COLOR 15,4,7:END 200 DATA 1,2,4,D,17,13,21,23,47,4C,F0,C0,0,0,0,0,3F,7E,FC,F8,F0,E0,C0, 80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,4,9,13,27,4F,9F,0,0,0,0,10,28,4 C,9E,3F,7E,FC,F8,F0,E0,C0,80 260 DATA White,Gray,Magenta,Dark Green,Light Yellow,Dack Yellow, Light Red,Medium Red,Sky Blue,Dark Red,Light Blue,Dark Blue,Light Green,Medi um Green П р и м е р 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 "экранным" ────────▶ ██ │ │ номером 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). 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 (без указания параметра N) в графических экранах игнорируется! δ) 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 V.9. Р е ж и м SCREEN 4 (только для компьютера MSX-2) Этот режим идентичен режиму SCREEN 2 в том, что касается выбора цвета, графических операторов и отображения текста (см. рис.7). 0 255 0┌───────────────────┐──▶X │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ │▨▨▨▨▨ SCREEN4 ▨▨▨▨▨│ │▨▨▨ 256╳192 точек▨▨│ │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ 191│─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘ ▼ Y Р и с. 7 В режиме SCREEN 4,однако, имеются н о в ы е операторы для работы со спрайтами. A. Оператор COLOR SPRITE$ предоставляет Вам возможность изображать м н о г о ц в е т н ы й спрайт (один цвет на линию). В режиме SCREEN 2 для получения такого же результата обычно накладыва- ются несколько спрайтов (см. раздел V.6.2). Оператор, с которым мы хотим Вас познакомить, имеет следующий формат: COLOR SPRITE$(NS)=A$ , где: COLOR, SPRITE - служебные слова; NS - арифметическое выражение, целая часть значения которого опреде- ляет э к р а н н ы й номер спрайта; A$ - строковое выражение, причем значение А$ должно содержать не бо- лее 16 символов (LEN(A$)≤16). Каждый символ значения строки A$ воздействует на одну линию спрайта (или как говорят, с п р а й т о в у ю линию). Поэтому следует использовать 8 символов,когда образы спрайтов кодируют- ся в 8 байтах (SCREEN 4,0 и SCREEN 4,1) и 16 символов при кодировании об- раза спрайта в 32 байтах (SCREEN 4,2 и SCREEN 4,3). Этот оператор рассматривает двоичную структуру, соответствующую коду ASCII каждого символа, и действует на каждую спрайтовую линию в соответ- ствии со значением битов, составляющих эту структуру: 1) б и т ы 0,1,2,3. Четыре младших бита позволяют закодировать но- мер палитры (0÷15), присвоенный этой линии. П р и м е р 1. Спрайт, у которого все 8 спрайтовых строк различного ───────────── цвета. NEW Ok 10 SCREEN 4,1:SPRITE$(0)=STRING$(8,255):PUT SPRITE 0,(128,96),8,0 40 COLOR SPRITE$(0)=CHR$(1)+CHR$(2)+CHR$(3)+CHR$(4)+CHR$(5)+CHR$(6)+CH R$(7)+CHR$(8) 50 GOTO 50 2) б и т 4. Этот бит не используется. 3) б и т 5. Если этот бит равен 1, то столкновение спрайтов не обна- руживается. П р и м е р 2. "Поведение" спрайтов в зависимости от значения пятого ───────────── бита. NEW Ok 10 COLOR 15,4:SCREEN 4:SPRITE$(0)=STRING$(8,255) 30 PUT SPRITE 0,(200,100),15,0 40 ON SPRITE GOSUB 100 │ Обратите внимание на этот бит! 50 SPRITE ON ▼ 55 COLOR SPRITE$(0)=STRING$(8,&B00100001) 60 FOR X=0 TO 240:PUT SPRITE 1,(X,100),15,0:NEXT 90 GOTO 60 100 SCREEN 0:RETURN 10 4) б и т 6. Если этот бит равен 1, то пересечение спрайтовой линии спрайта с номером NS с другими спрайтами не будет обнаружено. Правило при- оритета (если "накладываются" два спрайта, то спрайт с меньшим "экранным" номером перекрывает спрайт с большим "экранным" номером) более не соблюда- ется. Оказывается, область пересечения спрайтов имеет цвет, определяемый результатом логической операции OR, примененной к цветам "наложенных" спрайтов. Более того, спрайтовые линии, отмеченные в операторе COLOR SPRITE$ и не "затронутые" пересечением, исчезают! П р и м е р 3. Пример, иллюстрирующий "работу" бита 6 спрайтовой линии. ───────────── NEW Ok 10 SCREEN 4,3 'Область пересечения спрайтов окрашена цве- 20 SPRITE$(0)=STRING$(32,255)'том с номером 11, так как 9 OR 10 = 11 30 PUT SPRITE 0,(100,100),,0 'В спрайте 1 6-й бит установлен в единицу, 40 PUT SPRITE 1,(120,120),,0 'поэтому линии, не пересекающиеся со 45 A$=INKEY$:IF A$=""THEN 45 'спрайтом 2, исчезают! 50 COLOR SPRITE$(0)=STRING$(16,&b00001001) 60 COLOR SPRITE$(1)=STRING$(16,&b01001010) 70 GOTO 70 ▲ └── !!! 5) б и т 7 (крайний левый).Если этот бит равен 1,то спрайтовая линия отображается на 32 точки левее координаты Х, заданной в операторе PUT SPRITE; П р и м е р 4. Сдвиг двух верхних спрайтовых линий с изменением цвета. ───────────── NEW не используется Ok │ 10 COLOR 1,15:SCREEN 4,1 ▼ 20 SPRITE$(0)=STRING$(8,255) 1 0 0 0 0 0 1 1 30 SC$=CHR$(&B10000011)+CHR$(&B10000001) ▲ ────▲───── 40 PUT SPRITE 0,(120,85),13,0 │ │ 50 IF INKEY$="" THEN 50 'Ожидание! сдвиг номер 60 COLOR SPRITE$(0)=SC$ спрайтовой линии палитры 70 GOTO 70 Установите, что произойдет при нажатии любой клавиши!? П р и м е р 5. ───────────── NEW Ok не соблюдается 10 SCREEN 4,1 правило наложения 20 SPRITE$(0)=STRING$(8,255) спрайтов 30 SC$=CHR$(&b01000111)+CHR$(&b01000111)+ │ не используется CHR$(&b01000111) │ │ 40 PUT SPRITE 0,(120,85),8,0: ▼ ▼ PUT SPRITE 1,(130,95),7,0 0 1 0 0 0 1 1 1 50 IF INKEY$="" THEN 50 ▲ ────▲───── 60 COLOR SPRITE$(1)=SC$ │ │ 70 GOTO 70 отсутствие сдвига номер спрайтовой линии палитры Спрайт 0 изображается красным цветом (8), а спрайт 1 - темно-синим (7). При нажатии любой клавиши,все линии спрайта 1, находящиеся "под" спрайтом 0, сохраняются,остальные "исчезают"(цвет пересечения - б е л ы й, так как 7 OR 8 = 15). Oбратите внимание, что оператор COLOR SPRITE$ в строке 60 "применяет- ся" к спрайту с "экранным" номером 1. П р и м е р 6. ───────────── NEW Ok 10 COLOR 1,15:SCREEN 4,1 20 SPRITE$(0)=STRING$(8,255):SPRITE$(1)=STRING$(8,255) 30 SC$=STRING$(8,&B11100100):T=255 40 FOR I=1 TO 190:PUT SPRITE 0,(I,95),1,0 45 IF T=I THEN COLOR SPRITE$(0)=SC$:FOR A=1 TO 300:NEXTA 50 PUT SPRITE 1,(T,95),5,1:T=T-1:NEXTI 60 GOTO 60 Если исправить 30-ю строку следующим образом: 30 SC$=STRING$(4,&B11100100):T=255 , то при столкновении двух спрайтов спрайт с меньшим "экранным" номером вначале уменьшится в два раза, а затем восстановит свои размеры. П р и м е р 7. Уменьшение и увеличение "высоты" спрайта при нажатии лю- ───────────── бой клавиши. NEW Ok 10 COLOR 15,0,0:SCREEN 4,1 20 DATA 255,255,255,255,255,255,255,255 30 READ A:FOR I=0 TO 7:Y$=Y$+CHR$(A):NEXT 40 SPRITE$(1)=Y$ 50 PUT SPRITE 1,(110,80),13,1 60 E$="1" 70 A$=INKEY$:IF A$="" THEN 70 80 COLOR SPRITE$(1)=E$ 90 IF LEN(E$)<=8 THEN E$=E$+"0":GOTO 70 ELSE 50 B. Оператор COLOR SPRITE очень похож на оператор COLOR SPRITE$,но дей- ствует на всех спрайтовых линиях спрайта с номером NS. Формат оператора: COLOR SPRITE(NS) = B , где: COLOR, SPRITE - служебные слова; NS - арифметическое выражение, целая часть значения которого опреде- ляет номер сформированного в оперативной памяти спрайта; B - арифметическое выражение, целая часть значения которого должна лежать в пределах от 0 до 127. Отметим, что если Вам необходимо передвинуть спрайт на 32 точки влево, то используйте только оператор COLOR SPRITE$ ! Когда значение выражения B находится между 0 и 15, операторы: PUT SPRITE 0,(X,Y),B COLOR SPRITE$(0)=STRING$(8,B) COLOR SPRITE(0)=B эквивалентны! П р и м е р 8. Исчезновение спрайта с меньшим экранным номером при ───────────── COLOR SPRITE(0)=127 и изменение цвета области пересече- ния спрайтов при COLOR SPRITE(0)=63 . NEW Ok 10 SCREEN 4,1:SPRITE$(0)=STRING$(8,255):T=255 40 FOR I=1 TO 155:PUT SPRITE 0,(I,95),1,0:A=I+1 50 IF T=I THEN COLOR SPRITE(0)=127:FOR A=1 TO 300:NEXTA 60 PUT SPRITE 1,(T,95),7,0:T=T-1:NEXTI 70 GOTO 70 П р и м е р 9. ───────────── NEW Ok 10 COLOR 15,4:SCREEN 4,1:SPRITE$(0)=STRING$(8,255) 30 SC=&B01001111 'Замените на SC=&B00001111 40 PUT SPRITE 0,(120,85),13,0 ▲ 50 IF INKEY$="" THEN 50 │ 60 COLOR SPRITE(0)=SC Обратите внимание на нулевой шестой бит! 70 GOTO 70 Заметим, что когда значение B принадлежит отрезку [0,127], то операто- ры COLOR SPRITE$(0)=STRING(8,B) и COLOR SPRITE(0)=B э к в и в а л е н т - н ы, однако, если значение B находится в диапазоне от 128 до 255, или ког- да необходимо воздействовать на отдельные линии спрайта, следует восполь- зоваться первым оператором. П р и м е р 10. Столкновение спрайтов для оператора COLOR SPRITE(NS)=B ────────────── NEW Ok 10 COLOR 15,4:SCREEN 4:SPRITE$(0)=STRING$(8,255) 30 PUT SPRITE 0,(200,100),15,0 40 ON SPRITE GOSUB 100:SPRITEON' Включен режим прерываний по столкнове- 55 COLOR SPRITE(0)=&B00100001' нию спрайтов! 60 FOR X=0 TO 240:PUT SPRITE 1,(X,100),15,0:NEXT ▲ 90 GOTO 60 '──▶ │ 100 SCREEN 0:RETURN 10 Обратите внимание на единичный пятый бит! V.10. Р е ж и м SCREEN 5 (только для компьютера MSX-2) Этот режим предлагает те же возможности работы со спрайтами, что и ре- жим SCREEN 4. Он отличается от режима SCREEN 4 в двух пунктах: α) р а з р е ш е н и е и в ы б о р ц в е т а . Экран разделен на 212 строк по 256 точек (см. рис.8). 0 255 0┌───────────────────┐──▶X │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ │▨▨▨▨▨ SCREEN5 ▨▨▨▨▨│ │▨▨▨ 256╳212 точек▨▨│ │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ 211│─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘ ▼ Y Р и с. 8 Цвет присваивается каждой точке, причем допустимых палитр - 16. β) э к р а н н ы е с т р а н и ц ы . В режиме SCREEN 5 в Вашем распоряжении имеется несколько так называе- мых э к р а н н ы х с т р а н и ц . Их количество зависит от объема ви- деопамяти, причем, если видеопамять имеет объем 64 Kбайта, то в Вашем рас- поряжении 2 страницы (с номерами 0 и 1); если же - 128 Кбайтов, то - 4 страницы (с номерами от 0 до 3). Рассмотрим оператор SET PAGE, посредством которого можно определять: 1) страницу для о т о б р а ж е н и я на экране и 2) страницу для в о з д е й с т в и я (а к т и в н у ю страницу). На активной странице можно "рисовать" с помощью графических операторов. Формат этого интересного оператора: SET PAGE [M],[N] , где: SET, PAGE - служебные слова; M, N - арифметические выражения, целые части значения которых при- надлежат отрезку [0,3]. Первый аргумент SET PAGE указывает номер отобража- емой страницы, а второй - номер активной страницы. П р и м е р 1. ───────────── NEW Ok 10 SCREEN 5:OPEN "GRP:" AS #1 30 SET PAGE 0,0:CLS:PSET(100,100):PRINT #1,"ABCD" 'Страница 0 отобража ется и активизируется (ситуация - по умолчанию). На страницу 0 записыв ается небольшой текст. 50 FOR I=1 TO 1000:NEXT:SET PAGE 1,1:CLS 'Страница 1 отображается и ак тивизируется; рисуются 8 линий. 60 FOR I=0 TO 7:FOR J=0 TO 127 70 PSET(2*J,I+108),I+2:PSET STEP(1,0),I+3:NEXTJ,I: P=1 90 IF INKEY$="" THEN 90 'Ожидание нажатия клавиши! Если клавиша нажата, то номер (P) отображенной страницы изменяется оператором XOR. 100 P=P XOR 1:SET PAGE P,P 'Листание страниц! 120 GOTO 90 '──▶ ┌───────┬────────────┐ Напомним Вам диаграмму Вейча │ X │ 0 1 0 1 │ (таблицу истинности функции XOR): │ Y │ 0 0 1 1 │ П р и м е р 2. │X XOR Y│ 0 1 1 0 │ ───────────── └───────┴────────────┘ Ok 10 SCREEN 5 20 FOR M=0 TO 3:SET PAGE M,M:CLS:NEXT 30 FOR K=0 TO 160 STEP 10:FOR Q=0 TO 5 50 SET PAGE 0,0:CIRCLE(127,106),K+Q,15 60 SET PAGE 1,1:CIRCLE(127,106),K+Q+2,15 70 SET PAGE 2,2:CIRCLE(127,106),K+Q+5,15 80 SET PAGE 3,3:CIRCLE(127,106),K+Q+7,15 90 NEXT:NEXT 100 FOR K=0 TO 3:SET PAGE K,K:NEXT:GOTO 100 П р и м е р 3. Бегущий человечек. ───────────── NEW Ok 10 SCREEN 5 20 SET PAGE 0,0:CLS 30 DRAW"bm100,100 c11 d5 r1 d2 r1 bm100,104 l2 d1 l2 d1 bm99,103 u1 l2 d1 l1 bm100,103 r2 u1 bm101,100 d1" 40 SET PAGE 0,1:CLS 50 DRAW"bm100,100 c11 r1 d1 l1 d4 l1 d1 g1 e1 u4 l1 g1 e1 r2 d1 r1 l1 d2 r1 d1 g1" 60 SET PAGE 0,2:CLS 70 DRAW"bm100,100 r1 d1 l1 d6 l1 u1 l2 r3 u1 r1 l1 u1 l1 u2 d1 l1" 90 SET PAGE 0,3:CLS 100 DRAW"bm100,100 r1 d1 l1 d4 f1 g1 h1 g1 e1 u4 l1 g1 d1 bm100,100 d3 r1" 110 FOR I=0 TO 3:SET PAGE I,I 120 FOR T=0 TO 100:NEXT:NEXT 140 GOTO 110 '──▶ Любопытную возможность для работы с экранными страницами предоставляет оператор SCREEN,,,,,N (пять запятых!). Целая часть выражения, задающего параметр N, должна принадлежать интервалу [0,3] и по умолчанию равна нулю. Этот аргумент определяет: 1) форму развертки изображения. Если N=0 или 2, то изображение стабиль- ное. Если же N=1 или 3, то экран "дрожит", как у ПЭВМ типа "Wang-2200"; 2) быстрый поочередный показ двух экранных страниц. Если N=0 или 1, то ничего нового не наблюдается. Если N=2 или 3, то происходит следующее: на экранной странице с номером 1 происходит быстрое чередование изображе- ния нулевой и первой страниц, сливающееся в одну дрожащую картинку. Однов- ременно с этим происходит аналогичный процесс на странице с номером 3 (в этом случае на страницу с номером 3 накладывается изображение 2-й страни- цы). Взгляните на следующий пример: П р и м е р 4. ───────────── NEW Ok 10 SCREEN 5,,,,,0:SET PAGE 1,0:CLS:CIRCLE(120,100),10 20 SET PAGE 1,1:CLS:CIRCLE(120,100),50 30 A$=INPUT$(1) 'Задержка до нажатия клавиши 40 SCREEN ,,,,,2 'Обратите внимание на величину последнего параметра! 50 A$=INPUT$(1) Обратим Ваше внимание на то, как можно осуществить к о п и р о в а - н и е изображения из одной области экрана в другую на компьютерах серии MSX-1. Для этого нужен двухмерный массив. Первый этап работы состоит в опреде- лении размеров копируемой области и создании массива требуемой размерно- сти. В этом массиве хранятся значения цветов каждой точки копируемого изо- бражения, которые находятся с помощью функции POINT. Затем эти данные ис- пользуются в операторе PSET для переноса отмеченных точек в другое место экрана. П р и м е р 5 [ 76 ]. Копирование участка экрана ───────────────────── 20 CLEAR:DEFINT A-Z 40 'Массив для графических данных 50 DIM A(50,50):BC=1:SC=15:COLOR 15,1,1:SCREEN 2 90 ON INTERVAL=100 GOSUB 490 100 OPEN"GRP:"AS #1 110 LINE (60,0)-STEP(150,10),15,BF:PSET(65,1):COLOR 1 130 PRINT #1,"Копирование экрана" 140 COLOR 15 150 'Изображение 160 LINE(80,80)-(130,130),15,BF:LINE(82,82)-(128,128),1,B 180 FOR I=2 TO 12 STEP 2 190 CIRCLE(105,105),20,1,,,12/I:CIRCLE(105,105),20,1,,,I/12 210 NEXT I 220 'Заполнение массива 230 INTERVAL ON 240 FOR I=1 TO 50:FOR J=1 TO 50 260 A(I,J)=POINT(80+I,80+J) 270 NEXT J:NEXT I 290 INTERVAL OFF 300 COLOR ,,1 310 'Получение копий 320 FOR I=1 TO 2 330 READ X,Y 340 FOR J=1 TO 50:FOR K=1 TO 50 360 PSET (X+J,Y+K),A(J,K) 370 NEXT K:NEXT J 390 NEXT I 400 'Перевернутое изображение 410 FOR I=1 TO 50:FOR J=1 TO 50 430 IF A(I,J)=1 THEN C=15 ELSE C=1 440 PSET(29+I,80+J),C 450 NEXT J:NEXT I 470 GOTO 470 480 'Подпрограмма интервалов 490 PLAY"T255L64SM1000O4CO5C" 500 SWAP BC,SC:COLOR ,,SC 510 RETURN 520 'Значения координат 530 DATA 30,28,80,28 Заметим, что в массиве чтение и запись данных выполняются невыносимо медленно, поэтому нужно запастись терпением! Ниже мы познакомим Вас еще с одним весьма мощным оператором MSX-BASIC - оператором COPY, который пересылает блок экрана в другое место экрана (на этой же или другой странице). Фактически, имеется ш е с т ь вариантов этого оператора. В а р и а н т 1 ┌───────────────────────────────────────────────────────────────┐ │ { [T]XOR } │ │ { [T]OR } │ │ COPY (X1,Y1)-(X2,Y2),[stri] TO (X3,Y3),[strpr],{ [T]AND } │ , │ { [T]PSET } │ │ { [T]PRESET} │ └───────────────────────────────────────────────────────────────┘ где: COPY, TO, XOR, OR, AND, PSET, PRESET - служебные слова; (X1,Y1)-(X2,Y2) - параметры, указывающие местоположение копируемого блока и "работающие" точно так же, как в операторе LINE (X1,Y1)-(X2,Y2),C,B (наличие этих параметров обязательно). Прямоугольная область экрана (б л о к), раскраска которой должна запо- минаться при выполнении оператора COPY, может располагаться в любом месте экрана. Форма, размер, местоположение прямоугольной области задаются коор- динатами двух ее противоположных вершин,т.е.точно так же, как в операторе LINE с параметром B задается подлежаший построению прямоугольник; stri - арифметическое выражение, указывающее на номер копируемой страницы (страницы - и с т о ч н и к а); значение stri должно принадле- жать [0,3]. По умолчанию используется активная страница; (X3,Y3) - координаты верхнего левого угла места, в которое будет ско- пирован блок (наличие этого параметра обязательно!); strp - арифметическое выражение, указывающее на номер страницы - п р и е м н и к а; значение strp должно принадлежать [0,3].По умолчанию используется страница-источник; T - префикс, который м о ж е т предшествовать ключевым словам. В этом случае если копируемый блок имеет цвет 0, то блок-результат копиро- вания не отображается на экране; XOR, OR, AND, PSET, PRESET - служебные слова для определения резуль- тата комбинации цвета экрана с цветом точек копируемого блока посредством логических операций, определяемых в следующей таблице: ┌────────┬─────────────────┐ │ XOR │ SC = C XOR S │ │ OR │ SC = C OR S │ │ AND │ SC = C AND S │ │ PSET │ SC = C │ │ PRESET │ SC = 16+(NOT C) │ └────────┴─────────────────┘ , где S, SC, C - арифметические выражения, целые части значений которых оп- ределяют: S - цвет изображения или фона до копирования; SC - цвет изображения или фона после копирования; C - цвет копируемого рисунка. По умолчанию установлен режим PSET. Дело в том, что при выполнении оператора COPY на экране в общем случае появляются не те цвета,номера которых хранятся в заданном для этого опера- тора числовом массиве, а цвета, представляющие собой результат взаимодей- ствия заданных с текущей раскраской рассматриваемой области экрана. Итак, существуют пять способов взаимодействия изображения, воспроизво- димого оператором COPY, с текущим изображением на экране дисплея. Конкрет- ный способ выбирается путем задания в операторе COPY одного из п я т и служебных слов: PSET, PRESET, AND, OR или XOR. Параметры AND, OR и XOR определяют три различных набора правил, в соот- ветствии с которыми происходит слияние заданных в операторе COPY цветов с текущей расцветкой экрана. Например, изучите следующие таблицы: ┌────────────┬───────────────────────────────────────────────────────┐ │ Номер │ Ц в е т э к р а н а │ │ цвета │ (наличие параметра XOR) │ │ изображения│ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 │ ├────────────┼───────────────────────────────────────────────────────┤ │ 0 │ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 │ │ 1 │ 1 0 3 2 5 4 7 6 9 8 11 10 13 12 15 14 │ │ 2 │ 2 3 0 1 6 7 4 5 10 11 8 9 14 15 12 13 │ │ 3 │ 3 2 1 0 7 6 5 4 11 10 9 8 15 14 13 12 │ │ 4 │ 4 5 6 7 0 1 2 3 12 13 14 15 8 9 10 11 │ │ 5 │ 5 4 7 6 1 0 3 2 13 12 15 14 9 8 11 10 │ │ 6 │ 6 7 4 5 2 3 0 1 14 15 12 13 10 11 8 9 │ │ 7 │ 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 │ │ 8 │ 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 │ │ 9 │ 9 8 11 10 13 12 15 14 1 0 3 2 5 4 7 6 │ │ 10 │ 10 11 8 9 14 15 12 13 2 3 0 1 6 7 4 5 │ │ 11 │ 11 10 9 8 15 14 13 12 3 2 1 0 7 6 5 4 │ │ 12 │ 12 13 14 15 8 9 10 11 4 5 6 7 0 1 2 3 │ │ 13 │ 13 12 15 14 9 8 11 10 5 4 7 6 1 0 3 2 │ │ 14 │ 14 15 12 13 10 11 8 9 6 7 4 5 2 3 0 1 │ │ 15 │ 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 │ └────────────┴───────────────────────────────────────────────────────┘ ┌────────────┬───────────────────────────────────────────────────────┐ │ Номер │ Ц в е т э к р а н а │ │ цвета │ (наличие параметра OR) │ │ изображения│ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 │ ├────────────┼───────────────────────────────────────────────────────┤ │ 0 │ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 │ │ 1 │ 1 1 3 3 5 5 7 7 9 9 11 11 13 13 15 15 │ │ 2 │ 2 3 2 3 6 7 6 7 10 11 10 11 14 15 14 15 │ │ 3 │ 3 3 3 3 7 7 7 7 11 11 11 11 15 15 15 15 │ │ 4 │ 4 5 6 7 4 5 6 7 12 13 14 15 12 13 14 15 │ │ 5 │ 5 5 7 7 5 5 7 7 13 13 15 15 13 13 15 15 │ │ 6 │ 6 7 6 7 6 7 6 7 14 15 14 15 14 15 14 15 │ │ 7 │ 7 7 7 7 7 7 7 7 15 15 15 15 15 15 15 15 │ │ 8 │ 8 9 10 11 12 13 14 15 8 9 10 11 12 13 14 15 │ │ 9 │ 9 9 11 11 13 13 15 15 9 9 11 11 13 13 15 15 │ │ 10 │ 10 11 10 11 14 15 14 15 10 11 10 11 14 15 14 15 │ │ 11 │ 11 11 11 11 15 15 15 15 11 11 11 11 15 15 15 15 │ │ 12 │ 12 13 14 15 12 13 14 15 12 13 14 15 12 13 14 15 │ │ 13 │ 13 13 15 15 13 13 15 15 13 13 15 15 13 13 15 15 │ │ 14 │ 14 15 14 15 14 15 14 15 14 15 14 15 14 15 14 15 │ │ 15 │ 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 │ └────────────┴───────────────────────────────────────────────────────┘ ┌────────────┬───────────────────────────────────────────────────────┐ │ Номер │ Ц в е т э к р а н а │ │ цвета │ (наличие параметра AND) │ │ изображения│ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 │ ├────────────┼───────────────────────────────────────────────────────┤ │ 0 │ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 │ │ 1 │ 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 │ │ 2 │ 0 0 2 2 0 0 2 2 0 0 2 2 0 0 2 2 │ │ 3 │ 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 │ │ 4 │ 0 0 0 0 4 4 4 4 0 0 0 0 4 4 4 4 │ │ 5 │ 0 1 0 1 4 5 4 5 0 1 0 1 4 5 4 5 │ │ 6 │ 0 0 2 2 4 4 6 6 0 0 2 2 4 4 6 6 │ │ 7 │ 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 │ │ 8 │ 0 0 0 0 0 0 0 0 8 8 8 8 8 8 8 8 │ │ 9 │ 0 1 0 1 0 1 0 1 8 9 8 9 8 9 8 9 │ │ 10 │ 0 0 2 2 0 0 2 2 8 8 10 10 8 8 10 10 │ │ 11 │ 0 1 2 3 0 1 2 3 8 9 10 11 8 9 10 11 │ │ 12 │ 0 0 0 0 4 4 4 4 8 8 8 8 12 12 12 12 │ │ 13 │ 0 1 0 1 4 5 4 5 8 9 8 9 12 13 12 13 │ │ 14 │ 0 0 2 2 4 4 6 6 8 8 10 10 12 12 14 14 │ │ 15 │ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 │ └────────────┴───────────────────────────────────────────────────────┘ ┌────────────┬───────────────────────────────────────────────────────┐ │ Номер цвета│ Ц в е т э к р а н а (наличие параметра PRESET) │ │ изображения│ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 │ ├────────────┼───────────────────────────────────────────────────────┤ │ Номер цвета│ │ │ э к р а н а│ 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 │ └────────────────────────────────────────────────────────────────────┘ При выполнении оператора COPY с параметром PSET каждая точка копируемо- го прямоугольника окрашивается в тот цвет, который она имела до копирова- ния, а при выполнении оператора COPY с параметром PRESET каждая точка ко- пируемого прямоугольника окрашивается в "противоположный" цвет. П р и м е р ы: ───────────── 6) NEW 7) NEW Ok Ok 10 COLOR15,3:SCREEN5 10 SCREEN 5:SET PAGE 0,0 20 OPEN"GRP:"AS#1:SET PAGE 0,0 30 FOR K=0 TO 50: 30 LINE (100,0)-(130,30),7,BF CIRCLE(127,106),K,K/4:NEXT 40 LINE (100,40)-(130,70),6,BF 40 COPY(77,56)-(177,156),0 TO 50 IF INKEY$="" THEN 50 (10,10),1,PRESET:L$=INPUT$(1) 60 SETPAGE 0,1:CLS:SETPAGE 1,1 50 SET PAGE 1,1:L$=INPUT$(1) 70 COPY (0,0)-(255,100),0 TO 60 SET PAGE 0,0:L$=INPUT$(1) (100,0),1,PSET 70 GOTO 50 80 PSET(205,10),1:?#1,POINT(210,5) При нажатии на любую клавишу 90 PSET(205,50),1:?#1,POINT(210,45) Вы получите изображение другой 100 GOTO 100 экранной страницы. Испытайте логические операции PRESET, AND,OR,XOR, изменяя последний параметр в строке 70. 8) NEW Ok 10 COLOR 15,3,4:SCREEN 5:OPEN"GRP:"AS#1:SET PAGE 0,0 30 LINE(100,0)-(130,30),0,BF:LINE(100,40)-(130,70),2,BF 50 IF INKEY$="" THEN 50 60 SET PAGE 0,1:CLS:SET PAGE 1,1 70 COPY (0,0)-(255,100),0 TO (100,0),1,TPSET 'Подставьте TAND! 80 PSET(205,10),1:PRINT#1,POINT(210,5) 90 PSET(205,50),1:PRINT#1,POINT(210,45) 100 A$=INPUT$(1) 9) NEW Ok 5 OPEN"grp:"AS#1 10 COLOR 15,4,15 ' Начальная установка 20 SCREEN 5 ' экрана 30 LINE(40,60)-(80,110),3,BF ' Рисуем прямоугольник 40 COPY (40,60)-(80,110) TO (100,60),,TAND ' Копия прямоугольника 50 Y=POINT (110,70) ' Цвет точки из копии 60 I$=INPUT$(1) ' 70 PRESET(90,120):PRINT #1,"Цвет копии равен ";Y 'Вывод цвета копии 80 I$=INPUT$(1) С помощью оператора COPY, изменяя координаты (X3,Y3), можно перемещать изображение в любое место экрана. Это позволяет имитировать на экране дис- плея движение объектов. Для имитации движения необходимо выполнить следующие действия: 1) поместить изображение объекта на экран с помощью оператора COPY; 2) вывести изображение объекта в новом месте. Если эти действия повторять, то будет создаваться иллюзия движения;чем быстрее осуществляется смена изображений и чем меньше расстояние между двумя "кадрами", тем эта иллюзия полнее. Если осуществлять смену кадров с достаточно высокой скоростью, то можно добиться исчезновения эффекта ми- гания изображения. Однако учтите,что скорость смены кадров ограничена про- изводительностью компьютера. П р и м е р 10. ────────────── NEW Ok 10 COLOR 15,0,0 20 SCREEN 5:DIM A(1000):VDP(1)=VDP(1)XOR64 'Отключение экрана 30 CIRCLE (80,80),3,13:PAINT (80,80),13 40 COPY (74,74)-(86,86) TO A:CLS:VDP(1)=VDP(1)XOR64'Включение экрана 50 FOR I=0 TO 256 ' Попробуйте оператор FOR I=0 TO 256 STEP 4 60 COPY A TO (I,80) 70 NEXT:GOTO 50 З а м е ч а н и е. Эти же параметры (XOR,OR,AND,PSET,PRESET) могут ис- ───────────────── пользоваться в операторах PSET, PRESET и LINE в ре- жимах SCREEN 5, SCREEN 6, SCREEN 7 и SCREEN 8. Они имеют тот же смысл,что и в операторе COPY. П р и м е р 11. ────────────── 10 OPEN "GRP:"AS#1:COLOR 1,3,4:SCREEN 7:PSET (73,63),13,XOR 20 PRINT #1,POINT(73,63) ─▲─ 30 GOTO 30 │ П р и м е р 12. ────────────── 10 OPEN "GRP:"AS#1:COLOR 1,3,4:SCREEN 7 20 LINE (73,63)-(100,100),13,,XOR 30 PRINT #1,POINT(73,63) 40 GOTO 40 Отметим, что наличие префикса T перед параметрами XOR, OR, AND, PSET, PRESET никак не влияет на выполнение логических операций над кодом цвета! П р и м е р 13. ────────────── 5 OPEN"grp:"AS#1 10 COLOR 15,4,15 ' Начальная установка 20 SCREEN 5 ' экрана 30 LINE(40,60)-(80,110),3,BF,TAND ' Рисуем прямоугольник 50 Y=POINT (50,70) ' Цвет точки 60 I$=INPUT$(1) ' 70 PRESET(90,120):PRINT #1,"Цвет прямоуг. :";Y ' Вывод цвета 80 I$=INPUT$(1) В а р и а н т 2 Этот оператор позволяет запоминать цвета всех точек заданной прямо- угольной области экрана дисплея и хранить их номера в виде числового мас- сива (или в файле данных); далее этот оператор по Вашему желанию может повторно воспроизвести эти цвета на экране. Причем с помощью оператора COPY изображение воспроизводится достаточно быстро для того, чтобы можно было синтезировать движение объектов на экране. Формат оператора: ┌──────────────────────────────────────────────────────┐ │ COPY (X1,Y1)-(X2,Y2), stri ТО {И м я массива} │ │ {И м я файла } │ , └──────────────────────────────────────────────────────┘ где: (X1,Y1)-(X2,Y2) - параметры, указывающие позицию копируемого блока и "работающие" точно так же,как в операторе LINE (X1,Y1)-(X2,Y2),C,BF (наличие этих параметров обязательно); stri - арифметическое выражение,указывающее на номер копируемой стра- ницы; значение stri должно принадлежать [0,3]. По умолчанию используется активная страница; И м я массива (И м я файла) - параметр, который позволяет Вам копи- ровать блок изображения в цифровой форме в массив заданного размера или в указанный файл на дискете. Для выполнения оператора COPY необходимо задать достаточно большой од- номерный числовой массив для того, чтобы вместить данные о расцветке всех точек рассматриваемой области экрана. Количество элементов массива в режиме SCREEN 5 определяется формулой: ┌ (4·│X1-X2│+1)·(│Y1-Y2│+1)+7 ┐ │ ─────────────────────────── │ + 4 , где [ ] - символ операции выделения └ 8 ┘ целой части. На языке MSX-BASIC это "звучит" как INT( (4* (ABS(X1-X2)+1) * (ABS(Y1-Y2)+1) +7)/8 )+4 Используя операторы COPY и DATA, можно воспроизводить изображения,кото- рые закодированы в форме последовательности чисел. Значение числового мас- сива, хранящего изображение, может быть выведено на экран или память,а за- тем вставлено в д р у г у ю программу при помощи операторов DATA. П р и м е р 14. ────────────── Ok 10 SCREEN 5 20 FOR I=1 TO 10:CIRCLE (125,95),10+I,I:NEXT 30 COPY (40,40)-(180,180),0 TO "OKR" 'Изображение записывается 40 GOTO 40 'на дискету под именем "ОКR". В а р и а н т 3 ┌───────────────────────────────────────────────────────────────┐ │ { [T]XOR } │ │ { [T]OR } │ │ COPY {И м я массива} [,napr] ТО (X3,Y3), strp,{ [T]AND } │ │ {И м я файла } { [T]PSET } │ │ { [T]PRESET} │ , └───────────────────────────────────────────────────────────────┘ где: napr - необязательный параметр, дающий возможность "поворачивать" блок изображения. Он может принимать следующие значения: 0 - преобразование симметрии отсутствует (по умолчанию); 1 - преобразование симметрии относительно прямой, проходящей через точ- ку (X3,Y3) и параллельной оси Oy; 2 - преобразование симметрии относительно прямой, проходящей через точ- ку (X3,Y3) и параллельной оси Ox; 3 - ц е н т р а л ь н а я симметрия относительно точки (X3,Y3). strp - арифметическое выражение, указывающее на номер копируемой страницы; значение strp должно принадлежать [0,3]. По умолчанию использу- ется страница-источник; И м я массива (И м я файла) - дает возможность копировать блок изображения в цифровой форме в массив заданного размера или в указанный файл на дискете; (X3,Y3) - координаты верхнего левого угла места,в которое будет ско- пирован блок (наличие этого параметра обязательно!); Размер массива в режиме SCREEN5 определяется следующей формулой: ┌ (4·│X1-X2│+1)·(│Y1-Y2│+1)+7 ┐ │ ─────────────────────────── │ + 4 , где [ ] - символ для операции выде- └ 8 ┘ ления целой части. На языке MSX-BASIC это "звучит" как INT( (4* (ABS(X1-X2)+1) * (ABS(Y1-Y2)+1) +7)/8 )+4 П р и м е р 15. ────────────── Ok 10 SCREEN 5:DIM A%(2900) 20 FOR K=0 TO 50:CIRCLE(127,106),K,15:NEXT K 30 COPY (77,56)-(177,156),0 TO A% 35 SCREEN 0:FOR I=1 TO 150:PRINT A%(I);:NEXT 40 PRINT"Изображение записано":L$=INPUT$(1) 50 SCREEN 5:COPY A% TO (77,56),0:L$=INPUT$(1) После выполнения программы наберите команду goto 50 и нажмите клавишу "RETURN"... Пожалуйста, проанализируйте полученный результат! П р и м е р 16. ────────────── Ok 10 SCREEN 5 20 COPY "okr" TO (25,30),0 'Вывод информации с диска на экран 30 GOTO 30 П р и м е р 17. Пример копирования изображения на экране дисплея в ───────────── массив, а из массива - в новое место экрана. NEW Ok 10 DIM AK(INT((4*(ABS(41-71)+1)*(ABS(41-71)+1)+7)/8)+4) 20 SCREEN 5:SET PAGE 0,0 30 LINE(40,40)-(70,70),15,BF 35 COPY(41,41)-(71,71),0 TO AK 'Скопировали изображение в массив AK 40 A$=INKEY$:IF A$="" THEN 40 50 COPY AK,0 TO (150,150),0 70 A$=INKEY$:IF A$="" THEN 70 П р и м е р 18. Иллюстрация действия параметра PRESET ────────────── Ok 10 SCREEN 5 20 LINE(100,100)-(110,110),8,BF 30 LINE(120,120)-(190,130),3,BF │ 35 A$=INPUT$(1) ▼ 40 COPY(100,100)-(190,130) TO (100,0),,PRESET 50 GOTO 50 П р и м е р 19. ───────────── Ok 10 SCREEN 5:DIM A(INT((4*(ABS(100-190)+1)*(ABS(100-130)+1)+7)/8)+4) 20 LINE(100,100)-(110,110),8,BF 30 LINE(120,120)-(190,130),3,BF !!! 40 COPY(100,100)-(190,130) TO A │ 50 A$=INPUT$(1):CLS ▼ 60 COPY A,3 TO (100,100) 65 A$=INPUT$(1):CLS 70 COPY A TO (100,100) 80 GOTO 50 В а р и а н т 4 ┌─────────────────────────────────────────┐ │ COPY и м я массива ТО и м я файла │ └─────────────────────────────────────────┘ В а р и а н т 5 ┌──────────────────────────────────────────┐ │ COPY и м я файла ТО и м я массива │ └──────────────────────────────────────────┘ П р и м е р 20. ────────────── Ok 10 DIM AK(INT((4*(ABS(41-71)+1)*(ABS(41-71)+1)+7)/8)+4) 20 SCREEN 5:SET PAGE 0,0 30 LINE(40,40)-(70,70),15,BF 35 COPY(41,41)-(71,71),0 TO AK 40 COPY AK TO "Dima" 50 CLS:DIM AB(485) 60 COPY "Dima" TO AB:COPY AB TO (40,40) 70 GOTO 70 В а р и а н т 6 Давайте все-таки обсуждать вкус ананаса с теми, кто его не ел! Почти по М.Жванецкому Этот оператор применяется на компьютерах MSX-2, оснащенных видеоинтер- фейсом: COPY SCREEN [ р е ж и м 1] [, р е ж и м 2] Это позволяет преобразовать изображение, полученное с внешнего источни- ка видеосигнала, в цифровые данные, записанные на экранной странице. Параметры р е ж и м 1, р е ж и м 2 могут принимать два значения: 0: (по умолчанию) кадр записывается на отображенной экранной странице; 1: кадр записывается на странице, номер которой равен номеру отображен- ной минус 1. В этом случае номер отображенной страницы должен быть нечет- ным. Предполагается, что экран подготовлен к работе с изображением, приходя- щим от внешнего источника видеосигнала. Для этой цели имеется оператор ┌──────────────────────────────┐ │ SET VIDEO R,Y,C,S,A,V,R │ , └──────────────────────────────┘ где: SET, VIDEO - служебные слова; R - числовой параметр, значение которого определяет источник видео- сигнала: 0 - (по умолчанию) изображение от компьютера; 1 - изображение от компьютера; 2 - смешивание изображения от компьютера и ТВ-сигнала; 3 - на дисплей поступает ТВ-сигнал; Y - числовой параметр, который управляет интенсивностью изображения от источника видеосигнала: 0 - (по умолчанию) нормальная интенсивность; 1 - интенсивность ТВ-сигнала уменьшена наполовину; C - числовой параметр, который определяет направление передачи дан- ных о цветности: 0 - (по умолчанию) вывод цветных данных на видеомагнитофон; 1 - ввод цветных данных от внешнего источника; S - числовой параметр, который определяет происхождение сигнала син- хронизации: 0 - (по умолчанию) внутренняя синхронизация; 1 - внешняя синхронизация (невозможна, когда R=0); A - числовой параметр, который позволяет смешивать AUDIO-сигнал ком- пьютера и сигнал от внешнего источника видеосигнала: 0 - (0 по умолчанию) звук только от компьютера; 1 - смешивание с внешним сигналом (правый канал); 2 - смешивание с внешним сигналом (левый канал); 3 - смешивание по обоим каналам; V - числовой параметр, указывающий тип разъема для ввода внешнего видеосигнала: 0 - (по умолчанию) разъем RGB; 1 - разъем RCA; R - числовой параметр, описывающий состояние сигнала управления AV на разъеме RGB: 0 - выхода через разъем RGB нет; 1 - выход через разъем RGB разрешен. ┌───────────────────────────────────────────────────────────┐ │ Отметим, что оператор COPY можно использовать в режимах │ │ SCREEN 5, SCREEN 6, SCREEN 7, SCREEN 8 │ └───────────────────────────────────────────────────────────┘ П р и м е р 19. ────────────── NEW Ok 10 SCREEN 6 20 LINE(20,70)-(30,80),15,BF:LINE(40,20)-(100,90),3,BF 30 FOR I=1 TO 1000:NEXT:COPY(20,70)-(110,90) TO (130,70) 40 GOTO 40 Меняя в 10-й строке номера экранов, Вы можете в этом убедиться! Отметим, что в версии BASIC, называемой Advanced BASIC,для профессиона- льных компьютеров IBM PC/XT (XT -от "eXTended"-"развитый, расширенный") и IBM PC/AT (AT - от"Advanced Technology"-"передовая техника и технология"), используются два оператора, действия которых аналогичны действию операто- ра COPY версии MSX-BASIC: α) GET(X1,Y1)-(X2,Y2),A Данный оператор "считывает" в массив A характеристики точек экрана,рас- положенных в заданной прямоугольной области; β) PUT(X,Y),A, с п о с о б Оператор "накладывает" массив точек на прямоугольную область экрана с управляемым способом формирования цветности (задаваемым параметром с п о- с о б). V.11. Р е ж и м SCREEN 6 (только для компьютера MSX-2) Экран в режиме SCREEN 6 такой же, как и в режиме SCREEN 5 (см.рис.8), но могут использоваться только 4 цвета. 0 511 0┌───────────────────┐──▶X │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ │▨▨▨▨▨ SCREEN6 ▨▨▨▨▨│ │▨▨▨ 512╳212 точек▨▨│ │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ 211│─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘ ▼ Р и с. 9 Y CLS устанавливает цвет ф о н а, имеющий номер 0 (прозрачный). Для установления цветов можно выбирать номер, лежащий в пределах от 0 до 31 (хотя используется только 4 палитры). Именно поэтому оператор COLOR должен быть выполнен после оператора SCREEN 6 ! Цвет задается значением двух младших битов номера палитры, введенного оператором COLOR. (Например, число 23=&b00010111 подразумевает использова- ние цвета 3=&b11). Если номер палитры принадлежит [16,31], то для бордюра принимаются в расчет уже четыре младших бита. (Первые два определяют цвет точек с четными координатами, а два последних - точек с нечетными коорди- натами. В итоге бордюр будет покрыт мелкой сеткой из точек двух цветов.) Все графические операторы работают так же, как и в режиме SCREEN 3. П р и м е р. ─────────── Ok 10 SCREEN 6:COLOR 15,17,1:CIRCLE(255,106),100,3:PAINT STEP(0,0),2,3 20 GOTO 20 Получается окружность! Радиус по вертикали (автоматически) сжимается для соответствия разнице масштаба между абсциссой и ординатой. Работа с экранными страницами и внешним видеосигналом такая же, как в SCREEN 5. Учтите лишь следующий момент: формула,дающая размер массива переменных, копирующего блок экрана, теперь выглядит так: ┌ (2·│X1-X2│+1)·(│Y1-Y2│+1)+7 ┐ │ ─────────────────────────── │ + 4 , где [ ] - символ операции выделе- └ 2 ┘ ния целой части. V.12. Р е ж и м SCREEN 7 (только для компьютера MSX-2 с видеопамятью 128 Кбайтов) ┌─────────────────────────────────────────────────────────────┐ │ Этот режим максимально удобен для многоцветных рисунков! │ └─────────────────────────────────────────────────────────────┘ 0 511 0┌───────────────────┐──▶X │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ │▨▨▨▨▨ SCREEN7 ▨▨▨▨▨│ │▨▨▨ 512╳212 точек▨▨│ │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ 211│─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘ ▼ Р и с. 10 Y Этот режим похож на режим SCREEN 6, но: 1) экранные страницы нумеруются от 0 до 1; 2) допускается одновременное использование 16 цветов. Формула, необходимая для вычисления размера массива, принимающего дан- ные блока экрана, та же, что и в SCREEN 5: ┌ (4·│X1-X2│+1)·(│Y1-Y2│+1)+7 ┐ │ ─────────────────────────── │ + 4 ,где [ ] - символ для операции выде- └ 8 ┘ ления целой части. V.13. Р е ж и м SCREEN 8 (только для компьютера MSX-2 с видеопамятью 128 Кбайтов) Экран содержит 212 строк по 256 точек, как в SCREEN 5. 0 255 0┌───────────────────┐──▶X │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ │▨▨▨▨▨ SCREEN8 ▨▨▨▨▨│ │▨▨▨ 256╳212 точек▨▨│ │▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨│ 211│─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘ ▼ Y Р и с. 11 Этот режим характеризуется количеством цветов, которые могут выводить- ся одновременно. Цвет каждой точки кодируется в одном байте, и следова- тельно, имеет значения, лежащие в пределах от 0 до 255. Они кодируются следующим образом: ┌────────────────────────────┐ │ Байт ц в е т а = GGGRRRBB │ └────────────────────────────┘ Первые три бита (G) представляют значения от 0 до 7 и определяют интен- сивность з е л е н о г о цвета ("Green"-"зеленый"). Следующие три бита (R) устанавливают интенсивность к р а с н о г о ("Red"-"красный"),и последние два (B) - интенсивность с и н е г о ("Blue"- "синий") цвета. Например, 10 SCREEN 8 20 PSET(3,0),&B11100000:PSET(5,10),&B00000011 30 GOTO 30 Цвета изображения, фона и бордюра определяются - как в режиме SCREEN 2, посредством оператора COLOR (или графических операторов для цвета текста), но значения лежат в пределах от 0 до 255. Введенное значение и пропорции цвета соотносятся следующим образом: ц в е т = 32*G+4*R+B В SCREEN 8 палитры не используются: желаемые оттенки задаются непосред- ственно. П р и м е р. NEW ─────────── Ok 10 SCREEN 8:FOR I=0 TO 255:COLOR,I:CLS 40 FOR J=0 TO 300:NEXT J,I Имеются только д в е экранные страницы, как и в режиме SCREEN 7. Формула, необходимая для вычисления размера массива, принимающего ко- пию блока экрана, имеет следующий вид: ┌ (8·│X1-X2│+1)·(│Y1-Y2│+1)+7 ┐ │ ─────────────────────────── │ ,где [ ] - символ для операции выделе- └ 8 ┘ ния целой части. Разумеется, запись этого выражения на языке MSX-BASIC очевидна: INT( (8* (ABS(X1-X2)+1) * (ABS(Y1-Y2)+1) +7)/8 ) Вспомним, что для выполнения оператора COPY необходимо задать числовой массив достаточно большой для того,чтобы вместить данные о расцветке всех точек рассматриваемой области экрана. Приведем простую программу, подсчитывающую минимальное количество эле- ментов для такого массива числовых значений. В начале работы программа вы- дает запрос на ввод координат, которые будут задаваться в операторе COPY, а также просит указать,какой режим графического вывода будет использовать- ся. П р и м е р. ─────────── NEW Ok 10 INPUT"Введите номер режима экрана (5,6,7 или 8)";I 20 INPUT"Введите координаты первой точки (X1,Y1)";X1,Y1 30 INPUT"Введите координаты второй точки (X2,Y2)";X2,Y2 40 S=4:C=8:IF I=6 THEN S=2:C=2 ELSE IF I=8 THEN 60 50 M=INT((S*(ABS(X1-X2)+1)*(ABS(Y1-Y2)+1)+7)/C)+4:GOTO 70 60 M=INT((8*ABS(X1-X2)+1)*(ABS(Y1-Y2)+1)+7/8) 70 PRINT "SCREEN"I:PRINT "X1-"X1,"Y1-"Y1:PRINT "X2-"X2,"Y2-"Y2 80 PRINT "Размерность массива- "M:END run Введите номер режима экрана (5,6,7 или 8) ? 5 Введите координаты первой точки (X1,Y1) ? 50,50 Введите координаты второй точки (Х2,Y2) ? 71,85 SCREEN 5 X1- 50 Y1- 50 X2- 71 Y2- 85 Размерность массива- 400 Ok V.14. Д о п о л н е н и е 1. П р и м е р простейшего г р а ф и ч е с к о г о редактора [22]. ─────────── Редактор позволяет не только рисовать стрелками, но и включать-отклю- чать цвет пера нажатием на пробел. Вокруг точки,в которой в данный момент находится перо, можно построить окружность или звезду. Для построения ок- ружности нужно нажать на клавишу "О", после чего ввести значение радиуса (окончание ввода - нажатие на клавишу "RETURN"). Нажатие на "Z" и ввод ве- личин R (радиус окружности, проходящей через вершины звезды), N (количест- во вершин) и M=2 позволяют построить звезду. Для ввода чисел использует- ся подпрограмма "ВВОД". NEW Ok 10 DIM PR(2),PD$(2) 20 PD$(0)="R=":PD$(1)="N=":PD$(2)="M=":PI=4*ATN(1) 30 SCREEN 2:OPEN"GRP:"AS#1 40 X=128:Y=96:C=4 50 PSET(X,Y),C 60 S=STICK(0) 70 P$=INKEY$ 80 IF S=1 OR S=2 OR S=8 THEN Y=Y-1 90 IF S=2 OR S=3 OR S=4 THEN X=X+1 100 IF S=4 OR S=5 OR S=6 THEN Y=Y+1 110 IF S=6 OR S=7 OR S=8 THEN X=X-1 120 IF P$=" " AND C=15 THEN C=4:GOTO 160 '──▶ 130 IF P$=" " AND C=4 THEN C=15 140 IF P$="O" OR P$="o" THEN GOSUB 500 '──▶ 150 IF P$="Z" OR P$="z" THEN GOSUB 1000 '──▶ 160 PSET(X,Y) 170 GOTO 50 '──▶ 500 'О к р у ж н о с т ь 510 K=0:GOSUB 1500 520 CIRCLE(X,Y),PR(0) 530 RETURN 1000 ' З в е з д а 1010 K=2:GOSUB 1500 1020 R=PR(0):N=PR(1):M=PR(2) 1030 PSET(X,Y-R) 1040 FOR I=1 TO N 1050 U=I*2*PI*M/N+PI/2 1060 X1=X+R*COS(U):Y1=Y-R*SIN(U) 1070 LINE-(X1,Y1) 1080 NEXTI 1090 RETURN 1500 ' В в о д 1510 FOR J=0 TO K 1520 F$="" 1530 LINE(0,0)-(255,10),4,BF 1540 PSET(0,0),4:PRINT #1,PD$(J); 1550 C$=INPUT$(1):PRINT #1,C$; 1560 IF ASC(C$)=13 THEN 1580 1570 F$=F$+C$:GOTO 1550 1580 PR(J)=VAL(F$) 1590 NEXT J 1600 LINE(0,0)-(255,10),4,BF:RETURN 2. П р и м е р простейшего редактора с п р а й т о в [22]. ─────────── Программа предназначена для создания спрайтов размером 8╳8. По решетке клавишами управления курсором перемещается двухцветный указатель(он виден и на фоне цвета 4, и на фоне цвета 15). При нажатии на клавишу INS в соот- ветствующую клетку вставляется квадратик цвета 15. Такие квадратики обра- зуют изображение спрайта. Для удаления квадратика нужно нажать клавишу "DEL". Справа от решетки отображается вид спрайта, сформированный к данно- му моменту. После нажатия на клавишу "Пробел" производится переключение в режим SCREEN 1, в котором печатаются десятичные коды, необходимые для создания спрайта и сам спрайт.После этого программа завершает свою работу. NEW Ok 10 DIM A(7) 20 SCREEN 2,1 30 SPRITE$(2)=CHR$(192)+CHR$(128)+CHR$(128)+CHR$(192) 35 SPRITE$(3)=CHR$(48)+CHR$(16)+CHR$(16)+CHR$(48) 40 FOR X=0 TO 140 STEP 20 50 FOR Y=0 TO 140 STEP 20 60 LINE(X,Y)-(X+20,Y+20),,B 70 NEXT Y,X 80 X=10:Y=10:I=7:J=0 90 PUT SPRITE 2,(X-4,Y-5),15,2 95 PUT SPRITE 3,(X-4,Y-5),4,3 100 PUT SPRITE 1,(200,50),,1 110 S=STICK(0) 120 IF S<> 0 THEN GOSUB 500:'Перемещение 130 P$=INKEY$ 140 IF P$=" "THEN 200 150 IF P$<>""THEN GOSUB 1000:'Удаление,вставка 160 GOTO 90 200 SCREEN 1 210 PRINT"СПРАЙТ" 220 PRINT:PRINT"DATA":PRINT 230 FOR K=0 TO 7 240 PRINT A(K); 250 IF K<>7 THEN PRINT","; 260 NEXTK 270 PRINT:PRINT 280 PUT SPRITE 0,(120,130),,1 290 END 500 'Управление стрелками 510 IF (S=1 OR S=2 OR S=8) AND Y> 10 THEN Y=Y-20:J=J-1 520 IF (S=2 OR S=3 OR S=4) AND X<150 THEN X=X+20:I=I-1 530 IF (S=4 OR S=5 OR S=6) AND Y<150 THEN Y=Y+20:J=J+1 540 IF (S=6 OR S=7 OR S=8) AND X> 10 THEN X=X-20:I=I+1 550 RETURN 1000 'Удаление и вставка 1010 IF ASC(P$)=18 AND POINT(X,Y)=4 THEN LINE (X-4,Y-4)-(X+4,Y+4),,BF: A(J)=A(J)+2^I 1020 IF ASC(P$)=127 AND POINT(X,Y)=15 THEN LINE (X-4,Y-4)-(X+4,Y+4),4, BF:A(J)=A(J)-2^I 1030 S$="" 1040 FOR K=0 TO 7 1050 S$=S$+CHR$(A(K)) 1060 NEXT K 1070 SPRITE$(1)=S$ 1080 RETURN 3. П р и м е р программы, обеспечиваюшей д в и ж е н и е фона. ─────────── 10 'А в т о р: Высотков Д.М. 20 COLOR 15,1,1:SCREEN 1,3:KEY OFF:WIDTH 32:VDP(1)=VDP(1)XOR64 30 SPRITE$(0)=STRING$(8,255):FC=2 'Этот спрайт будет двигаться! 40 DATA 8142241818244281,4224181824428181,2418182442818142,18182442818 14224,1824428181422418,2442818142241818,4281814224181824,8181422418182 442 'Данные для формирования символов движущегося фона ("вверх-вниз") 50 DATA 0142241010244201,4224101024420101,2410102442010142,10102442010 14224,1024420101422410,2442010142241010,4201014224101024,0101422410102 442 'Данные для формирования символов движущегося фона("вправо-влево") 60 FOR I=33 TO 48:READ A$:FOR T=2 TO 16 STEP 2 'Формирование 70 VPOKE 8*I+T/2-1,VAL("&H"+MID$(A$,T-1,2)):NEXT:NEXT ' символов 80 W$=STRING$(32,CHR$(255)) 90 FOR Y=0 TO 22: PRINT W$; 'Заполнение экрана строками W$ 100 NEXT: LOCATE 0,22: FOR I=33 TO 40 110 J$(1)=J$(1)+CHR$(I):NEXT:FOR I=41 TO 40:J$(2)=J$(2)+CHR$(I):NEXT 120 FOR I=48 TO 41 STEP 1: J$(4)=J$(4)+CHR$(I):NEXT 130 FOR I=40 TO 33 STEP 1: J$(3)=J$(3)+CHR$(I):NEXT 140 LOCATE 0,22: PRINT SPACE$(32) 150 LOCATE 0,22: PRINT J$(1) 160 PUT SPRITE 9,(100,63),1,0 170 FOR Q=0 TO 64 STEP 16:M=M+1 ' Стирание "бяки", возникающей 180 PUT SPRITE M,(Q,175),1,0 ' на экране 190 NEXT: VDP(1)=VDP(1) XOR 64 ' Включение экрана 200 FOR I=0 TO 7: LOCATE I,22,1: NEXT: YW=YW+1 220 IF YW=20 THEN LOCATE 0,22:PRINT J$(FC):FC=FC+1:YW=0 'Замена "бяки" 230 IF FC=5 THEN FC=1 240 GOTO 200 4. Программа, позволяющая сохранять на диске заранее построенное графи- ческое изображение и загружать его в видеопамять с дискеты. 10 OPEN "GRP:" AS #1: COLOR 10,1,1: SCREEN 2,0: PSET(128,6) 40 FOR I=1 TO 101 50 X=128+90*SIN(I*3.14*87/101):Y=96-90*COS(I*3.14*87/101):LINE-(X,Y) 80 NEXT I 90 DATA &H21,&H00,&H00,&H11,&H00,&H90,&H01,&H00,&H18,&HCD,&H59,&H00, &HC9 100 FOR I=0 TO 12: READ R: POKE &H8FF0+I,R: NEXT I 140 DEF USR=&H8FF0: Z=USR(Z) 160 POKE &H8FF2,&H20: POKE &H8FF5,&HA8: Z=USR(Z) 190 BSAVE "Картинка.рис",&H9000,&HC000 210 LINE(0,0)-(255,191),1,BF ' Начало воспроизведения рисунка 220 DATA &H21,&H00,&H90,&H11,&H00,&H00,&H01,&H00,&H18,&HCD,&H5C,&H00, &HC9 230 FOR I=0 TO 12: READ R: POKE &H8F00+I,R: NEXT I 270 DEF USR=&H8F00: BLOAD "Картинка.рис": Z=USR(Z) 300 POKE &H8F02,&HA8: POKE &H8F05,&H20: Z=USR(Z) 330 GOTO 330 К а н а - слоговая азбука японского письма (результат графического сокращения иерогли- фов). Существует (с XVIII в.) в двух вари- антах: катакана (используется для записи заимствованных слов) и хирагана (использу- ется для собственно японских слов). Советский Энциклопедический словарь 5. А теперь о "загадочном" операторе ┌────────────┐ │ PUT KANJI │ . └────────────┘ Приведем небольшой пример: 10 SCREEN 5: COLOR 15,0,0: M$="National": M=LEN(M$) 20 FOR X=1 TO M 30 CD=&H2300+ASC(MID$(M$,X,1)) 'Видимо, &H2300 - адрес?! 40 PUT KANJI (X*16-5,20),CD,11 50 PUT KANJI (X*16-5,70),CD,11 60 PUT KANJI (X*16-8,90),CD,11 70 NEXT: A$=INPUT$(1): SCREEN 0: LIST Выполнив эту программу на компьютере, Вы получите на экране дисплея ок- рашенные горизонтальные полосы. Видимо (это всего лишь наше предположе- ние!), оператор PUT KANJI позволяет выводить на экран японские иероглифы, изображенные на прямоугольном фоне заданного цвета (в программе код цвета- - 11). Но информации о иероглифах в памяти (а может быть в видеопамяти) компьютера почему-то уже нет?! А полосы (фон) остались! Кстати, оператор PUT KANJI может содержать необязательный параметр ти- па OR,AND,XOR,PSET,PRESET,TOR,TAND,TXOR,TPSET,TPRESET,расположенный после указания цвета через запятую.