Алгоритм движка игры ZXOOM Автор - Andrew771 1996-2011 -------------------------- Лабиринт обязательно должен иметь 128 клеток по горизонтали. По вертикали любое. 1. Цикл по клеткам лабиринта, находящихся рядом с клеткой игрока. Смещения до нужных клеток заданы в таблице. Начинаем с ближних клеток и заканчиваем дальними (т.е. получается 7 уровней в глубину, на каждом уровне разное количество клеток). 2. Определяем элемент в текущей клетке. 3. По таблице, в зависимости от элемента клетки, определяем адрес спрайта, процедуру его вывода (1/4, 2/4, 3/4 или 4/4) и координаты спрайта на экране (на самом деле, в таблице хранится только горизонтальная координата, т.к. вертикальная всегда равна нулю). 3а. При этом в 1/4 спрайт будет выводиться как есть, в 2/4 - зеркально отраженным, в 3/4 - перевернутым, в 4/4 - перевернутым и зеркально отраженным. Спрайты, которые не симметричны, будут выводиться процедурой 1/4. Процедуры обозначают только способ вывода, а координаты вывода могут быть любыми, т.е. например 2/4 означает не то, что спрайт выводится только в 2/4 экрана, а то, что в любую координату экрана зеркально отраженным. 3б. В спрайтах хранятся для каждого знакоместа горизонтальная и вертикальная координаты, параметр занятости знакоместа ("краевой параметр") и 8 байтов изображения. Краевой параметр может иметь значения: - знакоместо полностью перекрывает всё, что за ним; - знакоместо на левом краю спрайта, поэтому знакоместо другого спрайта, если попадет под это знакоместо, должно будет выводиться с правой маской; - знакоместо на правом краю спрайта, поэтому знакоместо другого спрайта, если попадет под это знакоместо, должно будет выводиться с левой маской. 4. Выводим спрайт соответствующей процедурой 1/4, 2/4, 3/4 или 4/4 на виртуальный экран. 4а. В каждой процедуре есть 3 блока вывода: - вывод знакоместа непосредственно без маски; - вывод знакоместа с левой маской; - вывод знакоместа с правой маской. 4б. При выводе каждого знакоместа спрайта сначала проверяется хранящийся в байте атрибутов на виртуальном экране занесенный ранее другим спрайтом краевой параметр, в зависимости от этого процедура переходит на нужный блок вывода: - если краевой параметр равен "знакоместо перекрывает всё, что за ним", то вывод данного знакоместа вообще не осуществляется, сразу переходим на следующее; - если краевой параметр равен "знакоместо пустое" (т.е. еще сюда ничего не выводили), то выводим знакоместо спрайта без маски; - если краевой параметр равен "знакоместо на левом краю спрайта", то подсовываем знакоместо спрайта под изображение на экране, затем накладываем правую маску для этого изображения, затем возвращаем сверху изображение на место; - если краевой параметр равен "знакоместо на правом краю спрайта", то подсовываем знакоместо спрайта под изображение на экране, затем накладываем левую маску для этого изображения, затем возвращаем сверху изображение на место. 4в. В байт атрибутов заносятся, помимо цвета, краевой параметр текущего выводимого спрайта в биты flash и bright. 5. После завершения обхода всех выводимых клеток, копируем виртуальный экран на реальный. При этом в атрибутах сбрасываем биты flash и bright.