RussianDelphiProgrammingAlliance

Главная | О проекте | Новости | Статьи | Проекты | Исходники | Файлы | ЧаВо | Ссылки

Изометрическая карта

Я начну немного издалека, то есть с самого начала :)
Вообще, я никогда не интересовался изометрическими картами...

Однажды некто ССА из группы программистов ZilotsZone, куда и я тоже вхожу, написал MapEngine - изометрическую карту. Он всем говорил, что это великая разработка, и на ее основе можно написать практически любую стратегическую игру. Когда же я показал ему свою демку WarIII, ССА обозвал ее обидным словом "мышко-тыкалка" :( Я обиделся, и спросил, почему он так считает. ССА ответил: "тут все просто, а вот быстрая косоугольная карта - это значительно труднее, чем кажется!" По его словам, трудности в этом такие:
(1) Tiling - обеспечить правильное накладывание спрайтов довольно трудно
(2) Определение, в какую клетку кликнул юзер
(2.5) Определение, в какой спрайт кликнул юзер
Интересно, подумал я, чего же здесь трудного???
Как раз в это время я просматривал GPMega, и нашел там статью "Isometric 'n' Hexagonal Maps" - то есть про изометрические и хексагональные карты. Когда я ее прочитал, мне стало просто жалко бедных буржуинов, которые учились не в наших вузах, а в своих колледжах... :))) Некто TANSTAAFL предлагает использовать для рисования тайлов и проверки мыши маску с ромбом, подробности можете сами прямо там прочитать, если интересно. Ну, для хексагональной карты это может и оправдано, но не для изометрической! Ячейка изометрической карты - ромб - просто "сплюснутый" квадрат, и тут само собой напрашивается использование линейных операторов! С их помощью можно легко переходить от прямоугольной системы координат (экран) к ромбической (карта). Я не буду здесь объяснять, что такое линейный оператор и как получать матрицу для преобразования ортов, это все проходят на 1-2 курсе любого технического вуза по линейной алгебре.
Итак, у нас есть изометрическая (ромбическая) карта, все ее ячейки - ромбы и составляют большой ромб, например 10 на 10. Пусть ось А направлена вправо и вниз, а ось В - влево и вниз, тогда ромбические координаты (А,В) верхнего угла - (0,0), правого - (9,0), левого - (0,9) и нижнего - (9,9). Переход от (А,В) к прямоугольным координатам (X,Y) и обратно от (X,Y) к (А,В) осуществляется по следующим формулам:
x=a-b
y=a/2+b/2
a=(2*y+x)/2
b=(2*y-x)/2
Таким образом вычисляются экранные координаты для вывода тайлов и изометрические координаты, на которые указывает мышь! А тайлы имеет смысл делать не прямоугольные, как всегда, а сразу ромбом! Конечно придется сначала написать программу-конвертор, но зато в результате обойдемся без масок! Ну а спрайты - они и в Африке спрайты :) - прямоугольники с прозрачным цветом...
Примерная процедура вывода ромбического тайла:
for y:=0 to 9 do
 for x:=0 to y*4+1 do begin
  screen(x0-y*2,y0+y):=tile(i); inc(i) end;
for y:=9 downto 0 do
 for x:=0 to y*4+1 do begin
  screen(x0-y*2,y0+y):=tile(i); inc(i) end;
Вывод происходит в 2 этапа - сначала верхняя треугольная часть, потом нижняя...

Перечисленные материалы можно найти на сайтах:
GPMega - Game Programming MegaSite
DXL - ZilotsZone DirectX Legion
TERMINAL Studio page

Перечисленные программы можно скачать прямо здесь:
MapEngine - 126 Kb - by CCA
WarIII - 28 Kb - by Anatoly
isometr.exe - simple isometric map demo - 2 Kb - by Anatoly

Исходный документ находится на Anatoly's Homepage

Последнее обновление - 20 декабря 1998

Чужая реклама: