Навигация

• Онлайн: 2

qr_code

Flag Counter




Рейтинг@Mail.ru

Индекс цитирования

Яндекс
creation/prograf/vehi/first.txt · Последнее изменение: 06.01.2025 15:07 — nozdr

Как я учился программировать графику

Документация

Моей настольной книгой по изучению бейсика было руководство, которое прилагалось к компьютеру. Я его начал штудировать ещё до того, как удалось подключить компьютер к телевизору.

Первая программа

Первым, что я попробовал, – нарисовать ослика из моей первой книжки по программированию. У меня ушло довольно много времени, пока я научился загружать с кассеты бейсик и пользоваться клавиатурой. В конце концов, я победил компьютер и свой тупизм – ослик получился :)

Ослик

Цель была достигнута, но какой ценой? Это была «мегакрутая» программа, круче, наверное только "Hello, World!":

100 CLS:PRINT
110 PRINT "          * *"
120 PRINT "          ***"
130 PRINT "         *****"
140 PRINT "        *******"
150 PRINT "        ** *****"
160 PRINT "             ***************"
170 PRINT "              ************* *"
180 PRINT "              ************* **"
190 PRINT "             *************  **"
200 PRINT "            **  **    ** **  *"
210 PRINT "           *     *     *  *"
220 PRINT "            *     *    *   *"
230 PRINT "             **   *   *    *"
240 PRINT "              *  **  **   **"

Результат на экране меня, конечно, удовлетворил. Но вот программа не очень – в ней вообще не было никакого «волшебства». И я стал пытаться сделать её наиболее похожей на фортрановский «оригинал».

Программа на фортране, рисующая ослика

Фортран в операторе FORMAT умел повторять пробелы и другие символы. Например 10Х делало 10 пробелов, а 15('*') – 15 звёздочек. Бейсик тоже умел делать пробелы в операторе PRINT, например SPC(10), а вот выводить сразу в принте нужное количество символов не умел.

Сперва я «перевёл» все пробелы. Кстати, заметил, что иногда 4 пробела писались как 4X, а иногда внутри строки '*⌴⌴⌴⌴*'.

100 CLS:PRINT
110 PRINT SPC(10);"* *"
120 PRINT SPC(10);"***"
130 PRINT SPC(9);"*****"
140 PRINT SPC(8);"*******"
150 PRINT SPC(8);"** *****"
160 PRINT SPC(13);"***************"
170 PRINT SPC(14);"*************";SPC(1);"*"
180 PRINT SPC(14);"*************";SPC(1);"**"
190 PRINT SPC(13);"*************";SPC(2);"**"
200 PRINT SPC(12);"**  **    ** **  *"
210 PRINT SPC(11);"*";SPC(5);"*";SPC(5);"*  *"
220 PRINT SPC(12);"*";SPC(5);"*";SPC(4);"*   *"
230 PRINT SPC(13);"**   *   *    *"
240 PRINT SPC(14);"*  **  **   **"

Дальше решил как-то автоматизировать (тогда я ещё и слова-то такого не знал «автоматизировать») повторение звёздочки нужное число раз. Пытался понять, можно ли написать что-то типа STAR(15). Такое, конечно, не работало :)) Вычитал, что можно сделать свою функцию. Но написать при помощи DEF FN одну единственную функцию, возвращающую нужное число звёздочек, тоже не получалось. В результате «оптимизировал» программу вот так:

100 CLS:PRINT
110 PRINT SPC(10);"* *"
120 PRINT SPC(10);"***"
130 PRINT SPC(9);"*****"
140 PRINT SPC(8);"*******"
150 PRINT SPC(8);"** *****"
155="*************"
160 PRINT SPC(13);S¤;"**"
170 PRINT SPC(14);S¤;SPC(1);"*"
180 PRINT SPC(14);S¤;SPC(1);"**"
190 PRINT SPC(13);S¤;SPC(2);"**"
200 PRINT SPC(12);"**  **    ** **  *"
210 PRINT SPC(11);"*";SPC(5);"*";SPC(5);"*  *"
220 PRINT SPC(12);"*";SPC(5);"*";SPC(4);"*   *"
230 PRINT SPC(13);"**   *   *    *"
240 PRINT SPC(14);"*  **  **   **"

Но всё равно что-то свербило. Стал думать о том, как написать подпрограмму, которая выдаёт строку с нужным количеством символов. Написал и использовал её для рисования рамочки вокруг ослика. А также добавил всяких отступов и название.

Получилась вот такая крутизна:

Программа, рисующая ослика в рамке

Программа, рисующая ослика в рамке

100 CLS:PRINT:PRINT SPC(16);"О С Л И К":PRINT
105 CLEAR 300:N=38:GOSUB 300
106 PRINT SPC(2);N¤
107 PRINT SPC(2);"☻";SPC(36);"☻"
110 PRINT SPC(2);"☻";SPC(10);"* *";SPC(23);"☻"
120 PRINT SPC(2);"☻";SPC(10);"***";SPC(23);"☻"
130 PRINT SPC(2);"☻";SPC(9);"*****";SPC(22);"☻"
140 PRINT SPC(2);"☻";SPC(8);"*******";SPC(21);"☻"
150 PRINT SPC(2);"☻";SPC(8);"** *****";SPC(20);"☻"
155="*************"
160 PRINT SPC(2);"☻";SPC(13);S¤;"**";;SPC(8);"☻"
170 PRINT SPC(2);"☻";SPC(14);S¤;SPC(1);"*";SPC(7);"☻"
180 PRINT SPC(2);"☻";SPC(14);S¤;SPC(1);"**";SPC(6);"☻"
190 PRINT SPC(2);"☻";SPC(13);S¤;SPC(2);"**";SPC(6);"☻"
200 PRINT SPC(2);"☻";SPC(12);"**  **    ** **  *";SPC(6);"☻"
210 PRINT SPC(2);"☻";SPC(11);"*";SPC(5);"*";SPC(5);"*  *";SPC(9);"☻"
220 PRINT SPC(2);"☻";SPC(12);"*";SPC(5);"*";SPC(4);"*   *";SPC(8);"☻"
230 PRINT SPC(2);"☻";SPC(13);"**   *   *    *";SPC(8);"☻"
240 PRINT SPC(2);"☻";SPC(14);"*  **  **   **";SPC(8);"☻"
242 PRINT SPC(2);"☻";SPC(36);"☻"
245 PRINT SPC(2);N¤
250 GOTO 500
300="":FOR I=1 TO N:N¤=+"☻":NEXT:RETURN
500 REM КОНЕЦ

Теперь результат меня удовлетворил. Я научился писать подпрограммы, да и в самой программе появилось то самое отсутствующее в самом начале «волшебство», когда из каких-то непонятных символов получается картинка.

Дальнейшие опыты

Более подробно изучать возможности бейсика я стал на рекламных программах, которые шли в стандартной поставке на системной кассете. В этих программах всё было довольно весело, двигалось и звучала неземная музыка.

Рекламные программы

В первую очередь меня интересовало, как работать с цветом, как писать большие буквы, как рисовать не символами, а линиями, как делать музыку. И я стал ковырять эти программы, выдирать оттуда кусочки кода, вставлять в свои.

Цвет

Вначале я стал играться с цветом, благо что Вектор-06Ц позволял насладиться этим в полной мере. Научился задавать требуемый цвет при помощи COLOR, а при помощи PLOT X,Y,2 устанавливать графический курсор в нужную точку. Оператором LINE STEP N,M,BF рисовал нужного размера закрашенные текущим цветом прямоугольники. Оказалось, что 256 цветов – это на самом деле 16 основных цветов * 16 цветов подложки. То есть рисовать графику можно одновременно только 16-ю основными цветами. А вот «цвет символа» – это комбинация цвета самого символа и его подложки. И таких комбинаций как раз 16*16=256. Какими будут эти самые 16 цветов, задаётся в палитре при помощи SCREEN 0. Здесь их уже можно выбрать из общей полной 256-тицветной палитры. При изменении палитры цвета на экране моментально меняются. Вот тут-то мне и попёрло :)

Получилось не только вырвиглазно, но ещё и динамично. Настоящая цветомузыка (только пока без музыки)!

Всё моргает

А это код программы

А это код программы

100 CLS
105 IF INKEY¤="" THEN 105
110 FOR X=0 TO 255 STEP 16
120 FOR Y=0 TO 255 STEP 16
130 COLOR RND(1)*256
140 PLOT X,Y,2:LINE X+15,Y+15,BF
160 NEXT Y
170 NEXT X
172 COLOR 0,2:PLOT 64,48,2:LINE STEP 112,176,BF
180 FOR C=12 TO 27
190 FOR R=20 TO 5 STEP -1
200 COLOR RC:RC=RC+1
210 CUR C,R
228 PRINT "*"
230 NEXT R
240 NEXT C
250 PAUSE 5
270 SCREEN 0,0,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255,RND(1)*255
280 IF INKEY¤="" THEN 270
300 SCREEN 0,0,64,128,16,208,6,134,22,54,0,197,34,192,2,152,82,173
310 COLOR 15,0,1

Как я узнал уже намного позже, на ассемблере можно было добиться отображения вообще всех возможных 256-ти цветов одновременно. Но мне тогда хватало и 16-ти.

256 цветов одновременно

Символы

Следующим этапом изучения возможностей бейсика стали символы. Во-первых, я сначала попробовал просто с клавиатуры ввести все возможные символы. Оказалось, что не так-то это и просто. Вычитал, что символ можно напечатать по его коду. Также выяснилось, что некоторые коды были служебными, и если попытаться комбинацией PRINT CHR¤(N) в цикле от 0 до 255 вывести все символы, то происходит что-то странное. То динамик бикает, то ничего не выводится, то экран пролистывается или вообще стирается. Это получилось обойти, задействовав оператор LINE 1,1,BS, который задавал масштаб символов в 1, но зато PRINT печатал после этого как надо, хоть и медленно.

таблица символов

Код программы Таблица символов

Код программы Таблица символов

100 CLS:COLOR 7,0,1
105="0123456789ABCDEF"
106 DX=70:DY=60:K=0
110 FOR I=0 TO 15: Y=255-I*10-DY
112 FOR J=0 TO 15: X=J*8+DX
115 IF I>0 THEN 120
117 PLOT X,Y+14,2:COLOR 7
118 LINE1,1,BS:PRINT MID¤(S¤,J+1,1):CUR 1,2
120 IF J>0 THEN 125
122 PLOT DX-12,Y,2:COLOR 7
124 LINE1,1,BS:PRINT MID¤(S¤,I+1,1):CUR 1,2
125 PLOT X,Y,2
130 COLOR 15:LINE1,1,BS:PRINT CHR¤(K):CUR 1,2:K=K+1
140 NEXT J
150 NEXT I
160 COLOR 7
170 PLOT DX-4,255-DY+21,2:LINE DX-4,255-150-DY
180 PLOT DX-13,255-DY+10,2:LINE DX+124,255-DY+10
190 COLOR 15

Заодно я научился писать большими буквами с разными видами обводки и эмуляцией тени. А ещё делать комментарии!

Код программы для рисования большими буквами

Код программы для рисования большими буквами

100 CLS
110="N O Z D R"
115 MX=4:MY=4:X=20
120 CB=15:CS=4:Y=215:GOSUB 500
120 CT=4:CS=7:Y=170:GOSUB 700
130 CB=4:CS=0:Y=127:GOSUB 600
140 CT=7:CS=4:Y=80:GOSUB 750
150 CT=7:CS=4:Y=35:GOSUB 800
480 COLOR 15
490 GOTO 900
500 REM B-ШИРИНА РАМКИ, MX,MY - МАСШТАБ ПО X,Y
505 REM ***** КВАДРАТНАЯ РАМКА
510 COLOR CB
505 B=1: FOR I=-B TO B STEP B*2:FOR J = -B TO B STEP B*2
515 PLOT X+I,Y+J,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
520 NEXT J:NEXT I
550 COLOR CS
560 PLOT X,Y,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
570 RETURN
600 REM ***** ОКРУГЛАЯ РАМКА
610 B=1: COLOR CB
615 PLOT X+B,Y,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
615 PLOT X-B,Y,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
630 PLOT X,Y-B,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
635 PLOT X,Y+B,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
650 COLOR CS
660 PLOT X,Y,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
670 RETURN
700 REM ***** ОБ'ЕМНЫЕ БУКВЫ
710 B=4:COLOR CT:FOR I=1 TO B
715 PLOT X+I,Y+I,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
720 NEXT I
730 COLOR CS:PLOT X,Y,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
740 RETURN
750 REM ***** КИРПИЧИКИ
755 GOSUB 700
770 COLOR 0:PLOT X,Y,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
760 SCREEN 3,247,247,247,0,127,127,127,0
770 COLOR CS:PLOT X,Y,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
775 SCREEN 3,255,255,255,255,255,255,255,255
780 RETURN
800 REM ***** СЕТОЧКА
801 COLOR CS:PLOT X+2,Y-1,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
802 COLOR CS:PLOT X+2,Y-2,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
803 COLOR CS:PLOT X+1,Y-2,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
805 GOSUB 500
820 SCREEN 3,153,102,102,153,153,102,102,153
830 COLOR CT:PLOT X,Y,2: LINE MX,MY,BS: PRINT S¤: CUR 1,2
835 SCREEN 3,255,255,255,255,255,255,255,255
840 RETURN
900 REM END

На самом деле это уже было прям мегакруто. Я научился писать программы! Инициировать переменные, делать циклы и условные ветвления, использовать встроенные функции, писать подпрограммы, работать с цветом и с символами, даже линии рисовать. Теперь надо было приступать к рисованию примитивами. И я приступил :)

Графические примитивы

В демо-программе, про которую я уже говорил, мне понравилось два момента – с дракончиком и закрашенными кружочками. Программировать заливку прямоугольников и больших символов к этому времени я уже умел. Теперь предстояло научиться рисовать линии, круги и пользоваться заливкой произвольных областей.

Я сам не стал ничего писать, а просто разобрал код, который это делает, и построчно его прокомментировал. Узнал как вычислять центр, задавать массивы, про оператор рисования окружности CIRCLE, вычисления цвета точки на экране POINT, про оператор заливки PAINT, как скрытно рисовать чёрным по чёрному. Когда знаешь, как всё сделано, всё стало казаться простым :)

Код программы, рисующей закрашенные кружочки

Код программы, рисующей закрашенные кружочки

10 GOTO 130: REM СПЕРВА ИДУТ ПОДПРОГРАММЫ
19 REM ***** БОЛЬШИЕ БУКВЫ X ПО ЦЕНТРУ, Y, A,B-МАСШТАБ *****
20 PLOT (256-LEN()*6*A)/2,Y,2:LINE A,B,BS:PRINT S¤:RETURN
29 REM ***** ПОЛОСОЧКИ ДЛЯ ЗАЛИВКИ ПРЯМОУГОЛЬНИКА *****
30 SCREEN 3,0,255,0,255,0,255,0,255:RETURN
39 REM ***** СПЛОШНАЯ ЗАЛИВКА *****
40 SCREEN 3,255,255,255,255,255,255,255,255:RETURN
49 REM ***** ЗАДАЕМ И УСТАНАВЛИВАЕМ ПАЛИТРУ *****
50 CW(0)=0:CW(1)=128:CW(2)=16:CW(3)=208:CW(4)=7:CW(5)=134:CW(6)=22:CW(7)=54
60 CW(8)=0:CW(9)=197:CW(10)=34:CW(11)=192:CW(12)=2:CW(13)=152:CW(14)=164:CW(15)=173
70 GOSUB 80:RETURN
79 REM ***** УСТАНАВЛИВАЕМ ПОДГОТОВЛЕННУЮ ПАЛИТРУ *****
80 FOR I=0 TO 15:SCREEN 0,I,CW(I):NEXT I:RETURN
89 REM ***** КРУТИМ ПАЛИТРУ 15 РАЗ *****
90 FOR I1=1 TO 15:GOSUB 100:NEXT I1:RETURN
99 REM ***** ОДИН ПРОКРУТ ПАЛИТРЫ *****
100 P=CW(1):FOR I2=1 TO 14:CW(I2)=CW(I2)+1:SCREEN 0,I2,CW(I2):NEXT I2
110 CW(15)=P:SCREEN 0,15,CW(15):RETURN
119 REM ***** ЦЕНТРИРОВАННЫЙ ПРЯМОУГОЛЬНИК С РАМКОЙ *****
120 COLOR C:PLOT (256-A)/2,Y,1:LINE STEP A,B,BF:COLOR C1:LINE STEP -A,-B,B:RETURN
128 REM ************* ОСНОВНАЯ ПРОГРАММА ************
129 REM ЧИСТИМ ЭКРАН, ГОТОВИМ ПАЛИТРУ
130 CLS:CLEAR(450):DIM CW(15):GOSUB 50
139 REM РИСУЕМ ПУСТОЙ ПРЯМОУГОЛЬНИК 8-М (ЧЕРНЫМ) ЦВЕТОМ НА 0-М (ТОЖЕ ЧЕРНОМ) ФОНЕ
140 COLOR 8,0,8:PLOT 30,50,1:LINE 225,200,B
149 REM РИСУЕМ 20 СЛУЧАЙНЫХ ОКРУЖНОСТЕЙ 8-М ЦВЕТОМ, ОНИ СЛИВАЮТСЯ С ФОНОМ
150 FOR I=0 TO 20:CIRCLE RND(1)*150+50,RND(1)*150+50,RND(1)*40+10:NEXT I
159 REM ДЕЛАЕМ ОБРЕЗКУ ВСЕГО, ЧТО ВЫЛЕЗЛО ЗА ГРАНИЦУ ПРЯМОУГОЛЬНИКА
160 COLOR 13,0,13:PLOT 0,0:LINE 29,255,BF:LINE 255,201,BF:LINE 226,0,BF:LINE 29,49,BF
169 REM ЗАЛИВКА БУДЕТ ПОЛОСАТОЙ
170 GOSUB 30
179 REM ПИШЕМ ТЕКСТ В ПРЯМОУГОЛЬНИКАХ ВЫШЕ И НИЖЕ ЦЕНТРА
180 Y=215:A=200:B=30:C=1:C1=4:GOSUB 120:COLOR 7:Y=222:A=2:B=2:S¤="16 ЦВЕТОВ ИЗ 255":GOSUB 20
190 Y=15:A=200:B=30:C=6:C1=7:GOSUB 120:COLOR 8:Y=23:A=1:B=2:S¤="УСТАНАВЛИВАЮТСЯ ПРОГРАММНО":GOSUB 20:GOSUB 40
198 REM 250 РАЗ ТЫКАЕМ В СЛУЧАЙНОЕ МЕСТО И ЕСЛИ ОНО НЕ ЗАКРАШЕНО ИЛИ ГРАНИЦА (ЦВЕТ 8)
199 REM ТО КРАСИМ СЛУЧАЙНЫМ, НО НЕ 8-М ЦВЕТОМ
200 FOR I=0 TO 250:X=RND(1)*193+31:Y=RND(1)*148+51
210 C=RND(1)*15+1:IF C=8 THEN 210
220 PLOT X,Y,2:IF POINT(1)<>0 THEN 240
230 PAINT X,Y,C,8
240 NEXT I
249 REM КРУТИМ ПАЛИТРУ, ВОЗВРАЩАЕМ НА МЕСТО
250 GOSUB 90:GOSUB 50
259 REM РИСУЕМ ПО ЦЕНТРУ ЕЩЕ 2 ПРЯМОУГОЛЬНИКА И ПИШЕМ НА НИХ ТЕКСТЫ
260 Y=160:A=150:B=40:C=1:C1=7:GOSUB 120:Y=60:GOSUB 120
270 Y=170:A=3:B=3:COLOR 6:S¤="ЦВЕТНАЯ":GOSUB 20:Y=70:COLOR 5:S¤="ГРАФИКА":GOSUB 20
279 REM ЗАЦИКЛИВАЕМ, ПОКА НЕ НАЖАТА КЛАВИША, ЧТОБЫ НЕ ПОКАЗЫВАЛО =>_
280 IF INKEY¤="" THEN 280

Осталось разобраться с драконом.

Стал изучать, как это сделано. Оказалось, до банального просто.

Код программы, рисующей дракончика

Код программы, рисующей дракончика

115 DATA -80,-20,76,27,91,41,101,56,91,71,94,81,101,91,111,91,121,81,124,71
116 DATA 121,61,91,31,87,31,76,26,81,20,91,21,94,24,92,31,118,63,121,72
117 DATA 120,79,111,91,-97,-37,102,35,163,39,146,26,94,23,-81,-21,147,21,164,34
118 DATA 164,39,-133,-37,124,25,124,21,-101,-34,94,25,-147,-21,146,26,-161,-35,172,35
119 DATA 159,33,-156,-31,170,31,154,29,-151,-26,167,26,149,25,-148,-39,163,48,109,43
120 DATA -100,-36,112,46,-136,-44,130,38,-163,-48,164,40,-161,-43,170,43,159,42,-98,-50
121 DATA 66,91,86,106,101,91,-83,-104,74,119,58,105,68,93,-71,-116,65,124,56,111
122 DATA 62,108,-62,-121,51,126,49,118,58,115,-50,-123,41,124,39,120,50,121,-41,-133
123 DATA 35,112,23,133,41,133,-35,-128,31,129,34,124,35,130,-115,-87,136,116,123,81
124 DATA 163,81,163,91,160,106,150,117,166,111,161,126,165,141,151,131,137,131,127,141
125 DATA 130,126,125,111,137,117,151,118,151,131,-137,-117,138,131,-163,-81,161,76,153,70
126 DATA 124,70,-153,-69,146,58,134,60,122,63,-145,-58,133,51,119,59,-133,-51,118,47
127 DATA 109,48,-116,-48,117,57,-165,-141,163,142,150,132,-127,-141,125,142,127,128,123,113
128 DATA 126,113,-129,-125,127,126,-138,-128,143,126,-151,-122,148,127,-145,-118,145,114,147,118
129 DATA 147,111,143,111,143,118,-124,-119,96,131,-97,-132,90,129,91,139,98,133
130 DATA -92,-129,124,116,-129,-113,134,112,-125,-122,99,134,119,142,-96,-135,117,145,123,137
131 DATA 122,132,126,137,123,152,128,152,131,140,134,160,130,161,120,155,93,139,-162,-120
132 DATA 186,136,-182,-137,196,138,195,128,183,138,-157,-109,161,113,-164,-115,189,134,168,100
133 DATA 164,104,164,108,162,108,165,100,164,96,165,89,168,96,171,89,174,98,194,131
134 DATA -140,-131,141,167,138,172,138,177,153,177,153,172,150,168,150,132,-150,-169,141,169
135 DATA -138,-171,152,172,-65,-182,63,186,68,198,90,198,94,189,97,187,156,187,171,212
136 DATA 126,212,117,195,117,191,121,187,-171,-212,179,208,179,199,189,194,189,188,154,179
137 DATA 88,179,85,182,158,182,169,188,-158,-183,66,183,-68,-182,71,175,73,183,-77,-183
138 DATA 79,176,82,183,-184,-189,185,193,-181,-193,182,189,-177,-187,178,196,-155,-190,166,208
139 DATA -165,-209,-164,-209,129,210,127,208,-126,-207,122,195,121,193,-121,-192,-122,-191,-123,-190
140 DATA 156,191,-149,-195,144,195,148,205,154,205,149,195,-129,-195,134,195,138,205,134,205
141 DATA 130,195,-135,-212,132,223,137,223,142,213,-135,-222,133,233,130,233,134,223,-154,-212
142 DATA 160,223,165,223,161,213,-161,-223,166,234,169,234,164,224,-144,-166,145,137,-78,-96
143 DATA 92,80,-65,-107,72,100,-67,-115,63,119,-128,-148,126,149
144 DATA 147,22,1,144,22,3,123,22,1,126,26,3,123,26,1,153,40,1,146,40,3,129,39,1,98,34,1,86,22,3
145 DATA 81,30,11,119,62,1,96,57,9,68,96,6,62,111,4,56,119,2,46,122,7,33,120,5,34,128,12,116,49,14
146 DATA 119,49,12,133,53,4,144,61,6,144,72,2,121,83,10,126,83,13,128,115,5,124,115,4,128,128,4,140,121,7
147 DATA 161,115,5,161,139,4,145,112,4,145,133,3,145,173,1
148 DATA 96,129,11,99,132,3,94,133,4,98,135,1,96,138,3,166,118,11,157,111,11,132,113,11,193,133,4,191,129,3
149 DATA 126,180,13,72,180,5,80,180,5,126,189,4,126,193,2,134,203,11,151,203,11,159,215,7,139,215,7
150 RESTORE 115:CLS:COLOR 15:FOR I=0 TO 285:READ X,Y
151 IF X<0 AND Y<0 THEN PLOT ABS(X),ABS(Y),1:GOTO 153
152 LINE X,Y
153 NEXT I
154 FOR I=0 TO 53:READ X,Y,Z
155 PAINT X,Y,Z,15
156 NEXT I

Сначала шёл блок данных. За ним оператором RESTORE указывалась строка с данными, с которой надо начинать чтение оператору READ. Далее очищался экран CLS и устанавливался белый цвет COLOR 15. В строках с оператором DATA были записаны 286 пар координат. В цикле они вычитывались. Если обе координаты были отрицательные, то по модулю этих координат устанавливался курсор PLOT ABS(x),ABS(y),1 , а если положительные – до этих координат рисовалась линия LINE X,Y. Далее шло 54 тройки координат с цветом. Они точно так же вычитывались в цикле и заливали нужные места PAINT X,Y,Z,15 цветом Z до 15-го цвета.

Самым интересным было – как эти координаты придумали? Неужели рисовали наобум? Это же долго! Скорее всего, сначала нарисовали на миллиметровке, затем уже по ней считали координаты линий, а потом где надо подгоняли по месту. Я, в общем, решил тоже нарисовать что-то своё :)

Тогда я очень любил слушать музыку группы Мастер, поэтому и взялся рисовать их логотип.

Обложка первого альбома группы "Мастер"

Я нарисовал на миллиметровке логотип и долго мучился, высчитывая координаты. Особенно туго пришлось на молниях. Но оно того стоило. Мне кажется, что получилось намного лучше, чем дракончик :) Особенно если учесть, что отрисовывалось это красиво, с незаметным заполнением и внезапной раскраской. Помнится, я ещё хотел сделать, чтобы в процессе играла «неземная» музыка, а именно музыка группы Мастер. Но так как у меня музыкальной грамоты не было, то написать нотами нужную мелодию не получилось. Так программа и осталась беззвучная. В общем, это была моя первая (и наверное, последняя) попытка написать на бейсике демку. Я тогда и не знал, что существует целое направление – демосцена. Печально, но этот пласт прошёл мимо меня, хотя все предпосылки были.

Программа «Мастер»

Программа «Мастер»

100 CLS
110 COLOR10,1,14
120 SCREEN0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,255
122 REM SCREEN0,0,64,128,16,208,6,134,22,54,0,197,34,192,2,152,82,255
130 N=226:DX=1:DY=-30:GOSUB610
140 FORI=1TO7:ONIGOSUB840,850,860,870,880,882,884:PAUSE.5:NEXT
190 COLOR9:CIRCLE127,127,34:CIRCLE127,127,25:PAINT127,160,9,9
192 COLOR11:PLOT95,132:LINE159,132:LINE127,100:LINE95,132:PLOT159,131:LINE127,99:LINE95,131:PAINT127,107,10,11
195 N=18:DX=64:DY=-92:RESTORE550:GOSUB610
200 S¤="M      A      S      T      E      R"
202 COLOR1:PLOT 20,80,2:LINE1,1,BS:PRINTS¤
200 S¤="М      А      С      Т      Е      Р"
205 MX=1:MY=3:X=20:Y=50:CB=12:CS=8:GOSUB 700
210 SCREEN0,0,0,6,6,6,6,6,6,6,0,255,6,0,255,0,173,255:PAUSE.5
299 CUR1,2:COLOR15:GOTO900
300 DATA0,14,-38,17,50,17,63,30,76,17,88,17,81,24,81,59,72,50,72,33,63,42,54,33,54,50,45,59,45,24,38,17,63,-40,1,14
310 DATA0,15,-40,18,50,18,63,31,76,18,86,18,63,41,40,18,-46,24,46,57,53,50,53,31,-73,31,73,50,80,57,80,24
320 DATA0,14,-91,17,117,17,109,25,109,50,100,59,100,41,93,41,93,50,84,59,84,24,91,17,-93,26,100,26,100,33,93,33,93,26,91,-18,2,14
330 DATA0,15,-85,24,91,18,115,18,108,25,108,50,101,57,101,40,92,40,92,50,85,57,85,25,108,25,-101,25,101,34,92,34,92,25
340 DATA0,14,-117,17,129,17,146,34,134,34,128,28,121,35,132,46,139,39,145,45,132,58,109,35,122,22,117,17,121,-18,3,14
350 DATA0,15,-119,18,129,18,144,33,134,33,119,18,-123,22,110,35,132,57,144,45,139,40,132,47,120,35,128,27
360 DATA0,14,-132,17,164,17,164,26,155,26,155,50,146,59,146,26,141,26,132,17,134,-18,4,14
370 DATA0,15,-134,18,163,18,163,25,141,25,134,18,-147,25,147,57,154,50,154,25
390 DATA0,14,-155,40,163,32,166,32,166,17,189,17,180,26,175,26,175,32,189,32,180,41,175,41,175,49,189,49,189,58,174,58,166,50,166,41,155,41,174,-57,5,14
410 DATA0,15,-167,33,167,18,187,18,180,25,174,25,174,33,-167,40,156,40,163,33,187,33,180,40,167,40,167,50,174,57,188,57,188,50,174,50,174,40
420 DATA0,14,-183,26,192,17,212,17,220,25,200,45,200,50,191,59,191,26,183,26,-200,26,207,26,200,33,200,26,192,-57,6,14
440 DATA0,15,-185,25,192,18,212,18,219,25,185,25,-192,25,192,57,199,50,199,45,219,25,-199,25,199,35,209,25
460 DATA0,14,-6,40,23,40,18,35,42,35,42,44,31,44,69,82,68,82,4,40,20,-36,7,14
480 DATA0,15,-7,41,25,41,20,36,41,36,41,43,29,43,65,79,7,41
490 DATA0,14,-245,40,228,40,233,35,213,35,204,44,220,44,182,82,183,82,247,40,226,-36,7,14
500 DATA0,15,-243,41,226,41,231,36,213,36,206,43,222,43,186,79,188,78,244,41
520 DATA0,8,-38,17,50,17,63,30,76,17,88,17,81,24,81,59,72,50,72,33,63,42,54,33,54,50,45,59,45,24,38,17,63,-40,9,8
550 DATA0,13,-40,18,50,18,63,31,76,18,86,18,63,41,40,18,-46,24,46,57,53,50,53,31,-73,31,73,50,80,57,80,24,63,-40,12,13,48,-40,12,13,75,-40,12,13
610 FORI=0TON:READX,Y
620 IFX<0THENPLOTABS(X)+DX,255-Y+DY,1:GOTO650
630 IFX=0THENCOLORY:GOTO650
635 IFY<0THENREADC,C2:PAINTX+DX,255-ABS(Y)+DY,C,C2:GOTO650
640 LINEX+DX,255-Y+DY
650 NEXTI
660 RETURN
700 REM ***** КВАДРАТНАЯ РАМКА
710 COLOR CB
705 B=1: FOR I=-B TO B STEP B:FOR J = -B TO B STEP B
715 PLOT X+I,Y+J,2: LINE MX,MY,BS: PRINT S¤: CUR1,2
720 NEXT J:NEXT I
750 COLOR CS
760 PLOT X,Y,2: LINE MX,MY,BS: PRINT S¤: CUR1,2
770 RETURN
840 SCREEN0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,173,255:RETURN
850 SCREEN0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,173,255:RETURN
860 SCREEN0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,173,255:RETURN
870 SCREEN0,0,0,6,6,6,6,0,0,0,0,0,0,0,0,0,173,255:RETURN
880 SCREEN0,0,0,6,6,6,6,6,0,0,0,0,0,0,0,0,173,255:RETURN
882 SCREEN0,0,0,6,6,6,6,6,6,0,0,0,0,0,0,0,173,255:RETURN
884 SCREEN0,0,0,6,6,6,6,6,6,6,0,0,0,0,0,0,173,255:RETURN
900 PAUSE10

Продолжение следует…

Знакогенератор

Спрайты


Инструменты страницы

Инструменты пользователя