Вторник, 30.04.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нужен форум на сайте?
Всего ответов: 90
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Графика » Игры

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

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

Вот в принципе и всё.

Получить ссылку на материал

Категория: Игры | Добавил: Барон (08.12.2011)
Просмотров: 941 | Теги: стратегия, миникарта | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
DirectX [17]
OpenGL [2]
Игры [15]
Разные [28]
Королевство Delphi © 2010-2024
Яндекс цитирования