Spectrum Progress
#01
30 сентября 1996 |
|
Записки программиста - унивкрсальная библиотека для работы с графикой от Вячеслава Медноногова - Graphic Library v1.1
Graphic Library v1.1 (C) Вячеслав Медноногов, 1991,1992. (C) описание - Вячеслав Медноногов, 1996. Растущая популярность ZX Spectrum привела к тому, что многие из тех, кто воспринимал этот компьютер только как игрушку, сейчас с удо- вольствием осваивают его как мощное средство программирования. И если ещё год-два назад речь могла идти только о бейсике, то сегодня интерес вызывает ассемблер. Это не слишком сложный язык однако для некоторых, особенно начинающих прог- раммистов препятствием становится вывод графики в разрабатываемых ими системных и прикладных программах. Чтобы помочь им, я предлагаю свою графическую библиотеку, ставшую ядром игры "Танкодром". Она же вошла и в игру "Буратино". С некоторыми из- менениями эта библиотека вошла, в качестве вспомогательной, в игру "НЛО. Враг неизвестен". Отличительными чертами Graphic Library (GrLib1.1) являются малый размер (880 байт), универсальность, возможность работы всех проце- дур с обычным и теневыми экранами, вывод спрай- тов и атрибутов всеми возможными способами на- ложения, построение точек и отрезков. Кроме то- го, в неё вошли процедуры целочисленного умно- жения и деления. Ещё одним важным достоинством является то, что все процедуры (кроме GETSIM и GETSCR) рабо- тают корректно с любыми входными параметрами, поэтому, даже если вы ошибётесь в задании коор- динат точек, отрезков, спрайтов или размеров примитивов, по моей вине ваша программа не вы- летит (правда, в том случае, если правильно ис- пользовали процедуру настройки экрана SELSCR). К недостаткам можно отнести лишь то, что, как и любая универсальная и компактная библиотека она имеет быстродействие, недостаточное для на- писания серьёзных динамических игр (типа "ELI- TE" или "НЛО"). Тем не мение её быстродействия с лихвой хватит, чтобы повторить большинство из существующих сейчас игр. Итак, что же входит в GrLib1.1: a) Математическая подбиблиотека: MULB2 HL*E->DE Умножение MULB L*E->DE флаг C-переполнение MUL HL*DE->DE DIVB E/L->E Деление DIVB2 DE/L->E D-остаток. При переполнении или делении на ноль E->D; 255->E б) Векторная графика: LINE - линия между (X1=E;Y1=D) и (X2=L;Y2=H) PLOT - вывод точки (X=E;Y=D) в) Печать символов: PRINT - вывод стоки символов: A - количество D - начальная координата по вертика- ли (в знакоместах). E - по горизонтали HL- адрес начала текста BC- адрес используемой таблицы сим- волов. SIMBOL - печать одного символа несколько раз A - количество повторений L - код символа BC и DE - как в PRINT STRLEN - найти длину строки до разделителя 0 или 13 HL - начало строки на выходе: A - количество символов в строке пример: LD HL,TEXT PUSH HL CALL STRLEN POP HL LD BC,#3C00;набор символов в ПЗУ LD DE,#0502 CALL PRINT RET TEXT DEFM "Hello, World" DEFB 0 г) Работа со спрайтами: для ниже приведенных процедур H - координата Y L - координата X B - ширина в знакоместах C - высота в знакоместах DE - адрес изображения в памяти - Вывод спрайтов X Y PUTSPR в пикселах в знакоместах PUTSCR в пикселах в пикселах PUTSIM в знакоместах в пикселах - Заполнение окна байтом из регистра А SIMBAR координаты X и Y в знакоместах - Сохранить изображение спрайта в памяти DE - адрес буфера для сохранения спрайта GETSIM координаты X и Y в знакоместах - Вывести атрибуты спрайта на экран PUTATR (параметры как и у PUTSIM) - Сохранть атрибуты спрайта в буфере с адреса регистра DE GETATR (параметры как и у GETSIM) - Заполнить окно атрибутами одного цвета из регистра A ATRBAR (параметры как у SIMBAR) д) Установить способ наложения примитивов Вызывается : LD A,<режим> CALL CHNGRG где <режим> имеет следующие мнемоники: * NOP_ - копирование OR_ - наложение по принцыпу "ИЛИ" XOR_ - по принцыпу "исключающее ИЛИ" * AND_ - по принцыпу "И" * INV_ - инверсия * - только для PRINT, PUTSIM, PUTSPR - Выбор экрана (SELSCR) Во всех своих играх я редко формирую изоб- ражения в основном экране: сначала я строю его в "теневом" экране, а затем быстро пересылаю его в основной. Теневой экран - какая-либо область в па- мяти длинной 6 Кбайт (6912 байт). GrLib накладывает ограничения, согласно которому адрес начала "теневого" экрана должен быть кратен #0800 (2048). Выбор экрана осуществляется так: LD A,<адрес экрана/256> CALL SELSCR Для вывода в обычный экран используйте: LD A,#40 CALL SELSCR Если не вызывать SELSCR, по умолчанию все процедуры выводят изображения в основной экран. Если не вызывать CHNGRG, по умолчанию уста- новлен режим OR_. Остальные процедуры являются вспомогатель- ными. GrLib 1.1 находится в играх "Танкодром" и "Буратино" (в "Буратино"- после декомпрессии с адреса 64640). Вы сможете сами посмотреть, как они используются в этих играх с помощью отлад- чика или теневого монитора. За три года эксплуатации я обнаружил только два недочёта: MULB, MULB2, MUL - не всегда правильно выставляют флаг переноса, поэтому, если вы за- хотите построить на их основе умножение 4-8 байтовых чисел, их надо будет изменить. PUTATR, GETATR - работают только с атрибута- ми основного экрана. До появления игр на 128K это не имело большого значения. В качестве практикума по программированию вы можете попы- таться самостоятельно устранить этот недочёт. Откомпилируйте и запустите GrDemo и вы полу- чите некоторое представление о GrLib 1.1. Всего хорошего, успехов в написании игр, дорогие коллеги ! ──══── От редакции SP: В приложении к журналу вы найдёте графичес- кую библиотеку и демонстрационную программу. Напоминаем вам о необходимости инициализации приложения для свободного доступа к файлам.
Другие статьи номера:
Похожие статьи:
В этот день... 3 декабря