DelphiX

Game programming

 

English

 Russian

 

Построение карт из тайлов .

Автор  Владимир Васильев

 Часть 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  Владимир Васильев . 
Никакая часть данной статьи, включая иллюстрации, ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения автора.

Site Navigator

home/news

статьи

support

e-mail

 



TopList

 

 

Hosted by uCoz