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