Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 14.05.2012, 14:49   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Изометрия

В общем нарисовал я статическую изометрическую карту. Дело дошло до перемещаемых объектов и я застрял.
Поделитесь мнением, как правильно отрисовывать карту с динамически перемещаемыми объектами. Простой способ по матрице походу уже не подходит... наверное надо как-то все видимые тайлы сортировать по глубине?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 14.05.2012, 14:58   #2
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Изометрия

насколько мне помнится, самый простой способ сортировки в изометрии это по вертикальной экранной оси. объект ниже всегда перекрывает объект выше (такова изометрия), я делал так, вроде всё ок работало.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (14.05.2012)
Старый 14.05.2012, 15:14   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Изометрия

А относительно каких точек сравнивать положения объектов?

Мой первый тест - выделение от курсора двигается на 1 клетку, на 0,5 смещаются координаты на другую клетку и она проявляется.
http://shgames.ru/unity/marbels/

В идеале я хочу иметь возможность создания карт по сложности похожих на OTTD http://open.ttdrussia.net/ но это мечта, для начала хватит простых возможностей.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 14.05.2012, 16:00   #4
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Изометрия

А относительно каких точек сравнивать положения объектов?
я сравнивал центры.
а вообще чего бы тебе не рендерить честное 3д с з-буффером в изометрии?
может на землю юзать 3д, а шарики обычными спрайтами, ориентированными на камеру?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (14.05.2012)
Старый 14.05.2012, 16:05   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Изометрия

Так оно проще, но это не путь самурая) Если не смогу решить в ближайшие дни эту проблему, то может так и поступлю, но не хотелось бы.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 14.05.2012, 21:46   #6
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: Изометрия

карт по сложности похожих на OTTD
Мне кажется, там всё по клеточкам.
Будем считать, что А<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) и сортировать стандартными методами
Миниатюры
Нажмите на изображение для увеличения
Название: pri.png
Просмотров: 1128
Размер:	10.0 Кб
ID:	16858  
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (15.05.2012)
Старый 14.05.2012, 21:58   #7
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
Ответ: Изометрия

Хранить списки объектов для прорисовки разбитые по глубинам (в данном случае - видимом Y клеток).
То есть при передвижении объекта проверяется, не перешел ли он на новую "глубину", и если так, то он перебрасывается в нужный список либо сразу, либо в конце кадра (тогда добавляется "список заданий" смены глубины объектов).
В JavaScript-"каркасе" (движке) Tululoo такой принцип используется для общей организации сортировки по глубине.
Так как исходный код JS части "открыт", и имеет нехитрые условия использования, ничто не мешает с ним ознакомится.
__________________

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (15.05.2012)
Старый 15.05.2012, 08:37   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Изометрия

Я тоже задумался об отдельном списке тайлов на вывод с сортировкой по глубине, надо правильно эту глубину посчитать
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 15.05.2012, 22:29   #9
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений
(для 219 пользователей)
Ответ: Изометрия

Сообщение от pax Посмотреть сообщение
Я тоже задумался об отдельном списке тайлов на вывод с сортировкой по глубине, надо правильно эту глубину посчитать
Формула просчета глубины объекта\ячейки, для системы что рисует от наибольшей глубины к наименьшей, выглядит как
depth = -z - y * maxz
Где,
z - поднятость "над уровнем земли" (для много-этажных блоков, прочего).
y - "видимая" координата по вертикали (насколько вниз по экрану отдален объект\клетка). Логичным было бы считать это лишь с точностью до половины вертикального размера изометрической клетки (т.е. по 2 значения y на каждую "строку" клеток).
maxz - "лимит" значений z (т.е. если z = 0..255, maxz = 256).
Так же можно заменить уножение на сдвиг в сторону старших разрядов для малой оптимизации.
__________________

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (16.05.2012)
Старый 25.07.2014, 19:32   #10
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Хорошо Ответ: Изометрия

Никак не могу нормально отсечь углы на изометрической карте, типо так должно быть:



Проблема в том, что массив сам по себе 200*200*5 и сравнивать ооочень накладно.
Я просчитал минимальный ромб, который попадает в экран, но углы занимают сравнимую с ним площадь (рисую 200 тайлов в экран, и 200 за него - нагрузочно )

пытался сделать так:
--минимальные и максимальные значения индексов рисуемого массива (минимальный ромб)
fromI,_=screenToIso(0,0
toI,_=screenToIso(SW,SH)
dx,fromJ=screenToIso(SW,0)
_,toJ=screenToIso(0,SH)

dx math.abs(dx fromI) --длина от вершины ромба до угла экрана (по x в изо)
lx math.abs(toI-fromI) -- кол-во элементов в грани ромба

for i=fromI,toI do

        
local sY dx-i
        local eY 
-(lx dx)             
        if(
i>dxthen sY i-dx end
        
if(i>lx-dxthen eY = (lx-dx)-i end
         
        
for j=fromJ+sYtoJ eY do
             --
отрисовка
       end  
end 
но почему-то рисуемая область не смещается при скролинге в право и вверх, а только в лево и вниз (screenToIso учитывает скролл карты)

Нажмите на изображение для увеличения
Название: print.png
Просмотров: 1380
Размер:	95.0 Кб
ID:	20750

как нормально математически отсечку сделать?
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 25.07.2014, 21:40   #11
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Изометрия

Сделай функции перевода из изометрической в прямоугольную систему и наоборот. Тогда сможешь юзать логику прямоугольной, а затем переводить в изометрию.
(Offline)
 
Ответить с цитированием
Старый 26.07.2014, 07:13   #12
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Изометрия

screenToIso и isoToScreen - перевод координат, но рисуется ведь ромб на прямоугольник, пока мы переведем и все координаты ромба в мировые и проверим их вхождение, то пройдет 200000 интераций в одном вызове draw, я знаю что можно математически отсечь лишнии интерпции, уменьшая пределы одного из циклов(это как интеграл считать,только я запутался с пределами)
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 26.07.2014, 22:03   #13
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Изометрия

Ты меня, видимо, не так понял.
Вот, что я имел ввиду:
https://dl.dropboxusercontent.com/u/...iso/index.html
(Offline)
 
Ответить с цитированием
Старый 27.07.2014, 06:48   #14
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Изометрия

Ну так это есть, я спросил про оптимизацию отрисовки
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 27.07.2014, 10:52   #15
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Изометрия

А тебе обязательно ромбическая карта? Можно хранить карту в виде двухмерного массива, в котором чередуются ряды со смещением (метод zigzag).



Тогда нарисовать квадратную область можно довольно просто. Для ромбической карты придется использовать массив с высотой и шириной равный диагонали ромбической карты.
Собственно ты можешь хранить копию карты в двух массивах для вычислений и отрисовки... правда это потребует больше памяти.

Если захочешь потом хексы, то их тоже так рисовать можно:
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 16:22.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com