Создание миникарты к стратегиям

Этот пример взят из нашей игры "В ОСАДЕ", способ хорош - быстрый и качественный.
Немного о переменных и числах:
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 в нужном месте, и если надо то и точки(позиции юнитов на карте) на ней.

Вот в принципе и всё.
Теги:
миникарта
Добавлено: 30 Июля 2018 19:56:08 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...