Технология спрайтов - часть 5: структура спрайтовых блоков (как уживаются в памяти спрайт и маска, какие данные помогают нам оперативно находить адрес спрайта в памяти и многое другое.)

ZX Forum #04

   СТРУКТУРА СПРАЙТОВЫХ БЛОКОВ

   Это, пожалуй, одна  из  самых
объемных  и  запутанных   частей
данного повествования. В  ней  я
расскажу о том, как уживаются  в
памяти  спрайт  и  маска,  какие
данные помогают  нам  оперативно
находить адрес спрайта в  памяти
и многое другое.
   Наконец-то я затрону в  своем
рассказе остальные найденные на-
ми спрайты. Посмотрите  на  них,
они  не  случайно  имеют  разный
вид. Такое на первый взгляд  не-
значительное обстоятельство, как
маска, находящаяся с разных сто-
рон от спрайта, вовсе не являет-
ся незначительным. Именно от  ее
расположения относительно спрай-
та   зависит   скорость   печати
спрайта, а также  внешний вид  и
играбельность программы.
   Давайте посмотрим  на  спрайт
из игры 3D BATMAN.  Здесь  маска
и  спрайт  являются   отдельными
спрайтами и печатаются по очере-
ди - это довольно обычный способ
хранения спрайтов, но печать та-
кого спрайта занимает много вре-
мени  (разумеется,  это  понятие
относительно, и все  зависит  от
таланта программиста). Следующий
спрайт  из  программы  ELEFANT-1
интересен уже тем, что тут  нес-
колько  непонятно, что  же, соб-
ственно, на нем изображено.  Ну,
а если попробовать  и  соединить
между  собой,  точнее, поставить
по порядку  без пробелов, знако-
места 1, 3, 5, а рядом с ними 2, 
4, 6. Не правда  ли, теперь  все 
понятно и даже красиво.
   Это еще один способ  хранения
в памяти  маски  и  спрайта, ко-
торый, на  мой  взгляд, наиболее
удачен, и при печати  затрачива-
ет очень мало времени.  Это, так
скажем, шахматный способ  хране-
ния  спрайта,  когда  чередуются
байт маски и байт спрайта.
   Программа  JAK  THE  NIPPER-2
предлагает нам еще  один  способ
хранения спрайтов, когда маска и
спрайт  являются  одним  большим
спрайтом. В данном случае  прог-
рамма печати  работает  довольно
быстро, хотя и уступает предыду-
щему способу.
   О символьном формате  я  рас-
сказывать не буду, поскольку  об
этом много написано.  Вы  можете
прочитать о этом формате в  жур-
налах  "ZX-Ревю" или книге  "Как
написать  игру  на   ассемблере"
фирмы "Питер". Там же вы  найде-
те программы  для  печати  таких
спрайтов.
   Теперь  о  том, какие  данные
призваны помочь нам в работе  со
спрайтами.
   Я могу выделить два  типа не-
символьных блоков спрайтов  (да-
лее я буду говорить только о не-
символьных спрайтах, поэтому бу-
ду использовать слово спрайты) -
это блоки, состоящие из спрайтов
одинакового  размера,  и  второй
тип - блоки  разнородных  спрай-
тов. В первом случае заголовок у
спрайтов минимален - это  2 бай-
та - длина и высота  спрайтов, а
также 2 байта  (часто достаточно
1) - длина одного спрайта в бай-
тах.  Этих  данных   достаточно,
чтобы  быстро  находить   нужный
спрайт в  памяти и так же быстро 
их печатать.
   Со вторым типом блоков  слож-
нее,  тут  четырьмя  байтами  на
весь блок не отделаться. В  этом
случае существует  два  способа:
1) перед блоком спрайтов состав-
ляется таблица, в которой каждо-
му спрайту отводится 4 байта - 2
байта длина и высота  спрайта  и
еще 2 байта -  адрес  спрайта  в
памяти. Вместо конкретного адре-
са иногда указывают смещение  до
спрайта, в этом  случае  спрайты
можно перемещать в  памяти.  Та-
кой тип таблицы давайте  назовем
отдельным; 2) второй тип  табли-
цы можно назвать сквозным. Здесь
нет отдельной таблицы, но  перед
каждым спрайтом ставят все те же
4 байта с небольшой разницей:  2
байта - длина и  высота  спрайта
(этого) и 2 байта - адрес/смеще-
ние до СЛЕДУЮЩЕГО спрайта.
   Поскольку  отдельная  таблица
была описана  первой, о  ней  мы
сначала  и  поговорим.  Подобный
формат  заголовка  самый   опти-
мальный,  так  как  обеспечивает
самый быстрый доступ к  спрайту,
тогда как второй способ  требует
специальной программы для  опре-
деления местоположения спрайта в
памяти. Надо отметить  еще  один
момент -  при  прямой  адресации
(когда указан  конкретный  адрес
спрайта) перемещение спрайтов  в
памяти становится невозможным, а
заголовок блока спрайтов  допол-
няется еще 2 байтами (для  всего
блока), которые  сообщают  адрес
фиксации, то  есть  относительно
какого адреса  были  фиксированы
спрайты.
   В некоторых играх спрайты  не
одноцветные, а  цветные, поэтому
помимо маски  и  спрайта  к  ним
присоединяются еще и данные  ат-
рибутов. Атрибуты хранятся в том
же  формате, что  и  спрайты, но
здесь есть  один  момент  -  для
маски атрибуты НЕ НУЖНЫ, обрати-
те  на  это  внимание, чтобы  не
расходовать лишнюю память.
   Еще одна рекомендация - высо-
ту спрайта лучше всего сразу за-
давать в пикселях, дабы при  пе-
чати не тратить на  ее  вычисле-
ние время.
   После рассмотрения  всех  ос-
новных вопросов, касаемых форма-
тов спрайтов, мы переходим к ча-
сти  практической  и  рассмотрим
различные    процедуры    печати
спрайтов.