Построение
карт из тайлов.
Автор
Владимир
Васильев
Часть
2.
Введение.
Основная
идея, используемая при построении
карты, следующая:
допустим, что карта уже правильно
построена и нам необходимо только
заменить в выбранной ячейке карты
один тип поверхности на другой.
На самом деле, на этом
месте вторая часть статьи может
быть и закончена, т.к. далее
необходимо только аккуратно
рассмотреть все частные случаи такой
замены. В качестве примера,
рассмотрим один из вариантов.
Рисование
старшим типом по младшему.(Hi
to Low)
Для
начала рассмотрим случай, когда
новый и старый тип поверхности
принадлежат одному набору и новый
тип поверхности является старшим
типом . В рассматриваемом
примере старый тип поверхности -
ЗЕМЛЯ , новый - ТРАВА и оба типа
принадлежат к одному и тому же Набору2:
ЗЕМЛЯ -ТРАВА и ТРАВА является старшим
типом по отношению к ЗЕМЛЕ. (согласно
принятым в первой части статьи
обозначениям и названиям).
рис.1 |
рис.2 |
рис.3 |
|
При таком типе
замены выделенного на рисунке тайла
- далее будем называть его центральным
- потребуется дополнительно
заменить только восемь его
ближайших соседей. Дальние
соседи при этом не изменяются.
Процесс
вычисления новых битовых
представлений для ближайших
соседей состоит из двух этапов и
реализован в редакторе в procedure
DoMain1x1.
На первом этапе
битовое представление для
каждого тайла обнуляется а затем известные
(в том смысле, что для этих битов
точно известно значение) биты
устанавливаются в нужное
значение. Для нового
центрального тайла битовое
представление - 1111111.
Поскольку ближайшие соседи на
границах должны быть согласованы
с центральным тайлом то получим
следующие известные значения
битов.
Номер
соседа |
Битовые
маски |
рис.4 |
Hi bit -
вершины
7654 |
Low bit -
стороны
3210 |
0 |
0110 |
0100 |
|
1 |
1100 |
1000 |
2 |
1001 |
0001 |
3 |
0011 |
0010 |
4 |
0100 |
0000 |
5 |
1000 |
0000 |
6 |
0001 |
0000 |
7 |
0010 |
0000 |
Значения
битовых масок хранятся в MaskArr1.
|
FTileMap[ny,nx].SetN:=AMapBrush;//
i.e. = cSetN;
TileBits:=0;//очищаем все биты
TileBits:=TileBits or MaskArr1[i];// drawing by Bit=1 |
Можно сказать,
что в этом случае (Hi to Low) мы
"рисуем единицами".
На втором этапе
нужно получить недостающие
значения битов. Для этого
проходим по только что
вычисленным ближайшим соседям
ещё раз и для каждого из них
проводим процедуру согласования
(в редакторе - это procedure
CheckNeighbours(nx,ny) ) сторон и вершин для
текущего тайла уже с его
ближайшими соседями.
рис.5
Если же мы рисуем МЛАДШИМ типом по СТАРШЕМУ из одного НАБОРА,
то нужно, соответственно,
"рисовать нулями":
|
if
AMapBrush-SetN=-1 then
begin
TileBits:=FTileMap[ny,nx].TileBits;//get the value
//combine it with the mask - drawing by Bit=0
TileBits:=TileBits and MaskArr0[i];
end; |
Если новый и старый тип поверхности
принадлежат разным наборам, то мы
уменьшаем (увеличиваем) номер
кисти и отрисовываем
центральную ячейку и ближайших
соседей промежуточными типами
земли. (в редакторе - это procedure
Do1x1(cnx,cny : Longint; const AMapBrush : byte )
Процедура корректирует
кисть - MapBrush и рекурсивно вызывает себя
пока мы не получим описанный в
начале статьи случай тогда исполнение
переходит в DoMain1x1(cnx,cny,AMapBrush);
Я увеличил
количество пояснений в коде
редактора и надеюсь, что Вы во
всём сможете разобраться. Если
нет - напишите мне и я более
подробно расскажу о трудных, с
вашей точки зрения, местах.
Copyright ©
2001 Владимир Васильев .
Никакая
часть данной статьи, включая
иллюстрации, ни в каких целях не
может быть воспроизведена в какой
бы то ни было форме и какими бы то
ни было средствами без
письменного разрешения автора.
|