Читать «Виртуальная библиотека Delphi» онлайн - страница 50

Unknown

Кстати в тексте статьи я упоминал о том, что нам придется создать три таблицы 16×25. Я не оговорился. Дело в том, что у нас возможны три варианта, когда значения одной и той же ячейки в таблице должны быть разными:

1. Активная земля равняется прежней земле. Например, мы рисуем ТРАВОЙ, а в рассчитываемой ячейке тоже ТРАВА или ТРАВА с ЗЕМЛЕЙ.

2. Активная земля не равна прежней земле. Например, мы рисуем ТРАВОЙ, а в рассчитываемой ячейке ВОДА или ВОДА с ЗЕМЛЕЙ.

3. Рисуем переходным типом земли — ЗЕМЛЯ.

Если кому-нибудь еще что-то не понятно, то надеюсь после рассмотрения исходных текстов программы все встанет на свои места.

Пример написан на Delphi 3 Professional, с использованием компонент библиотеки DelphiX для DirectX 6.0

Модуль MapDat:

// Определение класса Matrix5

Type TMatrix5 = class(TObject)

private

 Matrix : array[0..4,0..4] of byte;

 Vector : array[0..24] of byte;

public

 function GetBaseIndex( ElementIndex : Integer ): Integer;

 Function GetAdditionalIndex( ElementIndex : Integer ): Integer;

 procedure Fill(X,Y : Integer);

 procedure Place(X,Y : Integer);

 procedure Culculate(X,Y : Integer; BrushIndex : Integer );

 procedure Draw(X,Y : Integer; BrushIndex : Integer );

end;

Внутри класса определены переменные в виде матрицы 5×5 и вектора. Некогда я думал, что это упростит написание программы, сейчас я думаю, что можно воспользоваться только вектором. Методы GetBaseIndex и GetAdditionalIndex мы уже рассматривали, рассмотрим остальные:

Метод Fill(x,y : Integer);

procedure TMatrix5.Fill(X,Y : Integer);

var i,j : Integer;

begin

 for j := 0 to 4 do

 for i := 0 to 4 do

  Matrix[i,j] := MainForm.GetElement(X – 2 + i,Y – 2 + j);

 for j :=0 to 4 do

 for i := 0 to 4 do

 Vector[j*5 + i] := Matrix[i,j];

end;

Заполняет матрицу и вектор 25-ю элементами карты. Х,Y — указывает на центральный элемент.

Метод Place(x,y : Integer);

procedure TMatrix5.Place(X,Y : Integer);

var i,j : Integer;

begin

 for j := 0 to 4 do

 for i := 0 to 4 do

  Matrix[i,j] := Vector[j*5 + i];

 for j := 0 to 4 do

 for i := 0 to 4 do

  MainForm.PutElement(X – 2 + i,Y – 2 + j, Matrix[i,j] );

end;

Выполняет процедуру обратную методу Fill. То есть кладет матрицу 5х5 на карту.

Метод Draw(x,y : Integer; BrushIndex : Integer);

procedure TMatrix5.Draw(X,Y : Integer; BrushIndex : Integer);

begin

 Self.Culculate(X,Y,BrushIndex);

 Self.Place(X,Y);

end;

Выполняет методы Culculate, а затем Place. X,Y — указывают центральный элемент в матрице 5×5, BrushIndex — индекс активной земли. (0-вода,1-трава,2-камни,3– переходный тип — земля).