Четверг, 28 Марта 2024, 15:26

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » изометрия
изометрия
DeswingДата: Суббота, 23 Февраля 2013, 16:09 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
А как создается изометрическая карта? Если в теории? Интересует техническая часть
nazar79Дата: Суббота, 23 Февраля 2013, 16:24 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
ето 2Д.вродебы камера ставитса под кутом 45 градусов.
TimKruzДата: Суббота, 23 Февраля 2013, 21:04 | Сообщение # 3
старожил
Сейчас нет на сайте
Цитата (Deswing)
Интересует техническая часть

Ну каждая клетка - это прямоугольник, только со срезанными прозрачностью краями так, что получается ромб/параллелограмм/шестиугольник. Все клетки рисуются на экране так же, как и в проекции спереди-сверху (где клетки представляют собой простые квадраты/прямоугольники), только в каждом ряду каждая следующая клетка смещается на n пикселей вверх или вниз так, чтобы верхняя и нижняя наклонные грани совместились.
То есть, если в обычной прямоугольной карте клетки рисуются так:
Код
for x:=0 to map_x do
   for y:=0 to map_y do
     DrawElement(map[x,y],x*w,y*h); //w и h - ширина и высота картинки.
//То есть DrawElement рисует картинку, соответствующую типу клетки,
//хранящейся в двумерном массиве map, по заданным координатам.
//А вложенные циклы for полностью перебирают массив map.

А в "наклонной" прямоугольной карте получится как-то так:
Код
for x:=0 to map_x do
   for y:=0 to map_y do
     DrawElement(map[x,y],x*w,y*h+x*m); //w и h - ширина и высота, но не картинки,
//а m - величина отступа от оси Ox каждой клетки в ряду.

Например, если m=20, w=40, h=30, то map[0,0] будет в точке (0,0), map[1,0] - в точке (40,20), при этом между map[1,0] и верхним краем экрана будет пустота в 20 пикселей; ну и так далее: map[0,1] - (0,30), map[1,1] - (40,50).
Значения m, w и h зависят от параметров изометрического рисунка. Кроме того, процедура DrawElement должна рисовать с прозрачностью, т.е. уголки будут сами по себе срезаться, если в картинке они обозначены "прозрачным цветом".
Все остальные объекты рисуются как обычно, по такой же формуле, с привязкой к одной из клеток.
"Физика", т.е. столкновения персонажей с более высокими объектами типа деревьев и домов обрабатываются просто в массиве карты и списке объектов так, как если бы карта была обычной прямоугольной - ведь все объекты занимают ровно N клеток (и легко определить, к каким именно, или задать эти клетки заблокированными ещё при редактировании карты), а координаты игрока относительно клеток в массиве легко определяются по той же формуле, так что мы можем просто сравнивать клетки (или относительные размеры клеток и персонажа, если персонаж ходит не строго по клеткам).

Можно ещё рисовать после поворота системы координат как, например, в OpenGL (процедура glRotate) или DirectX. Но я не уверен, что получится красивая графика, особенно, если используется стиль пиксель-арта, потому что тогда всё будет сглаживаться... wacko




Сообщение отредактировал TimKruz - Воскресенье, 24 Февраля 2013, 17:06
DeswingДата: Воскресенье, 24 Февраля 2013, 00:19 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Цитата (TimKruz)
Ну каждая клетка - это прямоугольник, только со срезанными прозрачностью краями так,

то есть нужно "посматривать" на диагонали этих прямоугольников? Прямоугольники-то без пробелм нарисую... Или я только что сказал ужаснейший бред?
TimKruz, извините, эм... я не очень разобрался в коде. Не учил этот ЯП. Цикл for узнал, но где его начало, а где конец - нет sad Совсем ещё новичок
TimKruzДата: Воскресенье, 24 Февраля 2013, 17:12 | Сообщение # 5
старожил
Сейчас нет на сайте
Цитата (Deswing)
то есть нужно "посматривать" на диагонали этих прямоугольников? Прямоугольники-то без пробелм нарисую... Или я только что сказал ужаснейший бред?

Ну вот, например, картинка одной клетки поля:

Розовые уголки считаются прозрачными и не рисуются (можно делать вручную в любом формате или использовать формат типа png/tga с альфа-каналом), иначе они будут наезжать на остальные клетки. Зелёная область в чёрной рамке - это, собственно, клетка (ну, допустим, в этой рамке нарисована трава), которая будет отображаться на экране. В итоге мы получаем прямоугольную картинку, у которой уголки не будут рисоваться, потому что они содержат особый "прозрачный" цвет.
Если рисовать без прозрачности - получится, что картинки наезжают друг на друга, а с прозрачностью всё выглядит нормально.
Цитата (Deswing)
TimKruz, извините, эм... я не очень разобрался в коде. Не учил этот ЯП. Цикл for узнал, но где его начало, а где конец - нет sad Совсем ещё новичок

Ну... Так:
Код
Для счётчика x от 0 до map_x делать
начало
   Для счётчика y от 0 до map_y делать
   начало
     Вызвать процедуру DrawElement(map[x,y],x*w,y*h+x*m);
   конец
конец

Переменные или константы map_x и map_y - это размеры двумерного массива map.
Процедуру DrawElement сам напишешь, её действия зависят от графического движка.


nilremДата: Воскресенье, 24 Февраля 2013, 18:24 | Сообщение # 6
Просветленный разум
Сейчас нет на сайте
Для знающих английский есть книга Isometric game programmin, для незнающих лучше всего изометрия описана в книге Секреты разработки игр на флеш.

Windmill 2

WindMill 2D Game Engine
Форум игроделов » Программирование » Общие обсуждения программистов » изометрия
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг