LINUX.ORG.RU

Выбор юнита на тайловой карте

 , ,


0

1

Здравствуйте, господа.

Подскажите пожалуйста, как выбрать определённого юнита, расположенного на тайловой карте? Есть «лобовой» вариант перебирать массив юнитов и сравнивать координаты каждого юнита с координатами тайла, на котором находится курсор, но меня этот вариант не сильно устраивает, т.к. если на карте будет 100к юнитов, то перебор будет занимать очень много времени.

Буду крайне благодарен за советы и идеи. Спасибо.


100к

Не делай 100к юнитов.
Видишь, как всё просто?

mos ★★☆☆☆
()

Если на карте будет 100к юнитов, то софтина всё равно будет газировать малые водоёмы.

Но если тебе неймётся, то привязывай не только тайлы к юнитам, но и юниты к тайлам.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

Т.е. в структуру тайла добавить поле с индеком юнита, который сейчас находится на данном тайле?

ubik
() автор топика
Ответ на: комментарий от sehellion

Не может, т.к. collision detection :)

ubik
() автор топика
Ответ на: комментарий от ubik

Поле со списком юнитов. И да, при таком подходе, у тебя при каждом движении юнитов у тебя будут обновлятся эти списки быстрого доступа в тайлах. Так что все равно тормозить будет. Не делай 100k юнитов!

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

И да, при таком подходе, у тебя при каждом движении юнитов у тебя будут обновлятся эти списки быстрого доступа в тайлах.

А если прикрутить А* и формировать линкованный список из тайлов пути? Таким образом я отсекаю все ненужные тайлы и работаю только с теми, через которые будет проходить юнит. Ну, и делать там уже push/pop...

ubik
() автор топика
Ответ на: комментарий от ubik

У тебя 100k юнитов. Если каждый из них двигается в течении фрейма, на один тайл, то это в лучшем случае +100k операций на фрейм. Каждый фрейм.

Aswed ★★★★★
()
Ответ на: комментарий от ubik

Чтобы быстрее искать индекс тайла на котором живёт юнит.

mike666
()

Нужно игровой мир разделить на зоны. Обновлять, отрисовывать только те зоны, которые попадают во вьюпорт. Тест коллизии делать только в зоне куда попал курсор, игнорируя остальные.

andreyu ★★★★★
()
Ответ на: комментарий от Aswed

Не делай 100k юнитов!

Проблема не в 100К юнитов, а в их организации. Можно делать и большее количество юнитов, если памяти достаточно.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Нужно игровой мир разделить на зоны. Обновлять, отрисовывать только те зоны, которые попадают во вьюпорт.

Да. Таска на загрузку/выгрузку данных, которые попадают в камеру лежит в беклоге и ждёт своего часа :)

ubik
() автор топика

Юнит одновременно может находится только на одном тайле? Тогда это фактически его целочисленные координаты. Держи словарь, который отображает эти целочисленные координаты в объект юнита, по нему и ищи.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Словарь? Ты имеешь в виду реализацию hash map'a?

Я тут поигрался в сендбоксе, вроде работает

gcc -g3 -Wall -Wpedantic -Wextra sandbox.c -o sandbox && ./sandbox 
sandbox.c:12:1: warning: useless storage class specifier in empty declaration
 };
 ^
sandbox.c:17:1: warning: useless storage class specifier in empty declaration
 };
 ^
sandbox.c: In function 'main':
sandbox.c:36:19: warning: variable 'tp' set but not used [-Wunused-but-set-variable]
     struct Tile (*tp)[MAP_H][MAP_W];
                   ^~
Tile 1 x 1 contains unit Anderson
Tile 2 x 2 contains unit Hyianderson

ubik
() автор топика
Ответ на: комментарий от ubik

Словарь? Ты имеешь в виду реализацию hash map'a?

Словарь — концепция структуры данных, позволяющей отобразить одни значения в другие. Что уж там будет в реализации, hash map, дерево или просто массив — дело реализации.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.