Коротка версія
Чи існує модель дизайну для розповсюдження етикеток транспортних засобів без перекриття, розміщуючи їх якомога ближче до транспортного засобу, на який вони посилаються? Якщо ні, чи є метод, який я пропоную, життєздатним? Як би ти це реалізував сам?
Розширена версія
У грі, яку я пишу, у мене спостерігається пташине бачення мого повітряного транспорту. Я також маю поруч із кожним із транспортних засобів невелику етикетку з ключовими даними про транспортний засіб. Це фактичний знімок екрана:
Тепер, оскільки транспортні засоби могли літати на різній висоті, їх значки можуть перекриватися. Однак я хотів би, щоб їх етикетки ніколи не перекривались (або етикетка з транспортного засобу "A" перекривалась значком транспортного засобу "B").
В даний час я можу виявити зіткнення між спрайтами, і я просто відштовхую порушувальну мітку в напрямку, протилежному інакше перекритому спрайту . Це працює в більшості ситуацій, але коли повітряний простір стає переповненим, ярлик може відсунутись дуже далеко від свого транспортного засобу, навіть якщо була б інша «розумніша» альтернатива. Наприклад, я отримую:
B - label
A -----------label
C - label
де було б краще (= ярлик ближче до транспортного засобу) дістати:
B - label
label - A
C - label
EDIT: Також слід враховувати, що поруч із корпусом транспортних засобів, що перекриваються, можуть бути інші конфігурації, в яких етикетки транспортних засобів можуть перекриватися (приклади мистецтва ASCII показують, наприклад, три дуже близькі транспортні засоби, на яких етикетка A
перекриває піктограму B
і C
).
У мене є дві ідеї, як покращити теперішню ситуацію, але, перш ніж витрачати час на їх реалізацію, я подумав звернутися до громади за порадою (адже це здається "достатньо поширеною проблемою", щоб модель дизайну для неї могла існувати).
Для чого це варто, ось дві ідеї, про які я думав:
Слот-ізоляція простору етикетки
У цьому сценарії я б розділив весь екран на "прорізи" для міток. Тоді на кожному транспортному засобі завжди розміщуватиметься ярлик, розміщений у найближчому порожньому (порожній = немає інших спрайтів у цьому місці.
Спіральний пошук
З місця розташування транспортного засобу на екрані я б намагався розміщувати етикетку під збільшенням кутів, а потім при збільшенні радіусів, поки не буде знайдено місце, що не перекривається. Щось внизу:
try 0°, 10px
try 10°, 10px
try 20°, 10px
...
try 350°, 10px
try 0°, 20px
try 10°, 20px
...