Изометрия
В общем нарисовал я статическую изометрическую карту. Дело дошло до перемещаемых объектов и я застрял.
Поделитесь мнением, как правильно отрисовывать карту с динамически перемещаемыми объектами. Простой способ по матрице походу уже не подходит... наверное надо как-то все видимые тайлы сортировать по глубине? |
Ответ: Изометрия
насколько мне помнится, самый простой способ сортировки в изометрии это по вертикальной экранной оси. объект ниже всегда перекрывает объект выше (такова изометрия), я делал так, вроде всё ок работало.
|
Ответ: Изометрия
А относительно каких точек сравнивать положения объектов?
Мой первый тест - выделение от курсора двигается на 1 клетку, на 0,5 смещаются координаты на другую клетку и она проявляется. http://shgames.ru/unity/marbels/ В идеале я хочу иметь возможность создания карт по сложности похожих на OTTD http://open.ttdrussia.net/ но это мечта, для начала хватит простых возможностей. |
Ответ: Изометрия
Цитата:
а вообще чего бы тебе не рендерить честное 3д с з-буффером в изометрии? может на землю юзать 3д, а шарики обычными спрайтами, ориентированными на камеру? |
Ответ: Изометрия
Так оно проще, но это не путь самурая) Если не смогу решить в ближайшие дни эту проблему, то может так и поступлю, но не хотелось бы.
|
Ответ: Изометрия
Вложений: 1
Цитата:
Будем считать, что А<B если B загораживает A и его надо рисовать позже. Объекты прямоугольные, ситуации типа (А>B и B>C и C>A) невозможны. Т.е., можно придумать такой порядок рисования, при котором все объекты будут правильно друг друга перекрывать. На картинке мы пробегаемся по столбцам и получаем информацию: С>B>A и E>C>D (A и D) и (B и D) не имеют общих столбцов, поэтому порядок рисования не всегда важен. E>C>B>A С>D значит, рисовать можно в таком порядке: А,В,D,C,E Проще говоря, у нас есть массив элементов, который надо упорядочить. При сравнении любых двух мы получаем один их 3 вариантов ответа - "больше", "меньше" или "не имеет значения" UPD: для варианта "не имеет значения" можно придумать критерий сравнения, чтобы в результате получать ответы вида (А>B) или (A<B) и сортировать стандартными методами |
Ответ: Изометрия
Хранить списки объектов для прорисовки разбитые по глубинам (в данном случае - видимом Y клеток).
То есть при передвижении объекта проверяется, не перешел ли он на новую "глубину", и если так, то он перебрасывается в нужный список либо сразу, либо в конце кадра (тогда добавляется "список заданий" смены глубины объектов). В JavaScript-"каркасе" (движке) Tululoo такой принцип используется для общей организации сортировки по глубине. Так как исходный код JS части "открыт", и имеет нехитрые условия использования, ничто не мешает с ним ознакомится. |
Ответ: Изометрия
Я тоже задумался об отдельном списке тайлов на вывод с сортировкой по глубине, надо правильно эту глубину посчитать
|
Ответ: Изометрия
Цитата:
Код:
depth = -z - y * maxz z - поднятость "над уровнем земли" (для много-этажных блоков, прочего). y - "видимая" координата по вертикали (насколько вниз по экрану отдален объект\клетка). Логичным было бы считать это лишь с точностью до половины вертикального размера изометрической клетки (т.е. по 2 значения y на каждую "строку" клеток). maxz - "лимит" значений z (т.е. если z = 0..255, maxz = 256). Так же можно заменить уножение на сдвиг в сторону старших разрядов для малой оптимизации. |
Ответ: Изометрия
Вложений: 1
Никак не могу нормально отсечь углы на изометрической карте, типо так должно быть:
Проблема в том, что массив сам по себе 200*200*5 и сравнивать ооочень накладно. Я просчитал минимальный ромб, который попадает в экран, но углы занимают сравнимую с ним площадь (рисую 200 тайлов в экран, и 200 за него - нагрузочно ) пытался сделать так: PHP код:
Вложение 20750 как нормально математически отсечку сделать? |
Ответ: Изометрия
Сделай функции перевода из изометрической в прямоугольную систему и наоборот. Тогда сможешь юзать логику прямоугольной, а затем переводить в изометрию.
|
Ответ: Изометрия
screenToIso и isoToScreen - перевод координат, но рисуется ведь ромб на прямоугольник, пока мы переведем и все координаты ромба в мировые и проверим их вхождение, то пройдет 200000 интераций в одном вызове draw, я знаю что можно математически отсечь лишнии интерпции, уменьшая пределы одного из циклов(это как интеграл считать,только я запутался с пределами)
|
Ответ: Изометрия
Ты меня, видимо, не так понял.
Вот, что я имел ввиду: https://dl.dropboxusercontent.com/u/...iso/index.html |
Ответ: Изометрия
Ну так это есть, я спросил про оптимизацию отрисовки
|
Ответ: Изометрия
А тебе обязательно ромбическая карта? Можно хранить карту в виде двухмерного массива, в котором чередуются ряды со смещением (метод zigzag).
Тогда нарисовать квадратную область можно довольно просто. Для ромбической карты придется использовать массив с высотой и шириной равный диагонали ромбической карты. Собственно ты можешь хранить копию карты в двух массивах для вычислений и отрисовки... правда это потребует больше памяти. |
Часовой пояс GMT +4, время: 19:18. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot