Я начну немного издалека, то есть с самого начала :) Вообще, я никогда не интересовался изометрическими картами... Однажды некто ССА из группы программистов 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 |