Этот пример взят из нашей игры "В ОСАДЕ", способ
хорош - быстрый и качественный. Немного о переменных
и числах: 150 - это размер миникарты в пикселах (у нас 150
на 150) rx и ry - ширина и высота карты (у нас обычно 80 на
80) Перейдем непосредственно к описанию:
procedure CreatemMap;
var
i,j: Integer;
NG: TDIB; //Это картинка в которую мы будем сохранять миникарту
Item: TPictureCollectionItem; //Тут будет хранится картинка в TdxImageList"е
tm:Tdirectdrawsurface; //Поверхность DxDraw
tm2:Tdirectdrawsurface; //Тоже
begin
ng:=tdib.Create; //Создаем компонент
tm:=Tdirectdrawsurface.Create(myform.DXDraw.Surface.DDraw); //Создаем поверхность
tm.SystemMemory:=false; //Это надо
tm.SetSize((150 div rx +1)*rx ,(150 div ry +1)*ry); //Устанавливаем размеры пропорциональные размерам карты
tm.Fill(0); //Заоиваем поверхность черным цветом
tm2:=Tdirectdrawsurface.Create(myform.DXDraw.Surface.DDraw); //Создаем вторую поверхность
tm2.SystemMemory:=false; //Надо
tm2.SetSize(150,150); //Устанавливаем сжатые размеры (Настоящий размер миникарты)
tm2.Fill(0); //Тоже заливаем черным
for i:=0 to rx-1 do //Далее отрисовываем всю карту
for j:=0 to ry-1 do //по частям в уменьшеном виде на первую поверхность
myform.il.Items.Find("west0").StretchDraw(tm,bounds((150 div rx+1)*i,(150 div ry+1)*j,150 div rx+1,150 div ry+1),map[i,j]);
//map - двухмерный массив содержащий номер картинки
tm.AssignTo(ng); //Сохраняем содержание поверхности в картинку
tm.Free; //Поверхность теперь нам не нужна и мы её удаляем
Item := TPictureCollectionItem.Create(MyForm.IL.Items); //Добавляем картинку в TDxImageList
Item.Name:="MMG"; //Её имя
Item.SystemMemory:=false; //Надо
Item.Picture.Graphic := ng; //Загружаем картинку в список
item.Transparent:=false; //Непрозрачна
Item.Restore; //Принимаем изменения
myform.il.Items.Find("mmg").StretchDraw(tm2,bounds(0,0,150,150),0); //Теперь рисуем(заодно и сжимаем) картинку в заданных размерах миникарты на вторую поверхность!
tm2.AssignTo(ng); //Опять сохраняем получившийся результат
tm2.Free; //Избавляемся от уже ненужной второй поверхности
Item.Name:="MMG"; //Исправляем то что нужно в TdxImageList"е
Item.SystemMemory:=false; //Исправляем то что нужно в TdxImageList"е
Item.Picture.Graphic := ng; //Исправляем то что нужно в TdxImageList"е
item.Transparent:=false; //Исправляем то что нужно в TdxImageList"е
Item.Restore; //Принимаем изменения
end;
Теперь во время игры
просто отрисовываем картинку под именем MMG в нужном месте, и
если надо то и точки(позиции юнитов на карте) на
ней.
Если Вас заинтересовала или понравилась информация по разработке на Delph - " Создание Миникарты к Стратегиям", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу: Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!