V.5. ГРАФИЧЕСКИЙ МАКРОЯЗЫК GML В MSX-BASIC входит оператор DRAW, который позволяет изображать на экра- не дисплея рисунки, составленные из различных комбинаций прямых линий. На- чиная с последней высвеченной на экране точки, с помощью оператора DRAW можно провести линию любой длины и в любом из 8 заданных направлений (см. рис.2). После этого можно провести еще одну линию, снова любой длины и в любом из тех же восьми направлений и т.д. Каждая проводимая линия может быть окрашена в любой из 15 допустимых цветов. Кроме того,можно проводить отрезок, соединяющий текущую точку с любой точкой, заданной абсолютными или относительными координатами. Можно также увеличивать или уменьшать весь выводимый рисунок и поворачивать его на 90°, 180° или 270°. Оператор DRAW - мощный оператор, являющийся по существу настоящим мини -языком в MSX-BASIC. Этот язык называется графическим м а к р о я з ы - к о м GML("Graphics Macro Language"). Записывается оператор в виде DRAW β где: DRAW("to draw"-"рисовать") - служебное слово; β - строковое выражение, значение которого определяет рисунок. Значение β составляется из последовательности команд GML. Обратите вни- мание на то, что значение параметра β всегда заключено в кавычки, посколь- ку это обычная строка MSX-BASICa, состоящая из команд языка 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 Рис.3 "Down"-"вниз" D ───── 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 X