Читать «Виртуальная библиотека Delphi» онлайн - страница 53
Unknown
// и прежний номер переходной текстуры
AdditionalIndex := GetAdditionalIndex(Vector[i]);
// Если число в таблице BasicTable не равно 16 то,
// к индексу типа земли умноженному на 16
// прибавляем новое смещение
// и заносим в Vector
// ,иначе ничего не меняется
if BasicTable[i,AdditionalIndex] <> 16 then Vector[i] := BaseIndex*16 + BasicTable[i,AdditionalIndex];
end;
end { Конец обработки варианта "Переходная земля"}
else // Иначе, если рисуем не переходной землей
begin
Vector[12] := BrushIndex*16;// Заносим центральный элемент
for i := 0 to 24 do
begin // Получить тип земли в виде индекса(0,1,2)
BaseIndex := GetBaseIndex(Vector[i]);
// и прежний номер переходной текстуры
AdditionalIndex := GetAdditionalIndex(Vector[i]);
// Если прежняя земля имеет тот же тип, что и активная
if BaseIndex = BrushIndex then begin
// Если число в таблице EqualTable не равно 16 то,
// к индексу типа земли умноженному на 16
// прибавляем новое смещение
// и заносим в Vector
// ,иначе ничего не меняется
if EqualTable[i,AdditionalIndex] <> 16 then Vector[i] := BaseIndex*16 + EqualTable[i,AdditionalIndex];
end
else // Если заменяемая и замещающая земля имеют разные типы
begin // Если число в таблице NotEqualTable не равно 16 то,
// к индексу типа земли умноженному на 16
// прибавляем новое смещение
// и заносим в Vector
// ,иначе ничего не меняется
if NotEqualTable[i,AdditionalIndex] < 16 then Vector[i] := BaseIndex*16 + NotEqualTable[i,AdditionalIndex]
else if NotEqualTable[i,AdditionalIndex] > 16 then Vector[i] := BrushIndex*16+ NotEqualTable[i,AdditionalIndex] - 16;
end;
end;
end;
end;
Разберем все по полочкам: Первая строчка Self.Fill(X,Y); заполняет матрицу 5х5 значениями считанными с карты. Дальше следует такой кусок кода:
if BrushIndex = 3 then begin
Vector[12] := 15;
for i := 0 to 24 do begin
BaseIndex := GetBaseIndex(Vector[i]);
AdditionalIndex := GetAdditionalIndex(Vector[i]);
if BasicTable[i,AdditionalIndex] 16 then Vector[i] := BaseIndex*16 + BasicTable[i,AdditionalIndex];
end;
end
В нем мы рассчитываем случай, когда рисуем переходным типом земли — ЗЕМЛЯ (if BrushIndex = 3 then). Строка Vector[12] := 15; заносит в центральный элемент №12 цельную текстуру активной земли, для нашего случая это могут быть числа 15,31,47. Как мы помним именно под этими номерами в нашем ImageListe находятся цельные текстуры ЗЕМЛИ. Далее в цикле, для каждого элемента взятого с карты и положенного в матрицу ( в данном виде – в вектор, для упрощения организации цикла) получаем индекс типа земли (BaseIndex := GetBaseIndex(Vector[i]);), получаем номер переходной текстуры (AdditionalIndex := GetAdditionalIndex(Vector[i]);), и лезем в соответствующую таблицу (входные параметры которой это номер ячейки i и номер переходной текстуры AdditionalIndex). Если на выходе получим число 16, то ничего не меняем, если другое число, то индекс типа земли умножаем на 16 – это номер цельной текстуры данного типа земли, и прибавляем число полученное из таблицы — это новый номер переходной текстуры.