Технология спрайтов - часть 3: форматы спрайтов.

ZX Forum #04

      ТАКИЕ РАЗНЫЕ СПРАЙТЫ

   Настал момент  разобраться  с
форматами спрайтов  и  способами
их хранения. Мы с Вами  большин-
ство спрайтов нашли  при  помощи
поиска спрайтов  и  лишь  один -
при помощи поиска  символов.  Из
чего  можно  сделать вывод - не-
символьный формат хранения  удо-
бней, нежели  символьный.  Чтобы
понять, в  чем  их различия, да-
вайте взглянем на формат, в  ко-
тором они хранятся в памяти. Для 
примера возьмем спрайт  размером
в 2 знакоместа в длину и 1 в вы-
соту:

       ┌─ 1 байт ─┬─ 2 байт ─┐   ┌─ 1 байт ─┬─ 9 байт ─┐
       ├─ 3 байт ─┼─ 4 байт ─┤   ├─ 2 байт ─┼─10 байт ─┤
       ├─ 5 байт ─┼─ 6 байт ─┤   ├─ 3 байт ─┼─11 байт ─┤
       ├─ 7 байт ─┼─ 8 байт ─┤   ├─ 4 байт ─┼─12 байт ─┤
       ├─ 9 байт ─┼─10 байт ─┤   ├─ 5 байт ─┼─13 байт ─┤
       ├─11 байт ─┼─12 байт ─┤   ├─ 6 байт ─┼─14 байт ─┤
       ├─13 байт ─┼─14 байт ─┤   ├─ 7 байт ─┼─15 байт ─┤
       └─15 байт ─┴─16 байт ─┘   └─ 8 байт ─┴─16 байт ─┘

             несимвольный               символьный

   Если Вы внимательно  взгляне-
те на  рисунок, то  увидите, что
символьный спрайт хранится в па-
мяти  как  шрифт  компьютера, то
есть в виде набора символов, ко-
торые печатаются на экран в  оп-
ределенной   последовательности.
Такие  спрайты  возможно   печа-
тать простым оператором  бейсика
PRINT, если перед этим указать в
переменной, которая  хранит  ад-
рес шрифта, адрес нашего  спрай-
та минус 256  байт.  В  машинных
кодах можно воспользоваться  ко-
мандой RST #10. Основную  работу
по печати спрайтов мы переклады-
ваем на ПЗУ компьютера  и, каза-
лось бы, это и хорошо. Но  такие
спраты крайне медленно печатают-
ся на экран, и если в Вашей про-
грамме много  ДВИЖУЩИХСЯ  объек-
тов, медлительность станет очень  
заметна.  Такой  формат подходит 
для печати статических или мало-

подвижных  спрайтов, как, напри-
мер, в программе KRAKOUT. В жур-
налах мы могли видеть и отличные  
от используемых в ПЗУ  принципов  
печати, которые работают во мно-
го раз быстрее, но все же недос-
таточно быстро.
   Что   касается  несимвольного
формата спрайтов, то  здесь  Вам
ПЗУ не поможет, и программу  для
печати  Вам  придется  создавать
самим, но этот  способ  хранения
спрайтов обеспечивает  оптималь-
ную по скорости печать.
   Существует еще один  символь-
ный  формат  хранения  спрайтов,
который  еще  более  медлителен,
чем  предыдущий.  Я бы  не  стал
на нем  останавливаться, но этот
формат пропагандируют в  "ZX Ре-
вю"  (отдельные корреспонденты),
а также  в  интереснейшей  книге
фирмы "Питер" "Как написать игру 
на ассемблере".
   Давайте рассмотрим этот  фор-
мат.
   Метод основан на том, что пу-
стые знакоместа (где виден  пун-
ктир) пропускаются и  в  спрайте
не  сохраняются.  Это  сохраняет 
несколько байтов, но привносит в
процедуру печати сложность  в ее
организации,  а  также  трудоем-
кость в описание спрайта. Посмо-
трите, каким образом он хранится 
в памяти:

ЗАГОЛОВОК:

DATA 26  (количество знакомест в
         спрайте).
DATA     0,0,7,0,1,7,0,4,7,0,5,7
         (первый ряд знакомест)
DATA     1,0,7,1,1,7,1,2,7,1,3,7
         и так далее.

ДАННЫЕ.

   Далее идут данные знакомест в
виде шрифта.

   На описание каждого знакомес-
та, помимо его данных, отводится
еще 3 байта:  первый - координа-
та Y, которая  отсчитывается  от
левого верхнего угла окна;  вто-
рой - координата X, которая  от-
считывается также от левого вер-
хнего  угла;  и  третий  байт  -
атрибуты  (ink,  paper,  bright, 
flash в одном). В  нашем  случае
пустыми остаются 4 знакоместа, а
спрайт  занимает  в  памяти  287
байтов, тогда  как  если  бы  мы
сохранили его в  форме    несим-
вольного спрайта, он занимал  бы
240 (хотя мы и не экономили пус-
тые знакоместа)  байтов.  Отсюда
вывод:  экономии  можно  достиг-
нуть лишь при  большом  количес-
тве пустых знакомест, что встре-
чается крайне редко, а вот  про-
цедура печати сильно  усложняет-
ся.
   Возможно, есть еще какие-либо
форматы спрайтов, но мне они  не
встречались, и  мы  переходим  к
рассмотрению масок.