• Онлайн: 2
Содержание
Как я учился программировать графику
Начало: Этапы большого пути
Документация
Моей настольной книгой по изучению бейсика было руководство, которое прилагалось к компьютеру. Я его начал штудировать ещё до того, как удалось подключить компьютер к телевизору.
- Описание языка BASIC для Вектор-06Ц (1,5Мб, djvu): Вектор-06Ц.Бейсик.djvu
Первая программа
Первым, что я попробовал, – нарисовать ослика из моей первой книжки по программированию. У меня ушло довольно много времени, пока я научился загружать с кассеты бейсик и пользоваться клавиатурой. В конце концов, я победил компьютер и свой тупизм – ослик получился :)
Цель была достигнута, но какой ценой? Это была «мегакрутая» программа, круче, наверное только "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 S¤="*************" 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);"* ** ** **"
Но всё равно что-то свербило. Стал думать о том, как написать подпрограмму, которая выдаёт строку с нужным количеством символов. Написал и использовал её для рисования рамочки вокруг ослика. А также добавил всяких отступов и название.
Получилась вот такая крутизна:
Теперь результат меня удовлетворил. Я научился писать подпрограммы, да и в самой программе появилось то самое отсутствующее в самом начале «волшебство», когда из каких-то непонятных символов получается картинка.
Дальнейшие опыты
Более подробно изучать возможности бейсика я стал на рекламных программах, которые шли в стандартной поставке на системной кассете. В этих программах всё было довольно весело, двигалось и звучала неземная музыка.
В первую очередь меня интересовало, как работать с цветом, как писать большие буквы, как рисовать не символами, а линиями, как делать музыку. И я стал ковырять эти программы, выдирать оттуда кусочки кода, вставлять в свои.
Цвет
Вначале я стал играться с цветом, благо что Вектор-06Ц позволял насладиться этим в полной мере. Научился задавать требуемый цвет при помощи COLOR, а при помощи PLOT X,Y,2 устанавливать графический курсор в нужную точку. Оператором LINE STEP N,M,BF рисовал нужного размера закрашенные текущим цветом прямоугольники. Оказалось, что 256 цветов – это на самом деле 16 основных цветов * 16 цветов подложки. То есть рисовать графику можно одновременно только 16-ю основными цветами. А вот «цвет символа» – это комбинация цвета самого символа и его подложки. И таких комбинаций как раз 16*16=256. Какими будут эти самые 16 цветов, задаётся в палитре при помощи SCREEN 0. Здесь их уже можно выбрать из общей полной 256-тицветной палитры. При изменении палитры цвета на экране моментально меняются. Вот тут-то мне и попёрло :)
Получилось не только вырвиглазно, но ещё и динамично. Настоящая цветомузыка (только пока без музыки)!
Как я узнал уже намного позже, на ассемблере можно было добиться отображения вообще всех возможных 256-ти цветов одновременно. Но мне тогда хватало и 16-ти.
Символы
Следующим этапом изучения возможностей бейсика стали символы. Во-первых, я сначала попробовал просто с клавиатуры ввести все возможные символы. Оказалось, что не так-то это и просто. Вычитал, что символ можно напечатать по его коду. Также выяснилось, что некоторые коды были служебными, и если попытаться комбинацией PRINT CHR¤(N) в цикле от 0 до 255 вывести все символы, то происходит что-то странное. То динамик бикает, то ничего не выводится, то экран пролистывается или вообще стирается. Это получилось обойти, задействовав оператор LINE 1,1,BS, который задавал масштаб символов в 1, но зато PRINT печатал после этого как надо, хоть и медленно.
Заодно я научился писать большими буквами с разными видами обводки и эмуляцией тени. А ещё делать комментарии!
На самом деле это уже было прям мегакруто. Я научился писать программы! Инициировать переменные, делать циклы и условные ветвления, использовать встроенные функции, писать подпрограммы, работать с цветом и с символами, даже линии рисовать. Теперь надо было приступать к рисованию примитивами. И я приступил :)
Графические примитивы
В демо-программе, про которую я уже говорил, мне понравилось два момента – с дракончиком и закрашенными кружочками. Программировать заливку прямоугольников и больших символов к этому времени я уже умел. Теперь предстояло научиться рисовать линии, круги и пользоваться заливкой произвольных областей.
Я сам не стал ничего писать, а просто разобрал код, который это делает, и построчно его прокомментировал. Узнал как вычислять центр, задавать массивы, про оператор рисования окружности CIRCLE, вычисления цвета точки на экране POINT, про оператор заливки PAINT, как скрытно рисовать чёрным по чёрному. Когда знаешь, как всё сделано, всё стало казаться простым :)
Осталось разобраться с драконом.
Стал изучать, как это сделано. Оказалось, до банального просто.
Сначала шёл блок данных. За ним оператором RESTORE указывалась строка с данными, с которой надо начинать чтение оператору READ. Далее очищался экран CLS и устанавливался белый цвет COLOR 15. В строках с оператором DATA были записаны 286 пар координат. В цикле они вычитывались. Если обе координаты были отрицательные, то по модулю этих координат устанавливался курсор PLOT ABS(x),ABS(y),1 , а если положительные – до этих координат рисовалась линия LINE X,Y. Далее шло 54 тройки координат с цветом. Они точно так же вычитывались в цикле и заливали нужные места PAINT X,Y,Z,15 цветом Z до 15-го цвета.
Самым интересным было – как эти координаты придумали? Неужели рисовали наобум? Это же долго! Скорее всего, сначала нарисовали на миллиметровке, затем уже по ней считали координаты линий, а потом где надо подгоняли по месту. Я, в общем, решил тоже нарисовать что-то своё :)
Тогда я очень любил слушать музыку группы Мастер, поэтому и взялся рисовать их логотип.
Я нарисовал на миллиметровке логотип и долго мучился, высчитывая координаты. Особенно туго пришлось на молниях. Но оно того стоило. Мне кажется, что получилось намного лучше, чем дракончик :) Особенно если учесть, что отрисовывалось это красиво, с незаметным заполнением и внезапной раскраской. Помнится, я ещё хотел сделать, чтобы в процессе играла «неземная» музыка, а именно музыка группы Мастер. Но так как у меня музыкальной грамоты не было, то написать нотами нужную мелодию не получилось. Так программа и осталась беззвучная. В общем, это была моя первая (и наверное, последняя) попытка написать на бейсике демку. Я тогда и не знал, что существует целое направление – демосцена. Печально, но этот пласт прошёл мимо меня, хотя все предпосылки были.
Продолжение следует…
Знакогенератор
…
Спрайты
…