После долгих попыток сделать процедуру генерирования игровых 2д карт универсальной, я ее таки довел до ума. Итак для начала обьявляем процедуру таким образом:
Procedure GenerateMap(xKarti,yKarti,MinTekstur,MaksTekstur:integer; var Yacheyka:array of integer);
Слово var является обязательным. Если его не написать то наш массив для карты будет заполняться внутри процедуры, а за ее пределами оставаться пустым.
Далее вставляем код, непосредственно самой процедуры.
Procedure GenerateMap(xKarti,yKarti,MinTekstur,MaksTekstur:integer; var Yacheyka: array of integer); var i:integer; begin randomize; for i:=0 to xKarti*yKarti-1 do Yacheyka[i]:=random(MaksTekstur)+MinTekstur; end;
Как мы видим внутри процедуры генерируется число текстуры или обьекта в заданном диапазоне и присваивается определенной ячейке игровой карты. Если ваша игровая карта состоит из нескольких слоев (что скорее всего), то эту процедуру нужно повторить для всех необходимых массивов карты. В моем случае массив одномерный, а затем на выходе будет обрабатываться как двумерный. Таким же образом можно хранить данные со строками и т.д.
Рассмотрим параметры процедуры: xKarti - ширина карты в клеточках yKarti - высота карты в клеточках MinTekstur - минимальный номер текстуры или бьекта MaksTekstur - максимальный номер текстуры или обьекта Yacheyka - заполняемый массив.
Теперь рассмотрим примеры использования готовой процедуры: 1. GenerateMap(33,22,1,10,map.textures); 2. GenerateMap(33,22,1,10,massiv);
Массиві должні быть обьявлены заранее. Можно использовать как статические так и динамические массивы. При использовании динамических массивов, нужно перед использование процедуры задать размер заполняемого массива.
И в итоге пример отображения текстур на графическом буфере:
procedure MapDraw(xKarti,yKarti,xTile,yTile:integer; buf:Tbitmap); var i,x,y:integer; begin x:=0; y:=0; //prorisovka tekstur for i:=0 to xKarti*yKarti-1 do begin if i>0 then x:=i mod xKarti; if (x=0) and (i>0) then y:=y+1; buf.Canvas.Draw(x*xTile,y*yTile,Pic.Textures[ map.textures[i] ]); end; end;
Не забудьте итоговый буфер на чем-то прорисовать.
На этом все. Дерзайте!
|